2015-11-29 32 views
0

情況:我在兩臺計算機上設置了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> 


有兩個疑惑我:

  1. 考慮this part of MongoDB documentation

複製品集使用選舉來確定哪個集合成員將成爲主要成員。在啓動副本集之後進行選擇,並且在任何時候主節點不可用。

選舉當主不可用而發生(或者在啓動的時間,但是這部分不關心我們的情況下),但主要是始終可用,那麼爲什麼選發生。

  • 考慮到同一文件的這一部分:
  • 如果大多數副本集的不可訪問或不可用,則副本集不能接受寫入和所有剩餘成員變爲只讀。

    考慮到零件'成員變爲只讀',我有兩個節點和一個向下的節點,因此這不會影響我們的複製。

    現在我的問題:當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> 
    
    +0

    你也可以上傳'rs.status()'的輸出嗎? –

    +0

    我可以在這裏看到一個問題。每個成員可能會爲另一個投票,這意味着有一條領帶,沒有任何東西可以打破這條領帶,因爲你得到了否決權。 PC機可能很有可能是主機。我會隱藏個人電腦,並設置現場服務器的票數來衡量你所擁有的第三個節點 – Sammaye

    +0

    @Sammaye我相信PC不是主要的,因爲當我殺死PC上的進程時,我登錄到使用遠程桌面和使用mongo shell的服務器具有PRIMAY>提示符,正如我在 – Musa

    回答

    2

    如文檔中表示,如果大多數的副本集的不可訪問或不可用,副本集不能接受的寫入和所有剩餘的成員變爲只讀。

    在這種情況下,如果仲裁器和輔助設備不可達,則主設備必須下臺。 rs.status()應該能夠確定副本成員的健康狀況。

    你還應該注意的一件事是主要oplog size。 oplog的大小決定了副本集成員可以關閉多長時間,並且在重新聯機時仍能夠趕上。由於oplog可以容納更多操作,因此oplog大小越大,可以處理會員的時間越長。如果它落後得太遠,則必須通過刪除其數據文件並執行initial sync來重新同步該成員。

    有關更多信息,請參見Check the size of the Oplog

    Regards,

    Wan。

    相關問題