文章永久连接:https://tech.souyunku.com/?p=3685
分片 ( sharing) 是实现 MongoDB 集群的另一种方式,它可以满足日益增长的 MongoDB 数据量的需求
海量的数据使得单台 MongoDB 存储显得吃力且难以满足提供可接受的读写吞吐量
通过将数据分割到多台服务器就变得越来越重要,使得 MongoDB 数据库系统能存储和处理更多的数据
为什么使用分片
1、 复制所有的写入操作到主节点
2、 延迟的敏感数据会在主节点查询
3、 单个副本集限制在12个节点
4、 当请求量巨大时会出现内存不足
5、 本地磁盘不足
6、 垂直扩展价格昂贵
MongoDB分片
下图展示了 MongoDB 分片集群结构分布
MongoDB 分片集群技术主要有三个组件
1、 Shard Server
用于存储实际的数据块
一个 shard server 角色可由几台机器组一个负载均衡承担,防止主机单点故障
2、 Config Server
mongod 实例,存储了整个 Cluster Metadata,包括 chunk 信息
3、 Query Routers
前端路由
客户端由此接入,且让整个集群看上去像单一数据库
MongoDB 分片技术搭建范例
假设 MongoDB 分片集群结构组件如下所示
Shard Server
Shard Server 1:localhost:27020
Shard Server 2:localhost:27021
Shard Server 3:localhost:27022
Shard Server 4:localhost:27023
Config Server
Config Server :localhost:27100
Query Routers Server
Route Process:localhost:40000
MongoDB 分片集群搭建步骤
1、 启动 Shard Server
[root@localhost ~]# mkdir -p /mnt/data/www/mongodb/shared/s0
[root@localhost ~]# mkdir -p /mnt/data/www/mongodb/shared/s1
[root@localhost ~]# mkdir -p /mnt/data/www/mongodb/shared/s2
[root@localhost ~]# mkdir -p /mnt/data/www/mongodb/shared/s3
[root@localhost ~]# mkdir -p /mnt/data/www/mongodb/shared/log
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# /usr/local/mongodb/bin/mongod --port 27020 --dbpath=/mnt/data/www/mongodb/shared/s0 --logpath=/mnt/data/www/mongodb/shared/log/s0.log --logappend --fork
[root@localhost ~]#
[root@localhost ~]# /usr/local/mongodb/bin/mongod --port 27021 --dbpath=/mnt/data/www/mongodb/shared/s1 --logpath=/mnt/data/www/mongodb/shared/log/s1.log --logappend --fork
[root@localhost ~]#
[root@localhost ~]# /usr/local/mongodb/bin/mongod --port 27022 --dbpath=/mnt/data/www/mongodb/shared/s2 --logpath=/mnt/data/www/mongodb/shared/log/s2.log --logappend --fork
[root@localhost ~]#
[root@localhost ~]# /usr/local/mongodb/bin/mongod --port 27023 --dbpath=/mnt/data/www/mongodb/shared/s3 --logpath=/mnt/data/www/mongodb/shared/log/s3.log --logappend --fork
2、 启动 Config Server
[root@localhost ~]# mkdir -p /mnt/data/www/mongodb/shared/config
[root@localhost ~]# /usr/local/mongodb/bin/mongod --port 27100 --dbpath=/mnt/data/www/mongodb/shared/config --logpath=/mnt/data/www/mongodb/shared/log/config.log --logappend --fork
**注意:** 我们可以像启动普通 mongodb 服务一样启动,不需要添加 —shardsvr 和 configsvr 参数,因为这两个参数的作用就是改变启动端口的,只要我们自行指定了端口就可以
3、 启动 Query Routers Server
[root@localhost ~]# /usr/local/mongodb/bin/mongos --port 40000 --configdb localhost:27100 --fork --logpath=/mnt/data/www/mongodb/shared/log/route.log --chunkSize 500
mongos 启动参数中,chunkSize 这一项是用来指定 chunk 的大小的,单位是 MB,默认大小为 200MB
4、 配置 Sharding
我们使用 MongoDB Shell 登录到 mongos ,添加 Shard 节点
[root@localhost ~]# /usr/local/mongodb/bin/mongo admin --port 40000
MongoDB shell version v3.4.9
connecting to: mongodb://127.0.0.1:40000/admin
MongoDB server version: 3.4.9
mongos> db.runCommand({ addshard:"localhost:27020" })
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> db.runCommand({ addshard:"localhost:27021" })
{ "shardAdded" : "shard0001", "ok" : 1 }
mongos> db.runCommand({ addshard:"localhost:27022" })
{ "shardAdded" : "shard0002", "ok" : 1 }
mongos> db.runCommand({ addshard:"localhost:27023" })
{ "shardAdded" : "shard0003", "ok" : 1 }
--------------------
mongos> db.runCommand({ enablesharding:"test" }) #设置分片存储的数据库
{ "ok" : 1 }
mongos> db.runCommand({ shardcollection: "test.log", key: { id:1,time:1}})
{ "collectionsharded" : "test.log", "ok" : 1 }
5、 程序代码内无需太大更改,直接按照连接普通的 mongo 数据库,但需要将数据库连接接入端口改为 40000
干货推荐
附录:MongoDB 教程:系列文章
- 一、MongoDB 基础教程
- 二、NoSQL 简介
- 三、什么是 MongoDB ?
- 四、Windows 平台安装 MongoDB
- 五、Linux 平台安装 MongoDB
- 六、Mac OSX 平台安装 MongoDB
- 七、MongoDB 术语
- 八、MongoDB -连接
- 九、MongoDB 创建数据库
- 十、MongoDB 切换数据库
- 十一、MongoDB 删除数据库
- 十二、MongoDB 备份数据( mongodump )
- 十三、MongoDB 插入文档
- 十四、MongoDB 更新文档
- 十五、MongoDB 删除文档
- 十六、MongoDB 删除集合
- 十七、MongoDB 查询文档
- 十八、MongoDB 条件操作符
- 十九、MongoDB $type操作符
- 二十、MongoDB 限制条数 (limit 方法)
- 二十一、MongoDB 跳过 (skip 方法)
- 二十二、MongoDB 排序
- 二十三、MongoDB 索引
- 二十四、MongoDB 聚合运算( aggregate )
- 二十五、MongoDB 聚合运算 – 管道
- 二十六、MongoDB 副本集群复制
- 【当前读到】二十七、MongoDB 分片集群技术
- 二十八、MongoDB 备份数据( mongodump )
- 二十九、MongoDB 恢复数据( mongorestore )
- 三十、MongoDB 性能跟踪 ( mongotop )
- 三十一、MongoDB 状态检测 ( mongostat )
- 三十二、MongoDB Java
- 三十三、MongoDB PHP 扩展
- 三十四、MongoDB PHP
- 三十五、PHP7 MongDB 扩展安装与使用
- 三十六、MongoDB 关系
- 三十七、MongoDB 数据库引用
- 三十八、MongoDB 覆盖索引查询
- 三十九、MongoDB 查询分析
- 四十、MongoDB 原子操作
- 四十一、MongoDB 高级索引
- 四十二、MongoDB 索引限制
- 四十三、MongoDB ObjectId
- 四十四、MongoDB Map Reduce
- 四十五、MongoDB 全文检索
- 四十六、MongoDB 正则表达式
- 四十七、MongoDB 管理工具: Rockmongo
- 四十八、MongoDB GridFS
- 四十九、MongoDB 固定集合(Capped Collections)
- 五十、MongoDB 自增 ID