ZooKeeper 02 - ZooKeeper集群的節點為什么是奇數個


1 關於節點個數的說明

ZooKeeper的單機服務 (也就是單節點, 或着單進程) 雖然便於開發與測試, 但並不適合在生產環境使用 —— 生產環境中為了服務的高可用以及容錯性, 建議使用ZooKeeper集群模式.

ZooKeeper的集群中, 建議部署奇數個ZooKeeper節點(或進程) —— 大多數情況下, 3個節點就足夠了.
節點個數並不是越多越好 —— 節點越多, 節點間通信所需的時間就會越久, 選舉leader時需要的時間也會越久.

2 ZooKeeper集群的容錯數

ZooKeeper集群中, 在保證集群可用的前提下, 最多允許掛掉的節點個數, 即為ZooKeeper集群的容錯數, 也叫集群的容忍度.

為了集群中leader節點的選舉, 允許掛掉的節點個數 < 剩余的存活節點個數 —— 剩余的存活節點個數必須大於n/2, n為總節點個數.

2n和2n-1(n>1)個節點的集群的容錯數都是n-1. 比如:

  • 5個節點中, 最多允許掛掉2個, 因為剩余的3個節點大於5/2;
  • 6個節點中, 最多允許掛掉2個, 因為剩余的4個節點大於6/2.

3 ZooKeeper集群可用的標准

集群模式(包括偽集群模式, 即在一台服務器上部署多個ZooKeeper進程)下, 遵循"過半存活即可用"的原則:

(1) 集群中超過一半的節點(或進程)可以正常工作, 集群就是對外可以用的. 示例:

  • 2個節點的ZooKeeper集群: 當leader(主)節點掛掉, 還活躍着的follower(隨從)節點的數量為1, 沒有超過集群總數的一半(即2/2=1), 所以此時集群就無法對外提供服務. —— 2個節點的集群容錯數為0.
  • 3個節點的ZooKeeper集群: 當leader(主)節點掛掉, 還活躍着的follower(隨從)節點的數量為2, 就能再次選出leader對外提供服務. —— 容錯數為1.
  • 同樣的, 5個節點的ZooKeeper集群最多允許2個主節點掛掉 —— 容錯數為2.

(2) ZooKeeper寫操作成功的標志:

leader節點負責ZooKeeper集群的寫操作, 它會通知所有follower節點執行寫操作, 只有收到半數以上follower節點的成功反饋, 寫操作才算成功.
如果2個節點的ZooKeeper集群, 就必須2個節點都寫成功, 才能算操作成功.

4 為什么不能是偶數個節點

4.1 防止由腦裂造成的集群不可用

關於ZooKeeper集群的腦裂, 請參看: ZooKeeper集群的腦裂問題 (Split Brain問題)

舉例說明:
(1) 假如: 集群有 5 個節點,發生了腦裂,腦裂成了A、B兩個小集群:

(a) A: 1個節點, B: 4個節點, 或A、B互換
(b) A: 2個節點, B: 3個節點, 或A、B互換

上面兩種情況下, A、B中總會有一個小集群滿足 可用節點數量 > 總節點數量/2 , 所以集群仍然能選舉出leader, 仍然能對外提供服務.

(2) 假如: 集群有4個節點, 同樣發生腦裂, 腦裂成了A、B兩個小集群:

(a) A: 1個節點, B: 3個節點, 或 A、B互換 
(b) A: 2個節點, B: 2個節點

上述情況(a)滿足選舉條件, 而情況(b)不滿足, 此時集群就徹底不能提供服務了.

(3) 總結:

  • 節點數量為奇數個, 只要不出現過半的節點失效, 集群就總能對外提供服務;
  • 節點數量是偶數個, 如果有一半的節點失效, 就可能存在集群可用(腦裂成兩個均等的子集群).

4.2 奇數個節點更省資源

原則上ZooKeeper集群中可以有偶數個節點, 但其容錯數並不會提高, 反而降低了集群間的通信效率, 也浪費了資源.

—— 即: 容錯能力相同時, 奇數個節點更節省資源.

4.3 偶數個節點遇到的其他問題

博主測試過2個和4個節點的ZooKeeper集群, 基於這個前提總結出下述問題:

(1) 分布式環境下, ZooKeeper集群容易受到網絡、系統調度等因素的影響;

(2) 2個ZooKeeper節點的集群中:

  • 如果1個ZooKeeper節點掛掉, 剩下的1個節點並不能滿足"過半存活"的原則, 所以集群將不可用;
  • 2個節點的集群比單機模式更不可靠 —— 2個節點中至少1個節點出錯的概率比單節點出錯的概率大;

(3) 4個節點的ZooKeeper集群中, 第4個節點不能成功啟動, ZooKeeper會強制使JVM拋出如下錯誤:

Error occurred during initialization of VM
Unable to allocate 983040KB bitmaps for parallel garbage collection for the requested 31457280KB heap.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

參考資料

zookeeper節點為什么是奇數個?

zookeeper集群奇偶數節點問題

Zookeeper集群節點數量為什么要是奇數個?

版權聲明

作者: 馬瘦風

出處: 博客園 馬瘦風的博客

您的支持是對博主的極大鼓勵, 感謝您的閱讀.

本文版權歸博主所有, 歡迎轉載, 但請保留此段聲明, 並在文章頁面明顯位置給出原文鏈接, 否則博主保留追究相關人員法律責任的權利.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM