ZooKeeper 的 Leader 選舉機(jī)制

選舉機(jī)制中的概念:

Serverid:服務(wù)器 ID。 編號(hào)越大在選擇算法中權(quán)重越大。

Zxid:數(shù)據(jù) ID。ZooKeeper 狀態(tài)的每一次改變,都對(duì)應(yīng)著一個(gè)遞增的 Transaction id,該 id 稱為 Zxid,由于 zxid 的遞增性質(zhì),如果 zxid1 小于 zxid2,那么 zxid1 肯定優(yōu)先于 zxid2 發(fā)生。

創(chuàng)建任意節(jié)點(diǎn),或者更新任意節(jié)點(diǎn)的數(shù)據(jù),或者刪除任意節(jié)點(diǎn),都會(huì)導(dǎo)致 ZooKeeper 狀態(tài)發(fā)生改變,從而導(dǎo)致 zxid 的值增加。

Epoch:邏輯時(shí)鐘?;蛘呓型镀钡拇螖?shù),同一輪投票過程中邏輯時(shí)鐘值是相同的。用來判斷多個(gè)投票是否在同一輪選舉周期中,該值在服務(wù)端是一個(gè)自增序列,每次進(jìn)入新一輪的投票后,都會(huì)對(duì)該值進(jìn)行加1操作。

Server 狀態(tài):選舉狀態(tài)。LOOKING,競(jìng)選狀態(tài);FOLLOWING,隨從狀態(tài),同步 leader 狀態(tài),參與投票。OBERSERVING,觀察狀態(tài),同步 leader 狀態(tài),不參與投票。LEADING,領(lǐng)導(dǎo)者狀態(tài)。

服務(wù)器啟動(dòng)時(shí)期的 leader 選舉:

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

1)每個(gè) Server 發(fā)出一個(gè)投票。由于是初識(shí)情況,Serve1 和 Server2 都會(huì)將自己作為 Leader 服務(wù)器來進(jìn)行投票,每次投票會(huì)白喊所推舉的服務(wù)器 serverid 和 zxid,使用(ServerID,zxid)來表示,此時(shí) Server1 的投票為(1,0),Server2 的投票為(2,0),然后各自將這個(gè)投票發(fā)給集群中其它機(jī)器。

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

判斷邏輯時(shí)鐘規(guī)則:

  1. 如果發(fā)送過來的邏輯時(shí)鐘 Epoch 大于目前的邏輯時(shí)鐘。首先,更新本邏輯時(shí)鐘 Epoch,同時(shí)清空本輪邏輯時(shí)鐘收集到的其它 server 的選舉數(shù)據(jù)。然后判斷是否需要更新檔期自己的選舉 leader serverid。

  2. 如果發(fā)送公立的邏輯時(shí)鐘 Epoch 小于目前的邏輯時(shí)鐘。說明對(duì)方 server 在一個(gè)相對(duì)較早的 Epoch 中,只需要經(jīng)本機(jī)的選舉數(shù)據(jù)發(fā)送出去就行。

    一般情況下,邏輯時(shí)鐘應(yīng)該都是相同的。但是,由于一些機(jī)器崩潰的問題,是可能出現(xiàn)邏輯時(shí)鐘不一致的情況的。

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

  • 優(yōu)先檢查 zxid。zxid 較大的服務(wù)器優(yōu)先作為 Leader。
  • 如果 zxid 相同,那么就比較serverid。serverid 較大的服務(wù)器作為 Leader 服務(wù)器。

對(duì)于 server1 而言,它的投票是(1,0),接收 server2 的投票為(2,0),首先會(huì)比較兩者的 zxid,均為 0,再比較 serverid,此時(shí) server2 的 serverid 最大,于是更新自己的投票為(2,0),然后重新投票,對(duì)于 server2 而言,其無須更新自己的投票,只是再次向急群眾所有機(jī)器發(fā)出上一次投票信息即可。

4)統(tǒng)計(jì)投票。每次投票后,服務(wù)器都會(huì)統(tǒng)計(jì)投票信息,判斷是否已經(jīng)有過半機(jī)器接收到形態(tài)的投票信息,對(duì)于 server1,server2 而言,都統(tǒng)計(jì)出集群中已經(jīng)有連你給他機(jī)器接收了(2,0)的投票信息,此時(shí)便認(rèn)為已經(jīng)選出了 Leader。

5)改變服務(wù)器狀態(tài)。一旦確定了 Leader,每個(gè)服務(wù)器都會(huì)更新自己的狀態(tài),如果是 Follower,那么就變更為 FOLLOWING,如果是 Leader,就變更為 LEADING。

服務(wù)器運(yùn)行時(shí)期的 Leader 選舉

在 ZooKeeper 運(yùn)行期間,但是光有非 Leader 服務(wù)器宕機(jī)或者新加入,此時(shí)不會(huì)影響 Leader,但是一旦 Leader 服務(wù)器管理,那么整個(gè)集群將暫停對(duì)外服務(wù),進(jìn)入新一輪 Leader 選舉,其過程和啟動(dòng)時(shí)期的 Leader 選舉過程基本一致。假設(shè)正在運(yùn)行的 Server1、Server2、Server3三臺(tái)服務(wù)器,當(dāng)前Leader 是 Server2,若某一時(shí)刻Leader 掛了,此時(shí)便開始 Leader 選舉。過程如下:

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

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

3)接胡搜來自各個(gè)服務(wù)的投票。與啟動(dòng)過程相同。

4)處理投票。與啟動(dòng)過程相同,此時(shí) Server1 將會(huì)成為 Leader。

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 【轉(zhuǎn)自】http://www.cnblogs.com/leesf456/p/6107600.html 一、前言 前...
    lxqfirst閱讀 895評(píng)論 0 0
  • 一、前言 前面學(xué)習(xí)了Zookeeper服務(wù)端的相關(guān)細(xì)節(jié),其中對(duì)于集群?jiǎn)?dòng)而言,很重要的一部分就是Leader選舉,...
    阿斯蒂芬2閱讀 17,731評(píng)論 4 19
  • zookeeper集群中往往需要在集群服務(wù)器中選舉出一個(gè)Leader,Leader選舉是保證分布式數(shù)據(jù)一致性的關(guān)鍵...
    探索者_(dá)逗你玩兒閱讀 520評(píng)論 0 0
  • 若進(jìn)行Leader選舉,則至少需要兩臺(tái)機(jī)器,這里選取3臺(tái)機(jī)器組成的服務(wù)器集群為例。在集群初始化階段,當(dāng)有一臺(tái)服務(wù)器...
    白紙糊閱讀 1,022評(píng)論 0 1
  • 一、Leader選舉過程 Leader選舉是保證分布式數(shù)據(jù)一致性的關(guān)鍵所在。當(dāng)Zookeeper集群中的一臺(tái)服務(wù)器...
    yannhuang閱讀 1,294評(píng)論 0 2

友情鏈接更多精彩內(nèi)容