MongoDB 副本集仲裁配置(網路分區行為)
我使用 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 個)來配置您的副本集,這兩個成員都在投票。這將需要兩個成員都線上才能選舉或維持一個初選。