天天看點

四、zookeeper叢集leader選舉機制

​​zk目錄​​

文章目錄

  • ​​4.1、Zookeeper選舉機制之第一次啟動​​
  • ​​4.2、Zookeeper選舉機制之非第一次啟動​​

SID:伺服器ID。用來唯一辨別一台ZooKeeper叢集中的機器,每台機器不能重複,和myid一緻。

ZXID:事務ID。ZXID是一個事務ID,用來辨別一次伺服器狀态的變更。在某一時刻,叢集中的每台機器的ZXID值不一定完全一緻,這和ZooKeeper伺服器對于用戶端“更新請求”的處理邏輯有關。

Epoch:每個Leader任期的代号。沒有Leader時同一輪投票過程中的邏輯時鐘值是相同的。每投完一次票這個資料就會增加

4.1、Zookeeper選舉機制之第一次啟動

zookeeper叢集第一次啟動的選舉過程。

四、zookeeper叢集leader選舉機制

現在我們假設有5台伺服器,第一啟動的選舉過程:

(1)伺服器1啟 動,發起一次選舉。伺服器1投自己一票。此時伺服器1票數一票,不夠半數以上(3票),選舉無法完成,伺服器1狀态保持為LOOKING;

(2)伺服器2啟動,再發起一次選舉。伺服器1和2分别投自己一票并交換選票資訊:此時伺服器1發現伺服器2的myid比自己目前投票推舉的(伺服器1)大,更改選票為推舉伺服器2。此時伺服器1票數0票,伺服器2票數2票,沒有半數以上結果,選舉無法完成,伺服器1,2狀态保持LOOKING

(3)伺服器3啟動,發起一次選舉。此時伺服器1和2都會更改選票為伺服器3。此次投票結果:伺服器1為0票,伺服器2為0票,伺服器3為3票。此時伺服器3的票數已經超過半數,伺服器3當選Leader。伺服器1,2更改狀态為FOLLOWING,伺服器3更改狀态為LEADING;

(4)伺服器4啟動,發起一次選舉。此時伺服器1,2,3已經不是LOOKING狀态,不會更改選票資訊。交換選票資訊結果:伺服器3為3票,伺服器4為1票。此時伺服器4服從多數,更改選票資訊為伺服器3,并更改狀态為FOLLOWING;

(5)伺服器5啟動,同4一樣當小弟。

4.2、Zookeeper選舉機制之非第一次啟動

zookeeper叢集正常啟動之後,leader挂了之後的選舉。

四、zookeeper叢集leader選舉機制

(1)當ZooKeeper叢集中的一台伺服器出現以下兩種情況之一時,就會開始進入Leader選舉:

  • 伺服器初始化啟動。
  • 伺服器運作期間無法和Leader保持連接配接。

(2)而當一台機器進入Leader選舉流程時,目前叢集也可能會處于以下兩種狀态:

  • 叢集中本來就已經存在一個Leader。

    對于第一種已經存在Leader的情況,機器試圖去選舉Leader時,會被告知目前伺服器的Leader資訊,對于該機器來說,僅僅需要和Leader機器建立連接配接,并進行狀态同步即可。

  • 叢集中确實不存在Leader。

    假設ZooKeeper由5台伺服器組成,SID分别為1、2、3、4、5,ZXID分别為8、8、8、7、7,并且此時SID為3的伺服器是Leader。某一時刻,3和5伺服器出現故障,是以開始進行Leader選舉。

    SID為1、2、4的機器投票情況:

(EPOCH,ZXID,SID ) (EPOCH,ZXID,SID ) (EPOCH,ZXID,SID )
(1,8,1) (1,8,2)
  • ① EPOCH大的直接勝出
  • ② EPOCH相同,事務id大的勝出
  • ③ 事務id相同,伺服器id大的勝出

繼續閱讀