分片集群搭建及扩容
整体架构
环境准备
- 3台Linux虚拟机,准备MongoDB环境,配置环境变量。
- 一定要版本一致(重点),当前使用 version4.4.9
配置域名解析
在3台虚拟机上执行以下命令,注意替换实际 IP 地址
echo "192.168.65.97 mongo1 mongo01.com mongo02.com" >> /etc/hostsecho "192.168.65.190 mongo2 mongo03.com mongo04.com" >> /etc/hostsecho "192.168.65.200 mongo3 mongo05.com mongo06.com" >> /etc/hosts
准备分片目录
在各服务器上创建数据目录,我们使用 `/data`,请按自己需要修改为其他目录:
在mongo01.com / mongo03.com / mongo05.com 上执行以下命令:
mkdir -p /data/shard1/db /data/shard1/log /data/config/db /data/config/log
在mongo02.com / mongo04.com / mongo06.com 上执行以下命令:
mkdir -p /data/shard2/db /data/shard2/log /data/mongos/
创建第一个分片用的复制集
在mongo01.com / mongo03.com / mongo05.com 上执行以下命令:
mongod --bind_ip 0.0.0.0 --replSet shard1 --dbpath /data/shard1/db \--logpath /data/shard1/log/mongod.log --port 27010 --fork \--shardsvr --wiredTigerCacheSizeGB 1
--shardsvr 声明这是集群的一个分片
--wiredTigerCacheSizeGB 设置内存大小
初始化第一个分片复制集
# 进入mongo shellmongo mongo01.com:27010#shard1复制集节点初始化rs.initiate({_id: "shard1","members" : [{"_id": 0,"host" : "mongo01.com:27010"},{"_id": 1,"host" : "mongo03.com:27010"},{"_id": 2,"host" : "mongo05.com:27010"}]})#查看复制集状态rs.status()
创建 config server 复制集
在mongo01.com / mongo03.com / mongo05.com上执行以下命令:
mongod --bind_ip 0.0.0.0 --replSet config --dbpath /data/config/db \--logpath /data/config/log/mongod.log --port 27019 --fork \--configsvr --wiredTigerCacheSizeGB 1
初始化 config server 复制集
# 进入mongo shellmongo mongo01.com:27019#config复制集节点初始化rs.initiate({_id: "config","members" : [{"_id": 0,"host" : "mongo01.com:27019"},{"_id": 1,"host" : "mongo03.com:27019"},{"_id": 2,"host" : "mongo05.com:27019"}]})
搭建 mongos
在mongo01.com / mongo03.com / mongo05.com上执行以下命令:
#启动mongos,指定config复制集mongos --bind_ip 0.0.0.0 --logpath /data/mongos/mongos.log --port 27017 --fork \--configdb config/mongo01.com:27019,mongo03.com:27019,mongo05.com:27019
mongos加入第1个分片
# 连接到mongosmongo mongo01.com:27017#添加分片 mongos>sh.addShard("shard1/mongo01.com:27010,mongo03.com:27010,mongo05.com:27010")#查看mongos状态mongos>sh.status()
创建分片集合
连接到mongos, 创建分片集合mongo mongo01.com:27017mongos>sh.status()#为了使集合支持分片,需要先开启database的分片功能mongos>sh.enableSharding("company")# 执行shardCollection命令,对集合执行分片初始化mongos>sh.shardCollection("company.emp", {_id: 'hashed'})mongos>sh.status()#插入测试数据use companyfor (var i = 0; i < 10000; i++) {db.emp.insert({i: i});}#查询数据分布db.emp.getShardDistribution()
创建第2个分片的复制集
在mongo02.com / mongo04.com / mongo06.com上执行以下命令:
mongod --bind_ip 0.0.0.0 --replSet shard2 --dbpath /data/shard2/db \--logpath /data/shard2/log/mongod.log --port 27011 --fork \--shardsvr --wiredTigerCacheSizeGB 1
初始化第二个分片的复制集
# 进入mongo shellmongo mongo06.com:27011#shard2复制集节点初始化rs.initiate({_id: "shard2","members" : [{"_id": 0,"host" : "mongo06.com:27011"},{"_id": 1,"host" : "mongo02.com:27011"},{"_id": 2,"host" : "mongo04.com:27011"}]})#查看复制集状态rs.status()
mongos加入第2个分片
# 连接到mongosmongo mongo01.com:27017#添加分片 mongos>sh.addShard("shard2/mongo02.com:27011,mongo04.com:27011,mongo06.com:27011")#查看mongos状态mongos>sh.status()