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的狀態為looking
伺服器2
先投自己1票,將自己的選票結果同步給伺服器1。 伺服器1 發現伺服器2的sid編號比自己大,於是進行改票,把自己的選票投給了伺服器2,並同步給伺服器2。
此時雙方的投票箱結果為:
伺服器1,獲0票;
伺服器2,獲2票;
並沒有超過票數過半的機器。選舉依然無法完成,此時伺服器2的狀態仍為looking
- 伺服器3
先投自己1票,將自己的選票結果同步給伺服器1、伺服器2。 伺服器1和伺服器2 ,發現伺服器3的sid編號比自己還大,所以趕緊進行改票,都投給了伺服器3。
此時投票箱的結果為:
伺服器1,獲0票;
伺服器2,獲2票;
伺服器3,獲3票;
發現有票數過半的機器,於是伺服器3,當仁不讓成了leader。此時更改伺服器1、2的狀態為 following,伺服器3為leading
- 伺服器4
先投自己1票,同步自己選票時,發現伺服器1、2、3 已經不是looking狀態了,於是取得投票箱結果,將自己的選票改投給伺服器3,自己的狀態更改為following
- 服務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 協議》,轉載必須註明作者和本文連結