- leader的選舉很重要
- 如果沒有leader怎麼辦
- 可以重新選舉新的leader
ZooKeeper服務器的四種狀態:
- looking:服務器處於尋找Leader羣首的狀態
- leading:服務器作爲羣首時的狀態
- following:服務器作爲follower跟隨者時的狀態
- observing:服務器作爲觀察者時的狀態
-------------------------------------------------------------------------------
leader選舉分2種情況
- 全新集羣leader選舉
- 非全新集羣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選舉
選舉原理與之前的原理相同