Zookeeper 的選舉機制也不過如此!

Java程式設計大本營發表於2021-03-26

Zookeeper 是一個分散式服務框架,主要是用來解決分散式應用中遇到的一些資料管理問題如:統一命名服務狀態同步服務叢集管理分散式應用配置項的管理等。

我們可以簡單把 Zookeeper 理解為分散式家庭的大管家,那麼管家團隊是如何選出Leader的呢?好奇嗎,接下來帶領大家一探究竟。

人類選舉的基本原理

講解 Zookeeper 選舉過程前先來介紹一下人類的選舉。
我們每個人或多或少都經歷過幾次選舉,在投票的過程中可能會遇到這樣幾種情況:

情況1:自己和候選人熟,將票投給你認為能力強的那個人;

情況2:自己也是候選人,會想著拉票,但是發現別人能力比你強,就將自己的票投給別的候選人。

所有人投票完後,統計投票箱中票數最多的候選人,當選領導。

在整個投票過程中我們可以提煉出四個最核心的概念:

候選人能力: 投票的基本原則是選最強的人。

遇強改投: 如果後面發現更強的人可以改投票。

投票箱: 所有人的票都會放在投票箱。

領導者: 得票最多的人即為領導者。

從人類選舉的原理我們來簡單推導一下Zookeeper的選舉原理。

Zookeeper選舉的基本原理

如果zookeeper是單機部署,不是叢集模式,那麼不存在選舉的問題。

zookeeper 的選舉和人類選舉基本一樣,借用上面說的4個核心概念,來說說選舉的基本原理。

  • 候選人能力

zookeeper 通過 sid 和zxid (事物ID) 來證明自己的能力強弱。

zxid 的全稱是 ZooKeeper Transaction Id,即 Zookeeper 事務id。 資料的最新版本號 , 資料越大說明能力越強。

sid , 我們自定義的伺服器編號ID,值越大證明能力越大。

  • 遇強改投

在選舉的時候,每臺zookeeper 節點都會認為自己是最強的,會先投票給自己(選票上包含sid、zxid)。

然後將選票傳遞給叢集中的每個節點,同時自己也會接收其他節點發過的選票。節點接收到選票後,會判斷選票上節點的能力強弱,如果發現比自己強,那麼就進行改票,把自己的選票投給能力強的。然後在傳遞給叢集中的每個節點。

  • 投票箱

與人類選舉不同,zookeeper 叢集中,每個節點都會維護一份投票箱。 因為每個節點的選票都會同步給每個叢集中的節點,所以投票箱的結果都是一致的。

  • 領導者

投票的過程中,只要發現票數有超過一半的節點,領導就選擇成功,投票也就宣告結束。

什麼場景下 Zookeeper 需要選舉?

當zookeeper 叢集中有一臺機器發生以下場景,就會進行選舉。

  • 機器啟動
  • 機器執行期間leader當機

機器啟動選舉


假設5臺zookeeper依次啟動,sid的編號依次為1-5。

  1. 伺服器1

    先投自己1票,投票箱票數不過半,選舉無法完成。此時伺服器-1的狀態為looking

  2. 伺服器2

先投自己1票,將自己的選票結果同步給伺服器1。 伺服器1 發現伺服器2的sid編號比自己大,於是進行改票,把自己的選票投給了伺服器2,並同步給伺服器2。

此時雙方的投票箱結果為:

伺服器1,獲0票;

伺服器2,獲2票;

並沒有超過票數過半的機器。選舉依然無法完成,此時伺服器2的狀態仍為looking

  1. 伺服器3

先投自己1票,將自己的選票結果同步給伺服器1、伺服器2。 伺服器1和伺服器2 ,發現伺服器3的sid編號比自己還大,所以趕緊進行改票,都投給了伺服器3。

此時投票箱的結果為:

伺服器1,獲0票;
伺服器2,獲2票;
伺服器3,獲3票;

發現有票數過半的機器,於是伺服器3,當仁不讓成了leader。此時更改伺服器1、2的狀態為 following,伺服器3為leading

  1. 伺服器4

先投自己1票,同步自己選票時,發現伺服器1、2、3 已經不是looking狀態了,於是取得投票箱結果,將自己的選票改投給伺服器3,自己的狀態更改為following

  1. 服務5

同伺服器4 一致。

最終的結果是:伺服器3是leader,其他全是follow。

機器執行期間leader當機選舉


zookeeper執行期間,當leader 當機,整體會對外暫停服務提供,觸發新的一輪選舉。觸發新選舉的時候,每臺txid可能都不一樣的。還是以剛才上面的案例進行分析,假設伺服器3 leader 當機,txid為分別為, 伺服器1(99),伺服器2(102),伺服器4(100),伺服器5(101)。

投票的過程和初始化的基本類似,主要為以下幾個步驟:

1)狀態變更,除Obsever狀態的其他伺服器全部變更為looking,然後進行leader的選舉過程

2)每個伺服器先投自己一票,然後同步選票

3)每個伺服器都會收到各個伺服器的投票,如果發現有txid比自己大的,會進行改票

4)處理和統計投票,每一輪投票結束後都會統計投票,超過半數即可當選。

5)改變伺服器的狀態,宣佈當選

直接看圖:

很顯然,最後伺服器2 被當選為新的leader。

選舉機制中涉及到的核心概念

  • sid(伺服器ID、serverId)

伺服器編號,編號越大,在選舉leader時權重越大。

  • zxid (事物ID)

資料的版本號,數值越大資料越新,在選舉leader演算法中,越大權重越大咯

  • Epoch(邏輯時鐘)

也叫投票的次數,同一輪投票過程中的邏輯時鐘值是相同的,每投完一次票這個資料就會增加。

  • Server狀態(選舉狀態)

    looking: 競選狀態。

following: 隨從狀態,同步leader狀態,參與投票。

observing: 觀察狀態,同步leader狀態,不參與投票。

leading: 領導者狀態。

總結

(1)Zookeeper 選舉會發生在伺服器初始狀態和執行狀態下。

(2)初始狀態下會根據伺服器sid的編號對比,編號越大權值越大,投票過半數即可選出Leader。

(3)Leader 故障會觸發新一輪選舉,zxid 代表資料越新,權值也就越大。

(4)在執行期選舉還可能會遇到腦裂的情況,大家可以自行學習。

來源:4m.cn/zmR0u

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章