博客 / 詳情

返回

以Zookeeper為例 淺談腦裂與奇數節點問題

一、腦裂現象的定義與影響

腦裂(split-brain)是指在分佈式系統中,因網絡分區或其他故障導致系統被切割成兩個或多個相互獨立的子系統,每個子系統可能獨立選舉出自己的領導節點。這一現象在依賴中心領導節點(如Elasticsearch的Master節點或ZooKeeper的Leader節點)的集羣環境中尤為常見。當這種情況發生時,原本應該由單一領導節點控制的集羣突然出現了多個領導者,導致數據不一致和操作衝突。

腦裂的直接後果是數據一致性的喪失,這對於依賴精確數據來進行操作的系統來説是致命的。例如,銀行系統中的賬户餘額記錄如果因為腦裂而不一致,可能導致用户資金被錯誤處理。此外,資源的浪費也是腦裂的一個重要影響,因為同一操作可能在多個分區中重複執行,消耗大量計算和存儲資源。

圖片

二、解決腦裂的策略

過半原則和領導者選舉

為了有效防止腦裂,許多分佈式系統採用了“過半原則”進行領導者選舉。這一機制要求在選舉過程中,候選節點必須獲得超過半數節點的支持才能成為領導者。ZooKeeper集羣就是採用這種策略,確保即使在網絡分區的情況下,也不會有多於一個領導者被選舉出來。此外,系統可以通過引入代數概念來幫助在網絡恢復後迅速確定當前有效的領導者,避免因“假死leader”而引發的混亂。

場景分析

假設一個ZooKeeper集羣由6台服務器組成,分佈在兩個不同的機房。在ZooKeeper的過半原則下,一個節點要成為Leader,需要獲得超過半數節點的支持。因此,對於6台服務器的集羣,計算過半數需要的票數為 half = 6 / 2 = 3,意味着至少需要4票來成功選舉出一個Leader。

1.兩個機房網絡正常連接時:所有6台服務器能夠互相通信,選舉過程中任何一個節點都有機會獲得至少4票,從而成功成為Leader。

圖片

2.兩個機房網絡斷開的情況:每個機房內的3台服務器只能在本地進行通信。

由於每個機房內的服務器數只有3台,不足以達到過半數4票的要求,因此無法在任一機房內部獨立選舉出Leader。這種情況下整個集羣將沒有Leader,從而防止了腦裂情況的發生,因為沒有兩個不同的Leader同時存在。

圖片

3.不對稱部署的情況(例如,機房1有3台服務器,機房2有2台服務器):

① 若網絡連接正常,整個集羣可以正常選舉出一個Leader。

② 若網絡斷開,機房1內的3台服務器可以通過內部投票選出一個Leader(因為3票已經超過了5台總數的半數,即2.5向上取整為3),而機房2因只有2台服務器,無法獨立選舉出Leader。這保證了整個集羣在任何時候最多隻有一個有效的Leader。
圖片

心跳檢測和輔助通信線路

心跳檢測是監控節點狀態的一種有效機制,可以幫助及時發現並處理故障節點。通過定期發送心跳信號,系統可以監控每個節點的響應狀態。一旦節點未能在預定時間內迴應心跳,系統便可觸發故障恢復機制,如重新選舉領導者。此外,建立輔助通信線路可以確保在主通信路徑出現問題時,節點之間仍能通過備用路徑進行通信,維持集羣的操作一致性。

使用磁盤鎖和仲裁機制

在某些情況下,為了確保集羣中只有一個有效的領導者,可以採用磁盤鎖或仲裁機制。磁盤鎖確保在任何時候,只有一個領導者能夠控制對關鍵資源的訪問。仲裁機制則通過引入一個外部決策者來幫助解決集羣內部的領導權爭議。這個外部決策者可以是一個獨立的服務或系統,它根據預設的規則來判斷哪個節點應當擔任領導者。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.