情況:我在兩臺計算機上設置了MongoDB複製集。在mongodb 3.0複製中,當一個輔助服務器出現故障時,選舉如何發生
- 一臺計算機是一個服務器,它承載主節點和仲裁器。該服務器是一個活動的服務器,並且始終開啓。它是用於複製的本地IP是
192.168.0.4
。 - 其次是一臺PC,輔助節點駐留並每天開啓幾個小時。它是用於複製的本地IP地址是
192.168.0.5
。
我的期望:我希望活的服務器是我的應用程序的數據交互的主要點,無論PC的狀態(是否可達與否,因爲PC是次要的),所以我想確保服務器的節點始終是主節點。
以下是rs.config()
結果:
liveSet:PRIMARY> rs.config()
{
"_id" : "liveSet",
"version" : 2,
"members" : [
{
"_id" : 0,
"host" : "192.168.0.4:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 10,
"tags" : {
},
"slaveDelay" : 0,
"votes" : 1
},
{
"_id" : 1,
"host" : "192.168.0.5:5051",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : 0,
"votes" : 1
},
{
"_id" : 2,
"host" : "192.168.0.4:5052",
"arbiterOnly" : true,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {
},
"slaveDelay" : 0,
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatTimeoutSecs" : 10,
"getLastErrorModes" : {
},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
}
}
}
而且我已經設置了存儲引擎是WiredTiger,如果該事項。
我實際得到的和問題:當我關閉PC或者終止其mongod進程時,服務器上的節點變爲次要的。
以下是我殺了PC的mongod的過程中,服務器的輸出,連接到主節點的外殼,同時:
liveSet:PRIMARY>
2015-11-29T10:46:29.471+0430 I NETWORK Socket recv() errno:10053 An established connection was aborted by the software in your host machine. 127.0.0.1:27017
2015-11-29T10:46:29.473+0430 I NETWORK SocketException: remote: 127.0.0.1:27017 error: 9001 socket exception [RECV_ERROR] server [127.0.0.1:27017]
2015-11-29T10:46:29.475+0430 I NETWORK DBClientCursor::init call() failed
2015-11-29T10:46:29.479+0430 I NETWORK trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2015-11-29T10:46:29.481+0430 I NETWORK reconnect 127.0.0.1:27017 (127.0.0.1) ok
liveSet:SECONDARY>
有兩個疑惑我:
複製品集使用選舉來確定哪個集合成員將成爲主要成員。在啓動副本集之後進行選擇,並且在任何時候主節點不可用。
選舉當主不可用而發生(或者在啓動的時間,但是這部分不關心我們的情況下),但主要是始終可用,那麼爲什麼選發生。
- 考慮到同一文件的這一部分:
如果大多數副本集的不可訪問或不可用,則副本集不能接受寫入和所有剩餘成員變爲只讀。
考慮到零件'成員變爲只讀',我有兩個節點和一個向下的節點,因此這不會影響我們的複製。
現在我的問題:當PC上的節點不可達時,如何將服務器上的節點保持爲主節點?
更新: 這是rs.status()
輸出。
感謝萬Bachtiar,現在這使得行爲顯而易見,因爲仲裁者無法訪問。
liveSet:PRIMARY> rs.status()
{
"set" : "liveSet",
"date" : ISODate("2015-11-30T04:33:03.864Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "192.168.0.4:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1807553,
"optime" : Timestamp(1448796026, 1),
"optimeDate" : ISODate("2015-11-29T11:20:26Z"),
"electionTime" : Timestamp(1448857488, 1),
"electionDate" : ISODate("2015-11-30T04:24:48Z"),
"configVersion" : 2,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.0.5:5051",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 496,
"optime" : Timestamp(1448796026, 1),
"optimeDate" : ISODate("2015-11-29T11:20:26Z"),
"lastHeartbeat" : ISODate("2015-11-30T04:33:03.708Z"),
"lastHeartbeatRecv" : ISODate("2015-11-30T04:33:02.451Z"),
"pingMs" : 1,
"configVersion" : 2
},
{
"_id" : 2,
"name" : "192.168.0.4:5052",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"lastHeartbeat" : ISODate("2015-11-30T04:33:00.008Z"),
"lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
"configVersion" : -1
}
],
"ok" : 1
}
liveSet:PRIMARY>
你也可以上傳'rs.status()'的輸出嗎? –
我可以在這裏看到一個問題。每個成員可能會爲另一個投票,這意味着有一條領帶,沒有任何東西可以打破這條領帶,因爲你得到了否決權。 PC機可能很有可能是主機。我會隱藏個人電腦,並設置現場服務器的票數來衡量你所擁有的第三個節點 – Sammaye
@Sammaye我相信PC不是主要的,因爲當我殺死PC上的進程時,我登錄到使用遠程桌面和使用mongo shell的服務器具有PRIMAY>提示符,正如我在 – Musa