Replication

MongoDB 副本集仲裁配置(網路分區行為)

  • November 21, 2019

我使用 mongodb 4.0.10。我想為一個主節點和兩個輔助節點的集群建立一個仲裁,如此處所寫。當節點數小於法定人數時,在我的情況下為 3 個節點,集群進入只讀狀態(無選舉)。

我嘗試將兩個節點的優先級設置為 0,在這種情況下,如果主節點出現故障,則沒有選舉,但如果其中一個節點出現故障,舊的主節點仍然存在。

根據 MongoDB 文件術語,是否可以將副本集容錯設置為零?這意味著如果任何集群節點發生故障,新的主節點將不會被選舉。

更新

rs.conf():

rs0:PRIMARY> rs.conf()
{
       "_id" : "rs0",
       "version" : 4,
       "protocolVersion" : NumberLong(1),
       "writeConcernMajorityJournalDefault" : true,
       "members" : [
               {
                       "_id" : 0,
                       "host" : "mongo0:27017",
                       "arbiterOnly" : false,
                       "buildIndexes" : true,
                       "hidden" : false,
                       "priority" : 1,
                       "tags" : {

                       },
                       "slaveDelay" : NumberLong(0),
                       "votes" : 1
               },
               {
                       "_id" : 1,
                       "host" : "mongo1:27017",
                       "arbiterOnly" : false,
                       "buildIndexes" : true,
                       "hidden" : false,
                       "priority" : 0,
                       "tags" : {

                       },
                       "slaveDelay" : NumberLong(0),
                       "votes" : 0
               },
               {
                       "_id" : 2,
                       "host" : "mongo2:27017",
                       "arbiterOnly" : false,
                       "buildIndexes" : true,
                       "hidden" : false,
                       "priority" : 0,
                       "tags" : {

                       },
                       "slaveDelay" : NumberLong(0),
                       "votes" : 0
               }
       ],
       "settings" : {
               "chainingAllowed" : true,
               "heartbeatIntervalMillis" : 2000,
               "heartbeatTimeoutSecs" : 10,
               "electionTimeoutMillis" : 10000,
               "catchUpTimeoutMillis" : -1,
               "catchUpTakeoverDelayMillis" : 30000,
               "getLastErrorModes" : {

               },
               "getLastErrorDefaults" : {
                       "w" : 1,
                       "wtimeout" : 0
               },
               "replicaSetId" : ObjectId("5cf5011183ea2fa5beade86b")
       }
}

我想將仲裁規則設置為 3。這是一種腦裂保護措施。這意味著如果集群中沒有 3 個活動節點,則無法寫入,只能讀取。我將輔助節點的優先級設置為 0,這意味著如果主節點失敗 - 將不會選出新的主節點。它工作正常,但我也想配置這樣的主節點行為:如果集群中沒有任何輔助節點 - 主節點將狀態更改為輔助節點,直到所有集群成員再次可用。

我想將仲裁規則設置為 3。這是一種腦裂保護措施。這意味著如果集群中沒有 3 個活動節點,則無法寫入,只能讀取。

裂腦通常是指分區兩側數據不一致的情況,例如接受不同的寫入。MongoDB 複製中的仲裁要求旨在避免這種情況:只能在具有大多數已配置投票成員可用的分區中選舉(或維持)主節點。任何少數分區都將越來越陳舊,但仍具有一致的歷史記錄,並有可能在解決網路分區時恢復同步。

我還想配置這樣的主節點行為:如果集群中沒有任何輔助節點 - 主節點將狀態更改為輔助節點,直到所有集群成員再次可用。

這是一種非典型配置,因為它不允許任何寫入容錯(這是副本集的主要優點之一)。推薦的方法是將所有節點配置為投票,用於w:majority要求多數寫入,並使用讀取關注majority來確保讀取的文件保證不會回滾。如果您擔心從落後太多的輔助設備中讀取,則讀取首選項也很有用maxStalenessSeconds

但是,如果您想確保僅在所有可用成員的情況下成功寫入,您可以考慮以下方法之一:

  • 使用w:3寫關注來要求副本集的所有 3 個成員的確認。
  • 使用 2 個副本集成員(而不是 3 個)來配置您的副本集,這兩個成員都在投票。這將需要兩個成員都線上才能選舉或維持一個初選。

引用自:https://dba.stackexchange.com/questions/240142