zk目錄
文章目錄
- 4.1、Zookeeper選舉機制之第一次啟動
- 4.2、Zookeeper選舉機制之非第一次啟動
SID:伺服器ID。用來唯一辨別一台ZooKeeper叢集中的機器,每台機器不能重複,和myid一緻。
ZXID:事務ID。ZXID是一個事務ID,用來辨別一次伺服器狀态的變更。在某一時刻,叢集中的每台機器的ZXID值不一定完全一緻,這和ZooKeeper伺服器對于用戶端“更新請求”的處理邏輯有關。
Epoch:每個Leader任期的代号。沒有Leader時同一輪投票過程中的邏輯時鐘值是相同的。每投完一次票這個資料就會增加
4.1、Zookeeper選舉機制之第一次啟動
zookeeper叢集第一次啟動的選舉過程。
現在我們假設有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挂了之後的選舉。
(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大的勝出