主節點(primary)與從節點(secondary)和仲裁節點(arbiter)
具備存儲數據的兩個成員的三個成員副本集具備:
●一個主節點。
●一個從節點。 從節點能夠在選舉中成爲主節點。
●一個仲裁節點 仲裁節點只在選舉中投票。html
因爲仲裁節點不保存數據副本,所以這種部署只提供一個完整的數據副本(secondary)。 仲裁節點須要更少的資源,犧牲更多有限的冗餘和容錯能力。mongodb
可是,使用主節點,從節點和仲裁及誒單的部署可確保若是主服務器或從服務器不可用,副本集仍將保持可用。服務器
若是主服務器不可用,則副本集將選擇從節點服務器爲主服務器。測試
我是經過openstack的trove組件部署出來了一個一主兩從組成的一個副本集的集羣形式。spa
經過將其中一個從節點停掉,移出集羣,而後將他變爲仲裁節點的方式進行測試的,具體方法能夠參照:code
https://docs.mongodb.com/v3.2/tutorial/convert-secondary-into-arbiter/index.html htm
須要主要的是,因爲trove建立的cluster開啓了身份認證,因此在啓動的時候須要keyfile來完成仲裁節點與主從節點之間的通訊。blog
命令:進程
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):從節點重啓以後會變爲當前主節點的從節點。