1. 程式人生 > >Zookeeper選舉原理

Zookeeper選舉原理

ID 重復 tps AS 算法 策略 tle 狀態 應用程序

Zookeeper選舉原理

作為一個分布式應用程序協調服務,在大型網站中,其本身也是集群部署的,安裝zookeeper的時候最好是單數節點,因為要選舉。Zookeeper的leader節點是集群工作的核心,用來更新並保證leader和server具有相同的系統狀態,Follower服務器是Leader的跟隨者,用於接收客戶端的請求並向客戶端返回結果,在選舉過程中參與投票。對於客戶端來說,每個zookeeper都是一樣的。

zookeeper提供了三種選擇策略:

  • LeaderElection
  • AuthFastLeaderElection
  • FastLeaderElection

這裏僅介紹默認的算法:FastLeaderElection。

基礎概念

  • Sid:服務器id;
  • Zxid:服務器的事務id,數據越新,zxid越大;
  • epoch:邏輯時鐘,在服務端是一個自增序列,每次進入下一輪投票後,就會加1;
  • server狀態:
  • Looking(選舉狀態)
  • Leading(領導者狀態,表明當前server是leader)
  • Following(跟隨者狀態,表明當前server是Follower)
  • Observing(觀察者狀態、表明當前server是Observer)。

選舉步驟

當系統啟動或者leader崩潰後,就會開始leader的選舉。

  1. 狀態變更。服務器啟動的時候每個server的狀態時Looking,如果是leader掛掉後進入選舉,那麽余下的非Observer的Server就會將自己的服務器狀態變更為Looking,然後開始進入Leader的選舉狀態;

  2. 發起投票。每個server會產生一個(sid,zxid)的投票,系統初始化的時候zxid都是0,如果是運行期間,每個server的zxid可能都不同,這取決於最後一次更新的數據。將投票發送給集群中的所有機器;

  3. 接收並檢查投票。server收到投票後,會先檢查是否是本輪投票,是否來自looking狀態的server;

  4. 處理投票。對自己的投票和接收到的投票進行PK:

  • 先檢查zxid,較大的優先為leader;
  • 如果zxid一樣,sid較大的為leader;

    根據PK結果更新自己的投票,在次發送自己的投票;

  1. 統計投票。每次投票後,服務器統計投票信息,如果有過半機器接收到相同的投票,那麽leader產生,如果否,那麽進行下一輪投票;

  2. 改變server狀態。一旦確定了Leader,server會更新自己的狀態為Following或者是Leading。選舉結束。

補充說明:

  1. 在步驟2發送投票的時候,投票的信息除了sidzxid,還有:

    • electionEpoch:邏輯時鐘,用來判斷多個投票是否在同一輪選舉周期中,該值在服務端是一個自增序列,每次進入新一輪的投票後,都會對該值進行加1操作。
    • peerEpoch:被推舉的Leader的epoch。
    • state:當前服務器的狀態。
  2. 為了能夠相互投票,每兩臺服務器之間都會建立網絡連接,為避免重復建立TCP連接,zk的server只允許sid大於自己的服務器與自己建立連接,否則斷開當前連接,並主動和對方建立連接。

參考:

https://www.cnblogs.com/felixzh/p/5869212.html

https://www.cnblogs.com/leesf456/p/6107600.html

https://www.cnblogs.com/ASPNET2008/p/6421571.html

Zookeeper選舉原理