大數據-ZooKeeper-Leader選舉

  • leader的選舉很重要
  • 如果沒有leader怎麼辦
    • 可以重新選舉新的leader

ZooKeeper服務器的四種狀態:

  1. looking:服務器處於尋找Leader羣首的狀態
  2. leading:服務器作爲羣首時的狀態
  3. following:服務器作爲follower跟隨者時的狀態
  4. observing:服務器作爲觀察者時的狀態

-------------------------------------------------------------------------------

leader選舉分2種情況

  1. 全新集羣leader選舉
  2. 非全新集羣leader選舉

全新集羣leader選舉

 

1. 以3臺機器組成的ZooKeeper集羣爲例

原則:集羣中過半數(多數派quorum)Server啓動後,才能選舉出Leader;

此處quorum數是多少?3/2+1=2

即quorum=集羣服務器數除以2,再加1

理解leader選舉前,先了解幾個概念

2. 選舉過程中,每個server需發出投票;投票信息vote信息結構爲(sid, zxid)

全新集羣,server1~3初始投票信息分別爲:

server1 -> (1, 0) ​ ​server2 -> (2, 0) ​ server3 -> (3, 0)

leader選舉公式:

server1 vote信息 (sid1,zxid1)

server2 vote信息 (sid2,zxid2)

①zxid大的server勝出;

②若zxid相等,再根據判斷sid判斷,sid大的勝出

選舉leader流程:

假設按照ZK1、ZK2、ZK3的依次啓動

啓動ZK1後,投票給自己,vote信息(1,0),沒有過半數,選舉不出leader

再啓動ZK2;ZK1和ZK2票投給自己及其他服務器;ZK1的投票爲(1, 0),ZK2的投票爲(2, 0)

處理投票。每個server將收到的多個投票做處理

如ZK1上:ZK1投給自己的票(1,0)與ZK2傳過來的票(2,0)比較;

3. 利用leader選舉公式,因爲zxid都爲0,相等;所以判斷sid最大值;2>1;(2,0)勝出;ZK1更新自己的投票爲(2, 0)

ZK2也是如此邏輯,ZK2更新自己的投票爲(2,0)

再次發起投票

ZK1、ZK2上的投票都是(2,0)

發起投票後,ZK1上有一個自己的票(2,0)和一票來自ZK2的票(2,0),這兩票都選ZK2爲leader

ZK2上有一個自己的票(2,0)和一票來自ZK1的票(2,0),這兩票都選ZK2爲leader

統計投票。server統計投票信息,是否有半數server投同一個服務器爲leader;

ZK2當選2票;多數

改變服務器狀態。確定Leader後,各服務器更新自己的狀態

更改ZK2狀態從looking到leading,爲Leader

更改ZK1狀態從looking到following,爲Follower

當K3啓動時,發現已有Leader,不再選舉,直接從LOOKING改爲FOLLOWING

非全新集羣leader選舉

選舉原理與之前的原理相同

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章