MongoDB複製集簡單操作
一、MongoDB複製集介紹
1、如下圖所示有一個數據庫叢集,叢集中有三臺資料庫伺服器,一臺活躍伺服器和兩臺備份伺服器。當活躍伺服器A發生故障時,會根據權重演算法從備份伺服器B和C中選出B作為新的活躍伺服器,而當A恢復時當成備份伺服器,繼續加入到整個資料庫叢集中工作,這就是MongoDB的副本集。
2、配置一個副本集
2.1 在npfdev1,npfdev2,npfdev3三臺機器上的mongodb.conf增加配置:
replSet=kgpcReplSet, 指定了複製集的名稱. 為了使用方便,我們暫時不要使用auth啟動,去掉auth引數。
2.2 啟動MongoDB,使用 service mongod start 命令.
2.3 然後就需要初始化複製集。進入到這三臺資料庫伺服器中任何一個的admin資料庫,執行如下圖的操作來初始化複製集:這裡沒有設定這三臺伺服器的權重,MonggoDB推選活躍伺服器的策略是隨機的。
2.3.1 那麼使用命令mongo npfdev1:27017/admin
2.3.2 初始化複製集, 執行如下命令:
db.runCommand({"replSetInitiate":{ "_id":"kgpcReplSet", "members":[ {"_id":1,"host":"npfdev1:27017"}, {"_id":2,"host":"npfdev2:27017"}, {"_id":3,"host":"npfdev3:27017"} ] }} );
2.3.4 分別進入到這三臺伺服器的shell介面.可以發現npfdev1的伺服器被推選成了活躍伺服器,而其它兩臺就是備份伺服器.
2.3.5 在活躍伺服器shell中可以使用“rs.status()”來檢視副本集的狀態。
kgpcReplSet:PRIMARY> rs.status(); { "set" : "kgpcReplSet", "date" : ISODate("2017-05-05T13:05:29.158Z"), "myState" : 1, "term" : NumberLong(1), "heartbeatIntervalMillis" : NumberLong(2000), "members" : [ { "_id" : 1, "name" : "npfdev1:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 268, "optime" : { "ts" : Timestamp(1493989299, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2017-05-05T13:01:39Z"), "electionTime" : Timestamp(1493989298, 1), "electionDate" : ISODate("2017-05-05T13:01:38Z"), "configVersion" : 1, "self" : true }, { "_id" : 2, "name" : "npfdev2:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 240, "optime" : { "ts" : Timestamp(1493989299, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2017-05-05T13:01:39Z"), "lastHeartbeat" : ISODate("2017-05-05T13:05:28.555Z"), "lastHeartbeatRecv" : ISODate("2017-05-05T13:05:28.549Z"), "pingMs" : NumberLong(1), "syncingTo" : "npfdev1:27017", "configVersion" : 1 }, { "_id" : 3, "name" : "npfdev3:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 240, "optime" : { "ts" : Timestamp(1493989299, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2017-05-05T13:01:39Z"), "lastHeartbeat" : ISODate("2017-05-05T13:05:28.557Z"), "lastHeartbeatRecv" : ISODate("2017-05-05T13:05:28.554Z"), "pingMs" : NumberLong(0), "syncingTo" : "npfdev1:27017", "configVersion" : 1 } ], "ok" : 1 } kgpcReplSet:PRIMARY>
2.3.6 複製集如下圖:
複製集使用的非同步同步方式,複製整合員之間每隔2s傳送一次hearbeat(pings).當主節點與其它成員通訊超時10s後,一個secondary節點將會被選舉為primary節點.在新的版本中,如果存在多個secondary節點,當第一個節點被選舉為primary後,其它的secondary節點將從它開始複製資料.
2.3.7 讀寫分離操作,注意:預設情況下非活躍伺服器(SECONDARY)是不能進行資料庫讀操作的。如下圖:
如果要設定SECONDARY節點也可以進行讀操作,那麼可以設定slaveOk引數為true。但是此屬性在shell中無法完成,這個特性是被寫到MongoDB的高階驅動程式中的。
參考文獻