MongoDB复制选举原理及复制集管理
一、MongoDB復(fù)制集的選舉原理
復(fù)制是基于操作日志oplog,相當(dāng)于MySQL中的二進制日志,只記錄發(fā)生改變的記錄。復(fù)制是將主節(jié)點的oplog日志同步應(yīng)用到其他從節(jié)點的過程。
復(fù)制集的節(jié)點是通過選舉產(chǎn)生的。節(jié)點類型分為標(biāo)準(zhǔn)節(jié)點、被動節(jié)點和仲裁節(jié)點。
(1)只有標(biāo)準(zhǔn)節(jié)點可能被選舉為活躍節(jié)點,有選舉權(quán)。被動節(jié)點有完整副本,不可能成為活躍節(jié)點,有選舉權(quán)。仲裁節(jié)點不復(fù)制數(shù)據(jù),不可能成為活躍節(jié)點,只有選舉權(quán)。
(2)priority值高者是標(biāo)準(zhǔn)節(jié)點,低者則為被動節(jié)點。
1.配置復(fù)制集的優(yōu)先級
配置4個節(jié)點的復(fù)制集,設(shè)置兩個標(biāo)準(zhǔn)節(jié)點,一個被動節(jié)點和一個仲裁節(jié)點。
> cfg={"_id":"kgcrs","members":[{"_id":0,"host":"192.168.113.177:27017","priority":100},{"_id":1,"host":"192.168.113.177:27018","priority":100},{"_id":2,"host":"192.168.113.177:27019","priority":0},{"_id":3,"host":"192.168.113.177:27020","arbiterOnly":true}]} > rs.initiate(cfg) //啟動復(fù)制集kgcrs:PRIMARY> rs.isMaster() //查看節(jié)點狀態(tài)2.在主節(jié)點上對數(shù)據(jù)進行操作,查詢oplog日志
kgcrs:PRIMARY> use kgckgcrs:PRIMARY> db.t1.insert({"id":1,"name":"tom"})kgcrs:PRIMARY> db.t1.insert({"id":2,"name":"jerry"})kgcrs:PRIMARY> db.t1.find()kgcrs:PRIMARY> db.t1.update({"id":2},{$set:{"name":"jack"}})kgcrs:PRIMARY> db.t1.remove({"id":1})在MongoDB的local數(shù)據(jù)庫中可以查看oplog日志。
kgcrs:PRIMARY> use localkgcrs:PRIMARY> show collectionsoplog.rs //顯示kgcrs:PRIMARY> db.oplog.rs.find()3.模擬主節(jié)點故障
如果主節(jié)點出現(xiàn)故障,另一個標(biāo)準(zhǔn)節(jié)點將會選舉成為新的主節(jié)點。
[root@localhost ~]# mongod -f /etc/mongod.conf --shutdown killing process with pid: 6653 [root@localhost ~]# mongo --port 27018 kgcrs:PRIMARY> rs.status()4.模擬所有標(biāo)準(zhǔn)節(jié)點都出現(xiàn)故障
如果所有標(biāo)準(zhǔn)節(jié)點都出現(xiàn)故障,被動節(jié)點也不能成為主節(jié)點。
[root@localhost ~]# mongod -f /etc/mongod2.conf --shutdown killing process with pid: 6685 [root@localhost ~]# mongo --port 27019 kgcrs:SECONDARY> rs.status()二、MongoDB復(fù)制集管理
復(fù)制集管理包括配置從節(jié)點可以讀取數(shù)據(jù)、查看復(fù)制集狀態(tài)信息、更改oplog大小、配置帶認證的復(fù)制集。
1.配置允許在從節(jié)點讀取數(shù)據(jù)。
默認MongoDB復(fù)制集的從節(jié)點不能讀取數(shù)據(jù),可以使用rs.slaveOk()命令允許能夠在從節(jié)點讀取數(shù)據(jù)。
重新啟動兩個標(biāo)準(zhǔn)節(jié)點,連接到復(fù)制集的其中一個從節(jié)點,配置其允許讀取數(shù)據(jù)。
mongod -f /etc/mongod.conf mongod -f /etc/mongod2.conf [root@localhost ~]# mongo --port 27018 kgcrs:SECONDARY> show dbs kgcrs:SECONDARY> rs.slaveOk() kgcrs:SECONDARY> show dbs2.查看復(fù)制狀態(tài)信息
可以使用rs.printReplicationInfo()和rs.printSlaveReplicationInfo()命令來查看復(fù)制集狀態(tài)。
kgcrs:SECONDARY> rs.help() kgcrs:SECONDARY> rs.printReplicationInfo() configured oplog size: 990MB log length start to end: 2974secs (0.83hrs) oplog first event time: Tue Jul 17 2018 14:36:27 GMT+0800 (CST) oplog last event time: Tue Jul 17 2018 15:26:01 GMT+0800 (CST) now: Tue Jul 17 2018 15:26:02 GMT+0800 (CST) kgcrs:SECONDARY> rs.printSlaveReplicationInfo() source: 192.168.113.177:27018syncedTo: Tue Jul 17 2018 15:26:11 GMT+0800 (CST)-10 secs (0 hrs) behind the primary source: 192.168.113.177:27019syncedTo: Tue Jul 17 2018 15:26:01 GMT+0800 (CST)0 secs (0 hrs) behind the primary kgcrs:SECONDARY>3.更改oplog大小
以修改從節(jié)點27018的oplog大小為例。
(1)先退出復(fù)制集,以單實例啟動
kgcrs:SECONDARY> use admin kgcrs:SECONDARY> db.shutdownServer()在配置文件注銷replication:相關(guān)啟動參數(shù),并修改port端口號27028
vim /etc/mongod2.conf# replication: # replSetName: kgcrsport: 27028:以單實例啟動27028節(jié)點
[root@localhost ~]# mongod -f /etc/mongod2.conf about to fork child process, waiting until server is ready for connections. forked process: 9954 child process started successfully, parent exiting(2)創(chuàng)建新的oplog記錄,配置其大小
全備當(dāng)前節(jié)點的所有oplog記錄
[root@localhost ~]# mongodump --port 27028 --db local --collection 'oplog.rs' 2018-07-17T15:54:20.600+0800 writing local.oplog.rs to 2018-07-17T15:54:20.604+0800 done dumping local.oplog.rs (364 documents)進入實例27028,創(chuàng)建新的oplog集合。
[root@localhost ~]# mongo --port 27028 > use local > db.oplog.rs.drop() > db.runCommand( { create: "oplog.rs", capped: true, size: (2 * 1024 * 1024 * 1024) } )重新把單實例27028加入復(fù)制集,修改配置文件
> use admin > db.shutdownServer() //關(guān)掉服務(wù)vim /etc/mongod2.confport: 27018 //端口號重新改回27018 replication:replSetName: kgcrsoplogSizeMB: 2048 //oplog的大小2048M重新啟動27018實例,并進入實例
[root@localhost ~]# mongod -f /etc/mongod2.conf about to fork child process, waiting until server is ready for connections. forked process: 10295 child process started successfully, parent exiting [root@localhost ~]# mongo --port 27018 kgcrs:SECONDARY>要使實例27018變成主節(jié)點,需要將主節(jié)點27017退出選舉。
[root@localhost ~]# mongo kgcrs:PRIMARY> rs.stepDown() //有效產(chǎn)生選舉 kgcrs:SECONDARY> [root@localhost ~]# mongo --port 27018 kgcrs:PRIMARY>4.部署認證的復(fù)制
(1)在主節(jié)點創(chuàng)建用戶認證
kgcrs:PRIMARY> use admin kgcrs:PRIMARY> db.createUser({"user":"root","pwd":"123","roles":["root"]})(2)編輯4個配置文件去設(shè)置密鑰文件
vim /etc/mongod.confsecurity:keyFile: /usr/bin/kgcrskey1clusterAuthMode: keyFile vim /etc/mongod2.conf vim /etc/mongod3.conf vim /etc/mongod4.conf(3)生成4個實例的密鑰文件,并設(shè)置權(quán)限
[root@localhost ~]# cd /usr/bin/[root@localhost bin]# echo "kgcrs key"> kgcrskey1 [root@localhost bin]# echo "kgcrs key"> kgcrskey2 [root@localhost bin]# echo "kgcrs key"> kgcrskey3 [root@localhost bin]# echo "kgcrs key"> kgcrskey4 [root@localhost bin]# chmod 600 kgcrskey{1..4}(4)依次重啟4個實例
mongod -f /etc/mongod.conf --shutdown mongod -f /etc/mongod.conf mongod -f /etc/mongod2.conf --shutdown mongod -f /etc/mongod2.conf mongod -f /etc/mongod3.conf --shutdown mongod -f /etc/mongod3.conf mongod -f /etc/mongod4.conf --shutdown mongod -f /etc/mongod4.conf(5)進入主節(jié)點查看數(shù)據(jù)庫和復(fù)制集
kgcrs:PRIMARY> show dbs kgcrs:PRIMARY> rs.status()沒有進行身份登錄驗證,直接查看,結(jié)果如下:
進行身份登錄后,查看,結(jié)果如下:
轉(zhuǎn)載于:https://blog.51cto.com/11134648/2146036
總結(jié)
以上是生活随笔為你收集整理的MongoDB复制选举原理及复制集管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超简单的利用plist 查看ipa包名及
- 下一篇: Node.js各版本间有哪些区别