不管是公司的生產環境,仍是本身搭建的測試環境,Zookeeper集羣的節點個數都是奇數個。至於爲何要是奇數個,之前只是模糊的知道是爲了知足選舉須要,並不知道詳細的緣由。最近重點學習zookeeper,瞭解到其中的原理,現將其整理記錄下來。學習
首先須要明確zookeeper選舉的規則:leader選舉,要求 可用節點數量 > 總節點數量/2 。注意 是 > , 不是 ≥。測試
注:爲何規則要求 可用節點數量 > 集羣總結點數量/2 ? 若是不這樣限制,在集羣出現腦裂的時候,可能會出現多個子集羣同時服務的狀況(即子集羣各組選舉出本身的leader), 這樣對整個zookeeper集羣來講是紊亂的。
換句話說,若是遵照上述規則進行選舉,即便出現腦裂,集羣最多也只能回出現一個子集羣能夠提供服務的狀況(能知足節點數量> 總結點數量/2 的子集羣最多隻會有一個)。因此要限制 可用節點數量 > 集羣總結點數量/2 。資源
採用奇數個的節點主要是出於兩方面的考慮:ast
一、防止由腦裂形成的集羣不可用。集羣
首先,什麼是腦裂?集羣的腦裂一般是發生在節點之間通訊不可達的狀況下,集羣會分裂成不一樣的小集羣,小集羣各自選出本身的master節點,致使原有的集羣出現多個master節點的狀況,這就是腦裂。原理
下面舉例說一下爲何採用奇數臺節點,就能夠防止因爲腦裂形成的服務不可用:zookeeper
(1) 假如zookeeper集羣有 5 個節點,發生了腦裂,腦裂成了A、B兩個小集羣: 總結
(a) A : 1個節點 ,B :4個節點 , 或 A、B互換通信
(b) A : 2個節點, B :3個節點 , 或 A、B互換
能夠看出,上面這兩種狀況下,A、B中總會有一個小集羣知足 可用節點數量 > 總節點數量/2 。因此zookeeper集羣仍然可以選舉出leader , 仍然能對外提供服務,只不過是有一部分節點失效了而已。
(2) 假如zookeeper集羣有4個節點,一樣發生腦裂,腦裂成了A、B兩個小集羣:
(a) A:1個節點 , B:3個節點, 或 A、B互換
(b) A:2個節點 , B:2個節點
能夠看出,狀況(a) 是知足選舉條件的,與(1)中的例子相同。 可是狀況(b) 就不一樣了,由於A和B都是2個節點,都不知足 可用節點數量 > 總節點數量/2 的選舉條件, 因此此時zookeeper就完全不能提供服務了。
綜合上面兩個例子能夠看出: 在節點數量是奇數個的狀況下, zookeeper集羣總能對外提供服務(即便損失了一部分節點);若是節點數量是偶數個,會存在zookeeper集羣不能用的可能性(腦裂成兩個均等的子集羣的時候)。
在生產環境中,若是zookeeper集羣不能提供服務,那將是致命的 , 因此zookeeper集羣的節點數通常採用奇數個。
二、在容錯能力相同的狀況下,奇數臺更節省資源。
leader選舉,要求 可用節點數量 > 總節點數量/2 。注意 是 > , 不是 ≥。
舉兩個例子:
(1) 假如zookeeper集羣1 ,有3個節點,3/2=1.5 , 即zookeeper想要正常對外提供服務(即leader選舉成功),至少須要2個節點是正常的。換句話說,3個節點的zookeeper集羣,容許有一個節點宕機。
(2) 假如zookeeper集羣2,有4個節點,4/2=2 , 即zookeeper想要正常對外提供服務(即leader選舉成功),至少須要3個節點是正常的。換句話說,4個節點的zookeeper集羣,也容許有一個節點宕機。
那麼問題就來了, 集羣1與集羣2都有 容許1個節點宕機 的容錯能力,可是集羣2比集羣1多了1個節點。在相同容錯能力的狀況下,本着節約資源的原則,zookeeper集羣的節點數維持奇數個更好一些。