MongoDB 4.2分片叢集搭建及與3.4分片叢集搭建時的一些異同

清風艾艾發表於2020-11-02

    作為忠實的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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章