ITPub博客

首页 > 数据库 > NoSQL > MongoDB 4.2分片集群搭建及与3.4分片集群搭建时的一些异同

MongoDB 4.2分片集群搭建及与3.4分片集群搭建时的一些异同

原创 NoSQL 作者:清风艾艾 时间:2020-11-02 21:43:10 0 删除 编辑

    作为忠实的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其他使用或者特性上的区别,请读者亲自实验慢慢发现吧~~


 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29357786/viewspace-2731738/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
个人喜欢IT行业,目前从事数据库工作,包括Oracle、mysql、mongodb、sqlserver等数据库的维护,喜欢专研开发技术,尤其对java程序的开发感兴趣。工作经历上,在中国联通系统集成公司、中公网医疗信息技术有限公司做过数据库技术支持;目前在海量数据,负责华东区oracle、mysql、mongodb的维护工作。

注册时间:2015-01-30

  • 博文量
    223
  • 访问量
    398686