作为忠实的MongoDB fan,有幸陪伴MongoDB的一路成长。目前,MongoDB 4.2版本已经发布,MongoDB 4.2版本的
分片集群搭建,网上的资料也很多很全,但是,对于与MongoDB 3.6以下版本如3.4版本区别还是挺大,网上诸如4.2和3.4分片集群的搭建对比比较少。这里特此记录下自己部署MongoDB3.4和MongoDB 4.2的一些区别。我的MongoDB 4.2分片集群部署过程不是官方标准,仅仅拿来不同版本间分片集群部署的一些区别,仅供参考。
1、配置信息
关于MongoDB3.4和MongoDB4.2部署分片集群的配置,我用的都是3台机器,部署两个数据分片、一个配置副本集,
三个mongos进程。各个机器的角色分配如下(以为MongoDB三台主机均是通过VM克隆,主机名我没修改,担不妨碍分
片集群的部署):
192.168.192.153 centos7 mongodb1 #firstset primary,secondset secondary,config selectself
192.168.192.154 mongodb2 #firstset ARBITER,secondset primary,config selectself
192.168.192.155 mongodb3 #firstset secondary,secondset ARBITER,config selectself
2、安装目录规划
注意:相关的文件夹路径需要事先创建并且设置好权限,否则mongd进程将无法启动
--basedir相同
--3.4
/home/mongo/mongodb3.4
--4.2
/home/mongo/mongodb4.2
--mongodb1
mkdir -p /opt/mongo/data/repset1
mkdir -p /opt/mongo/logs/firstset/
mkdir -p /opt/mongo/data/repset2
mkdir -p /opt/mongo/logs/secondset/
mkdir -p /opt/mongo/data/config/
mkdir -p /opt/mongo/logs/config/
mkdir -p /opt/mongo/logs/mongos/
--mongodb2
mkdir -p /opt/mongo/data/arbiter1
mkdir -p /opt/mongo/logs/arbiter1
mkdir -p /opt/mongo/data/repset2
mkdir -p /opt/mongo/logs/secondset/
mkdir -p /opt/mongo/data/config/
mkdir -p /opt/mongo/logs/config/
mkdir -p /opt/mongo/logs/mongos/
--mongodb3
mkdir -p /opt/mongo/data/repset1
mkdir -p /opt/mongo/logs/firstset/
mkdir -p /opt/mongo/data/arbiter2
mkdir -p /opt/mongo/logs/aribter2/
mkdir -p /opt/mongo/data/config/
mkdir -p /opt/mongo/logs/config/
mkdir -p /opt/mongo/logs/mongos/
3、MongoDB分片集群的三个副本集启动mongod实例
注意:为了方便对比,我这里使用最少参数,直接命令行列出来使用到的参数
--3.4
#mongodb1
mongod --dbpath /opt/mongo/data/repset1 --port 10001 --replSet firstset --oplogSize 512 --rest --fork --logpath /opt/mongo/logs/firstset/firstset.log --logappend --nojournal --directoryperdb
mongod --configsvr --dbpath /opt/mongo/data/config --replSet csvr--port 20001 --fork --logpath /opt/mongo/logs/config/config.log --logappend
mongod --dbpath /opt/mongo/data/repset2 --port 30001 --replSet secondset --oplogSize 512 --rest --fork --logpath /opt/mongo/logs/secondset/secondset.log --logappend --nojournal --directoryperdb
#mongodb2
mongod --dbpath /opt/mongo/data/repset1 --port 10001 --replSet firstset --oplogSize 512 --rest --fork --logpath /opt/mongo/logs/firstset/firstset.log --logappend --nojournal --directoryperdb
mongod --configsvr --dbpath /opt/mongo/data/config --replSet csvr--port 20001 --fork --logpath /opt/mongo/logs/config/config.log --logappend
mongod --dbpath /opt/mongo/data/repset2 --port 30001 --replSet secondset --oplogSize 512 --rest --fork --logpath /opt/mongo/logs/secondset/secondset.log --logappend --nojournal --directoryperdb
#mongodb3
mongod --dbpath /opt/mongo/data/arbiter1 --port 10001 --replSet firstset --oplogSize 512 --rest --fork --logpath /opt/mongo/logs/dns_aribter1/aribter1.log --logappend --nojournal --directoryperdb
mongod --configsvr --dbpath /opt/mongo/data/config --replSet csvr --port 20001 --fork --logpath /opt/mongo/logs/config/config.log --logappend
mongod --dbpath /opt/mongo/data/arbiter2 --port 30001 --replSet secondset --oplogSize 512 --rest --fork --logpath /opt/mongo/logs/aribter2/aribter2.log --logappend --nojournal --directoryperdb
--4.2
#mongodb1
mongod --dbpath /opt/mongo/data/repset1 --port 10001 --shardsvr --replSet firstset --oplogSize 512 --bind_ip 0.0.0.0 --fork --logpath /opt/mongo/logs/firstset/firstset.log --logappend --journal --directoryperdb
mongod --dbpath /opt/mongo/data/repset2 --port 30001 --replSet secondset --oplogSize 512 --shardsvr --fork --bind_ip 0.0.0.0 --logpath /opt/mongo/logs/secondset/secondset.log --logappend --journal --directoryperdb
mongod --configsvr --dbpath /opt/mongo/data/config --replSet csvr --port 20001 --bind_ip 0.0.0.0 --fork --logpath /opt/mongo/logs/config/config.log --logappend
#mongodb2
mongod --dbpath /opt/mongo/data/arbiter1 --port 10001 --shardsvr --replSet firstset --oplogSize 512 --bind_ip 0.0.0.0 --fork --logpath /opt/mongo/logs/arbiter1/arbiter1.log --logappend --journal --directoryperdb
mongod --dbpath /opt/mongo/data/repset2 --port 30001 --replSet secondset --oplogSize 512 --shardsvr --fork --bind_ip 0.0.0.0 --logpath /opt/mongo/logs/secondset/secondset.log --logappend --journal --directoryperdb
mongod --configsvr --dbpath /opt/mongo/data/config --replSet csvr --port 20001 --bind_ip 0.0.0.0 --fork --logpath /opt/mongo/logs/config/config.log --logappend
#mongodb3
mongod --dbpath /opt/mongo/data/repset1 --port 10001 --shardsvr --replSet firstset --oplogSize 512 --bind_ip 0.0.0.0 --fork --logpath /opt/mongo/logs/firstset/firstset.log --logappend --journal --directoryperdb
mongod --dbpath /opt/mongo/data/arbiter2 --port 30001 --replSet secondset --oplogSize 512 --shardsvr --fork --bind_ip 0.0.0.0 --logpath /opt/mongo/logs/aribter2/aribter2.log --logappend --journal --directoryperdb
mongod --configsvr --dbpath /opt/mongo/data/config --replSet csvr --port 20001 --bind_ip 0.0.0.0 --fork --logpath /opt/mongo/logs/config/config.log --logappend
通过3.4和4.2的mongod实例启动参数,发现:
a、3.4--rest在4.2中已经废弃,4.2中会提示该参数不识别
b、3.4可以不开journal日志,但是4.2中如果以replSet参数启动,则必须开启journal日志,即使用参数--journal
c、3.4不要求mongod进程启动使用--bind_ip绑定IP,但是,4.2的mongod进程必须指定--bind_ip限制mongod连接的ip,
否则,4.2的mongd进程启动后将拒绝除127.0.0.1外的其他所有IP发起的连接请求
d、4.2集群副本集分片集群要求使用--shardsvr参数,否则,在mongos进程注册副本集分片时将报错并提示mongod必须
指定--shardsvr参数
4、两个副本集初始化及配置库副本集初始化
--分片1副本集,3.4可在任意节点进行分片1副本集的初始化,但是4.2分片1副本集初始化不能在仲裁节点进行,否则报错
提示所在节点不可选举,且4.2分片1副本集初始化在集群哪个节点进行,哪个节点将成为主节点,priority参数和_id不起作
用。
#三个节点中规划的分片1副本集数据主节点1,即mongodb1
mongo --port 10001
config={_id:"firstset",members:[]}
config.members.push({_id:0,host:"192.168.192.153:10001",priority:1})
config.members.push({_id:2,host:"192.168.192.154:10001",arbiterOnly:true})
config.members.push({_id:1,host:"192.168.192.155:10001",priority:2})
rs.initiate(config);
--分片2副本集,3.4可在任意节点进行分片1副本集的初始化,但是4.2分片2副本集初始化不能在仲裁节点进行,否则报错
提示所在节点不可选举,且4.2分片2副本集初始化在集群哪个节点进行,哪个节点将成为主节点,priority参数和_id不起作
用。
#三个节点中规划的分片2副本集数据主节点2,即mongodb2
mongo --port 30001
config={_id:"secondset",members:[]}
config.members.push({_id:0,host:"192.168.192.153:30001",priority:1})
config.members.push({_id:1,host:"192.168.192.154:30001",priority:2})
config.members.push({_id:2,host:"192.168.192.155:30001",arbiterOnly:true})
rs.initiate(config);
--配置库副本集3.4和4.2没有区别,副本集内部会自动选举副本集的主节点
#集群任意节点
mongo --port 20001
rs.initiate( {
_id : "csvr",
configsvr: true,
members: [
{ _id: 0, host: "192.168.192.153:20001" },
{ _id: 1, host: "192.168.192.154:20001" },
{ _id: 2, host: "192.168.192.155:20001" }
]
});
5、启动三个节点的mongos进程
--3.4
mongos --configdb 192.168.192.153:20001,192.168.192.154:20001,192.168.192.155:20001 --port 27017 --fork --logpath /opt/mongo/logs/mongos/mongos.log --logappend
--4.2
mongos --configdb csvr/192.168.192.154:20001,192.168.192.153:20001,192.168.192.155:20001 --bind_ip 0.0.0.0 --port 27017 --fork --logpath /opt/mongo/logs/mongos/mongos.log --logappend
mongos在3.4和4.2的启动时区别是参数--bind_ip,3.4不指定--bind_id也不限制mongos进程的连接请求,但是3.4会拒绝
除127.0.0.1和--bind_ip指定的IP外的其他IP的请求
6、分片集群的注册
--3.4和4.2没有区别
#集群三个节点任意节点即可
mongo --port 27017
use admin
db.runCommand( { addShard : "firstset/192.168.192.153:10001,192.168.192.154:10001,192.168.192.155:10001" } )
db.runCommand( { addShard : "secondset/192.168.192.153:30001,192.168.192.154:30001,192.168.192.155:30001" })
7、设置分片库和集合
mongo --port 27017
use admin
sh.enableSharding("testdb");
db.runCommand({"shardcollection":"testdb.test_collection","key":{"name":1}});
--批量插入数据
var arr=[];
for(var i=0;i<2000000;i++){
var uid = i;
var name = "mongodb"+i;
arr.push({"id":uid,"name":name});
}
db.users.insertMany(arr);
8、其他一些区别发现
a、3.4 在使用sh.status()时会自动详细展示分片库分片集合的数据分布,但是4.2需要指定参数verbose
b、3.4查看副本集副本数据时要执行rs.slaveOk(),4.2查看副本集副本数据时要执行rs.secondaryOk();
关于mongodb 3.4和4.2其他使用或者特性上的区别,请读者亲自实验慢慢发现吧~~