Zookeeper leader選舉

2020-11-19 14:38 更新

Leader 選舉是保證分布式數(shù)據(jù)一致性的關(guān)鍵所在。Leader 選舉分為 Zookeeper 集群初始化啟動(dòng)時(shí)選舉和 Zookeeper 集群運(yùn)行期間 Leader 重新選舉兩種情況。在講解 Leader 選舉前先了解一下 Zookeeper 節(jié)點(diǎn) 4 種可能狀態(tài)和事務(wù)ID概念。

1、Zookeeper 節(jié)點(diǎn)狀態(tài)

  • LOOKING:尋找 Leader 狀態(tài),處于該狀態(tài)需要進(jìn)入選舉流程
  • LEADING:領(lǐng)導(dǎo)者狀態(tài),處于該狀態(tài)的節(jié)點(diǎn)說明是角色已經(jīng)是 Leader
  • FOLLOWING:跟隨者狀態(tài),表示 Leader 已經(jīng)選舉出來(lái),當(dāng)前節(jié)點(diǎn)角色是 follower
  • OBSERVER:觀察者狀態(tài),表明當(dāng)前節(jié)點(diǎn)角色是 observer

2、事務(wù)ID

ZooKeeper 狀態(tài)的每次變化都接收一個(gè) ZXID(ZooKeeper 事務(wù) id)形式的標(biāo)記。ZXID 是一個(gè) 64 位的數(shù)字,由 Leader 統(tǒng)一分配,全局唯一,不斷遞增。ZXID 展示了所有的ZooKeeper 的變更順序。每次變更會(huì)有一個(gè)唯一的 zxid,如果 zxid1 小于 zxid2 說明 zxid1 在 zxid2 之前發(fā)生。

3、Zookeeper 集群初始化啟動(dòng)時(shí) Leader 選舉

若進(jìn)行 Leader 選舉,則至少需要兩臺(tái)機(jī)器,這里選取 3 臺(tái)機(jī)器組成的服務(wù)器集群為例。初始化啟動(dòng)期間 Leader 選舉流程如下圖所示。

20180128213955030

在集群初始化階段,當(dāng)有一臺(tái)服務(wù)器 ZK1 啟動(dòng)時(shí),其單獨(dú)無(wú)法進(jìn)行和完成 Leader 選舉,當(dāng)?shù)诙_(tái)服務(wù)器 ZK2 啟動(dòng)時(shí),此時(shí)兩臺(tái)機(jī)器可以相互通信,每臺(tái)機(jī)器都試圖找到 Leader,于是進(jìn)入 Leader 選舉過程。選舉過程開始,過程如下:  

(1) 每個(gè)Server發(fā)出一個(gè)投票。由于是初始情況,ZK1 和 ZK2 都會(huì)將自己作為 Leader 服務(wù)器來(lái)進(jìn)行投票,每次投票會(huì)包含所推舉的服務(wù)器的 myid 和 ZXID,使用(myid, ZXID)來(lái)表示,此時(shí) ZK1 的投票為(1, 0),ZK2 的投票為(2, 0),然后各自將這個(gè)投票發(fā)給集群中其他機(jī)器。  

(2) 接受來(lái)自各個(gè)服務(wù)器的投票。集群的每個(gè)服務(wù)器收到投票后,首先判斷該投票的有效性,如檢查是否是本輪投票、是否來(lái)自 LOOKING 狀態(tài)的服務(wù)器?! ?/p>

(3) 處理投票。針對(duì)每一個(gè)投票,服務(wù)器都需要將別人的投票和自己的投票進(jìn)行比較,規(guī)則如下    

  • 優(yōu)先檢查 ZXID。ZXID 比較大的服務(wù)器優(yōu)先作為 Leader。
  • 如果 ZXID 相同,那么就比較 myid。myid 較大的服務(wù)器作為L(zhǎng)eader服務(wù)器。
    對(duì)于 ZK1 而言,它的投票是(1, 0),接收 ZK2 的投票為(2, 0),首先會(huì)比較兩者的 ZXID,均為 0,再比較 myid,此時(shí) ZK2 的 myid 最大,于是 ZK2 勝。ZK1 更新自己的投票為(2, 0),并將投票重新發(fā)送給 ZK2?! ?

(4) 統(tǒng)計(jì)投票。每次投票后,服務(wù)器都會(huì)統(tǒng)計(jì)投票信息,判斷是否已經(jīng)有過半機(jī)器接受到相同的投票信息,對(duì)于 ZK1、ZK2 而言,都統(tǒng)計(jì)出集群中已經(jīng)有兩臺(tái)機(jī)器接受了(2, 0)的投票信息,此時(shí)便認(rèn)為已經(jīng)選出 ZK2 作為L(zhǎng)eader?! ?/p>

(5) 改變服務(wù)器狀態(tài)。一旦確定了 Leader,每個(gè)服務(wù)器就會(huì)更新自己的狀態(tài),如果是Follower,那么就變更為 FOLLOWING,如果是 Leader,就變更為 LEADING。當(dāng)新的 Zookeeper 節(jié)點(diǎn) ZK3 啟動(dòng)時(shí),發(fā)現(xiàn)已經(jīng)有 Leader 了,不再選舉,直接將直接的狀態(tài)從 LOOKING 改為 FOLLOWING。

4、Zookeeper 集群運(yùn)行期間 Leader 重新選

在 Zookeeper 運(yùn)行期間,如果 Leader 節(jié)點(diǎn)掛了,那么整個(gè) Zookeeper 集群將暫停對(duì)外服務(wù),進(jìn)入新一輪Leader選舉。假設(shè)正在運(yùn)行的有 ZK1、ZK2、ZK3 三臺(tái)服務(wù)器,當(dāng)前 Leader 是 ZK2,若某一時(shí)刻 Leader 掛了,此時(shí)便開始 Leader 選舉。選舉過程如下圖所示。

201802

 

(1) 變更狀態(tài)。Leader 掛后,余下的非 Observer 服務(wù)器都會(huì)講自己的服務(wù)器狀態(tài)變更為 LOOKING,然后開始進(jìn)入 Leader 選舉過程?! ?/p>

(2) 每個(gè)Server會(huì)發(fā)出一個(gè)投票。在運(yùn)行期間,每個(gè)服務(wù)器上的 ZXID 可能不同,此時(shí)假定 ZK1 的 ZXID 為 124,ZK3 的 ZXID 為 123;在第一輪投票中,ZK1 和 ZK3 都會(huì)投自己,產(chǎn)生投票(1, 124),(3, 123),然后各自將投票發(fā)送給集群中所有機(jī)器?! ?/p>

(3) 接收來(lái)自各個(gè)服務(wù)器的投票。與啟動(dòng)時(shí)過程相同?! ?/p>

(4) 處理投票。與啟動(dòng)時(shí)過程相同,由于 ZK1 事務(wù) ID 大,ZK1 將會(huì)成為 Leader?! ?/p>

(5) 統(tǒng)計(jì)投票。與啟動(dòng)時(shí)過程相同。  

(6) 改變服務(wù)器的狀態(tài)。與啟動(dòng)時(shí)過程相同。

leader選舉是一個(gè)復(fù)雜的過程,但 ZooKeeper 服務(wù)使它非常簡(jiǎn)單。讓我們?cè)谙乱徽轮欣^續(xù)學(xué)習(xí) ZooKeepe r 安裝,以用于開發(fā)目的。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)