標籤:class master stack ffffff config 命令 trove 伺服器 hsi
主節點(primary)與從節點(secondary)和仲裁節點(arbiter)
具有儲存資料的兩個成員的三個成員複本集具有:
●一個主節點。
●一個從節點。 從節點可以在選舉中成為主節點。
●一個仲裁節點 仲裁節點只在選舉中投票。
由於仲裁節點不儲存資料副本,因此這種部署只提供一個完整的資料副本(secondary)。 仲裁節點需要更少的資源,犧牲更多有限的冗餘和容錯能力。
但是,使用主節點,從節點和仲裁及誒單的部署可確保如果主伺服器或從伺服器不可用,複本集仍將保持可用。
如果主伺服器不可用,則複本集將選擇從節點伺服器為主伺服器。
我是通過openstack的trove組件部署出來了一個一主兩從組成的一個複本集的叢集形式。
通過將其中一個從節點停掉,移出叢集,然後將他變為仲裁節點的方式進行測試的,具體方法可以參照:
https://docs.mongodb.com/v3.2/tutorial/convert-secondary-into-arbiter/index.html
需要主要的是,由於trove建立的cluster開啟了身份認證,所以在啟動的時候需要keyfile來完成仲裁節點與主從節點之間的通訊。
命令:
mongod --port 27017 --dbpath /data --replSet rs1 --config /etc/mongod.conf
rs1:SECONDARY> db.isMaster(){ "hosts" : [ "192.168.111.173:27017", "192.168.111.174:27017" ], "arbiters" : [ "192.168.111.172:27017" ], "setName" : "rs1", "setVersion" : 8, "ismaster" : false, "secondary" : true, "primary" : "192.168.111.173:27017", "me" : "192.168.111.174:27017", "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2017-10-24T09:16:11.858Z"), "maxWireVersion" : 4, "minWireVersion" : 0, "ok" : 1}kill掉主節點上的mongodb進程rs1:SECONDARY> db.isMaster(){ "hosts" : [ "192.168.111.173:27017", "192.168.111.174:27017" ], "arbiters" : [ "192.168.111.172:27017" ], "setName" : "rs1", "setVersion" : 8, "ismaster" : true, "secondary" : false, "primary" : "192.168.111.174:27017", "me" : "192.168.111.174:27017", "electionId" : ObjectId("7fffffff0000000000000006"), "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2017-10-24T09:16:49.220Z"), "maxWireVersion" : 4, "minWireVersion" : 0, "ok" : 1, "$gleStats" : { "lastOpTime" : Timestamp(0, 0), "electionId" : ObjectId("7fffffff0000000000000006") }}
總結:
1.當我們只使用一主一從的方式進行部署的時候,如果主節點down機,從節點不會提升為主節點。
(1):當重啟主節點的時候,會發生兩種可能性。1.主節點變為從節點,從節點選舉為新的主節點。2.主從節點不變(推測這是由於)
2.當在一主一從中加入一個仲裁節點後,
(1):主節點down機,從節點提升為主節點。
(2):從節點重啟之後會變為當前主節點的從節點。
Mongodb叢集形式探究-一主一從一仲裁。