mongodb分片模型图
mongodb将大量的数据文件进行切割,将切割的数据块分别保存到不同的片上,其中每个片为一个副本集,而对外通过mongos提供统一接口,用户实际上感觉不到内部分片机制。
ReplicaSet(副本集): mongodb集群的一种实现方式,该副本集由一台活跃Mongodb服务器(节点)和两台非活跃Mongodb服务器(节点)组成,其中活跃节点会由Mongodb自动选举产生,数据插入在活跃节点,备份到非活跃节点,默认非活跃节点不可进行读写操作,可配置在非活跃节点进行读操作。
Mongos: mongo路由器,对外屏蔽内部数据存储,客户端只需要连接mongos,mongos会根据实际情况将操作分发到不同的片(Replica Set)
shard: 存储数据的节点,可以是单个mongod或者副本集
环境说明&机器规划
操作系统:CentOS7.6
MongoDB:v3.6.11
首先确定各个组件的数量,mongos 3个, config server 3个,数据分3片 shard server 3个,每个shard 有一个副本一个仲裁也就是 3 * 2 = 6 个,总共需要部署15个实例。这里使用三台机器进行测试,机器规划如下图所示:
集群搭建
1.创建目录
在每台机器上分别创建mongos 、config 、 shard1 、shard2、shard3
对应目录:
mkdir -p /data/db/{shard1,shard2,shard3}
mkdir -p /data/configdb
mkdir -p /data/logs
chown -R mongod.mongod /data/configdb/
chown -R mongod.mongod /data/logs/
chown -R mongod.mongod /data/db
# tree /data/
/data/
├── configdb
├── db
│ ├── shard1
│ ├── shard2
│ └── shard3
└── logs
6 directories, 0 files
2.配置shard server(分片服务)
(1)在每台机器上分别启动副本集成员:
mongod --shardsvr --replSet shard1 --port 27018 --dbpath /data/db/shard1/ --logpath /data/logs/shard1.log --bind_ip_all --logappend --fork
mongod --shardsvr --replSet shard2 --port 27019 --dbpath /data/db/shard2/ --logpath /data/logs/shard2.log --bind_ip_all --logappend --fork
mongod --shardsvr --replSet shard3 --port 27020 --dbpath /data/db/shard3/ --logpath /data/logs/shard3.log --bind_ip_all --logappend --fork
(2)创建副本集并初始化:
复制集通过replSetInitiate
命令(或mongo shell的rs.initiate()
)进行初始化
在设置mongodb副本集时,Primary节点,second节点,仲裁节点,有可能资源配置(CPU或者内存)不均衡,所以要求某些节点不能成为Primary。我们知道mongodb的设置:
- 除了仲裁节点,其他每个节点都有个优先权,可以手动设置优先权来决定谁的成为primay的权重最大。
- 副本集中通过设置priority的值来决定优先权的大小,这个值的范围是0–100,值越大,优先权越高。
- 默认的值是1,rs.conf是不显示的;如果值是0,那么不能成为primay。
登录成员主节点,设置节点成员:
192.168.20.215:
# mongo --port 27018
> config={_id:"shard1",members:[{_id:0,host:"192.168.20.215:27018",priority:2},{_id:1,host:"192.168.20.216:27018"},{_id:2,host:"192.168.20.217:27018",arbiterOnly:1}]}
> rs.initiate(config)
192.168.20.216:
# mongo --port 27019
> config={_id:"shard2",members:[{_id:0,host:"192.168.20.215:27019"},{_id:1,host:"192.168.20.216:27019",priority:2},{_id:2,host:"192.168.20.217:27019",arbiterOnly:1}]}
> rs.initiate(config)
192.168.20.217:
# mongo --port 27020
> config={_id:"shard3",members:[{_id:0,host:"192.168.20.215:27020",arbiterOnly:1},{_id:1,host:"192.168.20.216:27020"},{_id:2,host:"192.168.20.217:27020",priority:2}]}
> rs.initiate(config)
replSetInitiate命令:
> db.runCommand({"replSetInitiate":{"_id":"shard1","members":[{_id:0,host:"192.168.20.215:27018",priority:2},{_id:1,host:"192.168.20.216:27018"},{_id:2,host:"192.168.20.217:27018",arbiterOnly:1}]}})
3.配置config server
(1)在每一台服务器分别启动配置服务器:
mongod --configsvr --replSet cfgReplSet --port 27016 --dbpath /data/configdb/ --logpath /data/logs/config.log --bind_ip_all --logappend --fork
(2)连接到任意一台配置服务器上,创建配置服务器副本集
# mongo --port 27016
> rs.initiate({_id:"cfgReplSet",configsvr:true,members:[{_id:0,host:"192.168.20.215:27016"},{_id:1,host:"192.168.20.216:27016"},{_id:2,host:"192.168.20.217:27016"}]})
4.配置mongos
(1)在每台机上启动mongos路由服务
mongos --port 27017 --configdb cfgReplSet/192.168.20.215:27016,192.168.20.216:27016,192.168.20.217:27016 --logpath /data/logs/mongos.log --bind_ip_all --logappend --fork
(2)添加shards成员
- 1.连接到mongos
- 2.add shards
- 3.enable sharding
- 4.对一个集合进行分片
登录路由服务客户端,添加分片到集群:
# mongo #mongos启动的27017端口
mongos> use admin
mongos> db.runCommand({addshard:"shard1/192.168.20.215:27018,192.168.20.216:27018,192.168.20.217:27018"})
mongos> db.runCommand({addshard:"shard2/192.168.20.215:27019,192.168.20.216:27019,192.168.20.217:27019"})
mongos> db.runCommand({addshard:"shard3/192.168.20.215:27020,192.168.20.216:27020,192.168.20.217:27020"})
开启数据库的分片功能
mongos> use admin
mongos> db.runCommand({enablesharding:"mydb1"})
开启集合的分片功能:
mongos> use admin
mongos> db.runCommand({shardcollection:"mydb1.user",key:{userid:"hashed"}})
验证
1.查看分片db.shards.find()
:
mongos> use config
switched to db config
mongos> db.shards.find()
{ "_id" : "shard1", "host" : "shard1/192.168.20.215:27018,192.168.20.216:27018", "state" : 1 }
{ "_id" : "shard2", "host" : "shard2/192.168.20.215:27019,192.168.20.216:27019", "state" : 1 }
{ "_id" : "shard3", "host" : "shard3/192.168.20.216:27020,192.168.20.217:27020", "state" : 1 }
2.查看集合状态db.collectionName.status()
:
mongos> use mydb1
mongos> db.user.stats()
3.查看分片信息db.printShardingStatus()
:
4.插入数据测试:
mongos> use mydb1
mongos> for(i=0;i<100000;i++){db.user.insert({userid:i})}