Zookeeper leader選舉

2020-11-19 14:38 更新

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

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

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

2、事務(wù)ID

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

3、Zookeeper 集群初始化啟動時 Leader 選舉

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

20180128213955030

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

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

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

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

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

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

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

4、Zookeeper 集群運行期間 Leader 重新選

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

201802

 

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

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

(3) 接收來自各個服務(wù)器的投票。與啟動時過程相同?! ?/p>

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

(5) 統(tǒng)計投票。與啟動時過程相同?! ?/p>

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

leader選舉是一個復(fù)雜的過程,但 ZooKeeper 服務(wù)使它非常簡單。讓我們在下一章中繼續(xù)學(xué)習(xí) ZooKeepe r 安裝,以用于開發(fā)目的。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號