zookeeper 中master選舉與leader選舉
開始學zookeeper 中,master選舉於leader 選舉2個概念比較模糊,談下自己的理解,如有不對地方請指出共同進步。
1.master選舉原理
有多個master,每次只能有一個master負責主要的工作,其他的master作為備份,同時對負責工作的master進行監聽,一旦負責工作的master掛掉了,其他的master就會收到監聽的事件,從而去搶奪負責工作的權利,其他沒有爭奪到負責主要工作的master轉而去監聽負責工作的新master。
本質其實是利用zookeeper的臨時節點的特性:臨時節點隨著會話的消亡二消亡,同一個臨時節點只能建立一個,建立失敗的節點(從master)對建立成功節點(主master)進行監控,一旦建立成功的節點(主master)會話消失,之前建立失敗的節點(從master)就會監聽到去搶奪建立臨時節點。
舉個例子:
第一步:zk有這樣一個持久節點/distibuted_system
第二步:master1和master2同時啟動,同時向向/distributed_system這個節點申請建立臨時子節點ActiveOrStandByLock(同一時間只有一個請求能夠建立成功)。
如果master1建立成功,這個節點(ActiveOrStandByLock)就不允許master2建立(鎖的機制)
master1:active===》真正的master。路徑:/distributed_system/ActiveOrStandByLock
master2:改為standby(master-back)。
同時對/distributed_system/ActiveOrStandByLock註冊事件監聽。
第三步:master1掛掉或者超過一定時間。節點會被刪除(事件機制就會起作用),就會通知master2,master2就會在/distributed_system/ActiveOrStandByLock,同時修改狀態為active。
備註:假如master1並沒有掛掉,只有由於網路延時導致,當網路順暢的時候就會出現“腦裂”狀態。都認為自己是active。
解決腦裂的辦法:對/distributed_system/ActiveOrStandByLock加一個許可權ACL控制。master1對於這個節點/distributed_system/ActiveOrStandByLock沒有許可權。自己把狀態改成standby。
2.leader 選舉
leader 選擇其實是paxos的一種經典實現,zk中使用我們的zab協議進行選舉,具體請看一下過程圖:
在我們zk選舉leader中我們會想到如果我們的leader宕機怎麼辦?其實我們有一個重要指標那就是我們zk伺服器中日誌的記錄的完整性,那麼誰記錄的日誌完整性越好誰就選舉作為leader,就是我們zk中的zxid,在選舉過程中,首先比較我們的zxid,誰的zxid值越大就選誰,一個比較生動容易理解的圖如下:
其實個人理解,leader選舉我們理解就好,master選舉應用場景會多一些,主要用到我們zk的特點節點管理,只要理解了,就很容易理解。