ZooKeepe集群中的三種服務器角色:Leader、Follower、Observer,本文主要概述Leader選舉演算法相關的知識,
一、Zookeeper里三種角色
1.Leader:Leader是整個集群中的核心,主要作業內容是
- 事務請求的唯一調度和處理者,保證集群事務處理的順序性,
- 集群內部各服務器的調度者
2.Follower:Follower服務器是Zookeeper集群狀態的跟隨者,其主要作業內容是:
- 處理客戶端非事務請求,轉發事務請求給Leader服務器
- 參與事務請求Proposal的投票
- 參與Leader選舉投票
3.Observer:在作業原理上基本與Follower一致,不參與任何形式的投票,觀察同步集群的最新狀態并同步
二、選舉演算法
Zookeeper中主要提供了三種Leader選舉演算法,分別是LeaderElection、UDP版本的FastLeaderElection和TCP版本的FastLeaderElection,可以在組態檔zoo.cfg中使用electionAlg屬性來指定,分別使用數字0-3來表示,下文介紹的是TCP版本的FastLeaderElection選舉演算法,
1. 相關術語
SID:服務器ID,SID是一個數字,用來標識一臺Zookeeper中的機器,取值和myid組態檔中的值一致,
ZXID:事務ID,用來標識一次服務器狀態的變更,
Vote:投票,一個Vote包含以下幾個屬性:
id:被推舉的Leader的SID值,
zxid:被推舉的Leader的事務ID,
electionEpoch:邏輯時鐘,用來判斷多個投票是否在同一輪選舉周期中,
peerEpoch:被推舉Leader的epoch,
state:當前服務器的狀態,LOOKING、FOLLOWING、LEADEING、OBSERVING
2. 演算法分析
當ZooKeeper集群中的一臺服務器出現以下兩種情況之一時,就會開始進入Leader選舉,
- 服務器初始化啟動
- 服務器運行期間無法和Leader保持連接
注:當一臺服務器加入集群中時,如果當前集群中已經存在一臺正常作業的Leader,那么這個服務器會連接Leader進行資料同步,若無Leader,則會進行Leader選舉階段,
開始第一次投票
當集群中的機器進行Leader選舉階段,機器的狀態會變更為LOOKING,當一臺機器處于LOOKING轉態時,它會向集群中的其他所有機器發送訊息,這個訊息為“投票”,同時該機器也會接受其他機器的“投票”,
我們用(SID,ZXID)這樣的形式來表示一次投票資訊,例如,當前服務器要推舉SID為1、ZXID為8 的服務器成為Leader,那么它這次的投票資訊可以表示為:(1,8),
我們假設Zookeeper由5臺機器組成,SID分別為1、2,3、4、5,ZXID分別為9、9、9、8、8,
并且此時SID為2的機器是Leader服務器,在某一時刻,1和2所在機器發生故障,此時集群開始進行Leader選舉,
在第一次投票時,因為無法檢測到集群中其他機器的狀態資訊,每臺機器在第一次投票時,會將自己作為推舉物件進行投票,即集群中正常運行的3、4、5號機器第一次投票的資訊為(3,9)、(4,8)、(5,8),
變更投票
集群中的每臺機器發出自己的投票,也會接收到來自集群中其他機器的投票,機器會根據相應的規則來處理接收到的其他機器的投票,在這個程序中,可能會保持自己的投票,也可能會丟棄自己的投票更改為接收到的投票,下面定義一些術語:
- vote_sid:接收到的投票中所推舉的Leader服務器的SID
- vote_zxid:接收到的投票中所推舉的Leader服務器的ZXID
- self_sid:當前服務器自己的SID
- self_zxid:當前服務器自己的ZXID
處理投票的規則:
處理收到的投票,都是對(vote_sid,vote_zxid)和(self_sid,self_zxid)的比較,
- 規則一:如果vote_zxid 大于 self_zxid,就認可當前收到的投票,并將該投票(vote_sid,vote_zxid)發送出去
- 規則二:如果vote_zxid 小于 self_zxid,那么就堅持自己的投票(self_sid,self_zxid)
- 規則三:如果vote_zxid 等于 self_zxid,繼續比較vote_sid和self_sid,如果vote_sid大于self_id,那么就認可接收到的投票,并將該投票(vote_sid,vote_zxid)發送出去,如果vote_sid小于self_sid,同樣堅持自己的投票(self_sid,self_zxid)
根據以上規則,我們來分析上面提到的例子,

正常作業的3臺機器發出第一輪投票(投給自己的投票),其他兩臺機器也會收到相應的投票,下面我們對每臺機器的投票情況進行分析:
- 對于Sever3:Sever3接收到了Server4的投票(4,8)和Sever5的投票(5,8),然后按照上面闡述的規則,對比(3,9)(4,8)(5,8),Sever3的ZXID要大于Sever4和Sever5的ZXID,所以Sever3保留自己的投票,不做任何變更,
- 對于Sever4:Sever4接收到了Sever3的投票(3,9)和Sever5的投票(5,8),然后進過對比,發現(3,9)這個投票的ZXID大于自己,因此需要變更投票為(3,9),然后變更后的投票發送給Sever3和Sever5兩臺機器,
- 對于Sever5:處理的邏輯與Sever4相同,
確認Leader
如果一臺機器收到了超過半數的相同的投票,那么這個投票對應的SID機器即為Leader,
當Zookeeper集群中的機器為5臺,那么quorum= (5/2 +1) = 3,即只要收到3個或3個以上的相同投票即可確定Leader,在上面的例子中,Sever3、Sever4和Sever5最終都投了Sever3作為Leader,因此 Sever3成為Leader,
總結
通常具有最大的ZXID的機器越容易成為Leader,具有最大的ZXID的機器成為Leader可以保證集群資料的恢復,如果相同ZXID,那么較大的SID的那臺服務器成為Leader,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/421434.html
標籤:其他
上一篇:02環境搭建
下一篇:大資料能做什么?
