Zookeeper學習總結(中)——Leader選舉
阿新 • • 發佈:2018-12-19
“深入一點,會更快樂。”
——題記
Leader選舉是ZooKeeper最重要的技術之一,也是保證分散式資料一致性的關鍵所在。
1 預備知識
1.1 術語解釋
- SID:伺服器ID,唯一標識一臺zk中的伺服器,和myid的值一致。
- ZXID:事務ID,標識伺服器狀態的變更。
- Vote:投票
- Quorum:過半機器數。如果叢集總機器數是n的話,quorum=(n/2+1)。例如有3臺機器,那quorum就等於2。
1.2 叢集伺服器的狀態
(1)伺服器的3種角色:
- Leader:主要工作:1)事務請求的唯一排程和處理者;2)叢集內部伺服器的排程者。
- Follower:主要工作:1)處理非事務請求,轉發事務請求給Leader;2)參與Proposal投票;3)參與Leader選舉投票。
- Observer:和Follower的區別:只提供非事務服務,不參與人任何投票,包括事務Proposal和Leader選舉。作用是在不影響叢集事務處理能力的前提下提升叢集的非事務處理能力。
(2)伺服器的4種狀態:
- LOOKING:尋找Leader狀態。處於該狀態的伺服器認為當前叢集中沒有Leader,需要選舉;
- FOLLOWING:跟隨者狀態,對應角色Follower。
- LEADING:領導者狀態,對應角色Leader。
- OBSERVEING:觀察者狀態,對應角色Observer
1.3 投票資料結構
org.apache.zookeeper.server.quorum.Vote
屬性 | 說明 |
id | 被推舉的Leader的SID值 |
zxid | 被推舉的Leader的事務ID |
electionEpoch | 邏輯時鐘,用於判斷多個投票是否在同一個選舉週期中。在服務端是一個自增序列,沒進入新一輪投票,就會對該值加1 |
peerEpoch | 被推舉的Leader的epoch |
state | 當前伺服器的狀態 |
2 Leader選舉
2.1 伺服器啟動時的Leader選舉
假設一個zk叢集中有三臺機器,初始狀態:
伺服器 | myid | ZXID |
Server1 | 1 | 0 |
Server2 | 2 | 0 |
Server3 | 3 | 0 |
我們用(myid, ZXID)標識一張投票。
1)初始情況,所有伺服器投票給自己。
Server1先啟動,投票給Server1;Server2後啟動,投票給Server2。然後將各自的投票發給叢集中的其他伺服器,這樣每臺伺服器看到的投票資訊就是:
伺服器 | 看到的投票 |
Server1 | (1,0),(2,0) |
Server2 | (2,0),(1,0) |
Sever3 | 尚未投票 |
2)處理投票
投票PK規則:
- 優先檢查ZXID,ZXID較大的伺服器優先作為Leader;
- 如果ZXID相同的話,就比較myid,myid較大的伺服器作為Leader。(myid不可能相同,這個值是叢集中每臺伺服器的唯一識別符號)
於是,每臺伺服器對自己看到的所有選票進行處理,結果就是:
伺服器 | 投票處理結果 |
Server1 | (2,0) |
Server2 | (2,0) |
Server3 | 尚未投票 |
3)統計投票
伺服器 | 得票數 |
Server1 | 0票 |
Server2 | 2票 |
Sever3 | 尚未投票 |
顯然,Server2得票數2已經過半了(大於等於(n/2+1)就算過半),成為Leader。
4)改變伺服器狀態
一旦確定了Leader,每臺伺服器就會更新自己的狀態:如果是Follower,就會變成FOLLOWING;如果是Leader,就會變成LEADING。