Zookeeper的Leader選舉哪些事

閱讀文本大概需要3分鐘。

        

        Leader選舉是保證分佈式數據一致性的關鍵所在。Leader選舉分爲Zookeeper集羣初始化啓動時選舉和Zookeeper集羣運行期間Leader重新選舉兩種情況。在講解Leader選舉前先了解一下Zookeeper節點4種可能狀態和事務ID概念。

0x01、Zookeeper節點狀態

  • LOOKING:尋找Leader狀態,處於該狀態需要進入選舉流程

  • LEADING:領導者狀態,處於該狀態的節點說明是角色已經是Leader

  • FOLLOWING:跟隨者狀態,表示Leader已經選舉出來,當前節點角色是follower

  • OBSERVER:觀察者狀態,表明當前節點角色是observer

0x02、事務ID

        ZooKeeper狀態的每次變化都接收一個ZXID(ZooKeeper事務id)形式的標記。ZXID是一個64位的數字,由Leader統一分配,全局唯一,不斷遞增。

ZXID展示了所有的ZooKeeper的變更順序。每次變更會有一個唯一的zxid,如果zxid1小於zxid2說明zxid1在zxid2之前發生。

0x03:支持的領導選舉算法

zookeeper領導的選舉算法可以通過electionAlg配置項進行設置。到3.4.10版本爲止,可選項有

  • 基於UDP的LeaderElection

  • 基於UDP的FastLeaderElection

  • 基於UDP和認證的FastLeaderElection

  • 基於TCP的FastLeaderElection

      在3.4.10版本中,默認值爲3(即基於TCP的FastLeaderElection)。另外三種算法已經被棄用,並且有計劃在之後的版本中將它們徹底刪除而不再支持。FastLeaderElection選舉算法是標準的Fast Paxos算法實現,可解決LeaderElection選舉算法收斂速度慢的問題。

0x04、選票數據結構

每個服務器在進行領導選舉時,會發送如下關鍵信息

  • logicClock 每個服務器會維護一個自增的整數,名爲logicClock,它表示這是該服務器發起的第多少輪投票

  • state 當前服務器的狀態

  • self_id 當前服務器的myid

  • self_zxid 當前服務器上所保存的數據的最大zxid

  • vote_id 被推舉的服務器的myid

  • vote_zxid 被推舉的服務器上所保存的數據的最大zxid

0x05、Zookeeper集羣初始化啓動時Leader選舉

        若進行Leader選舉,則至少需要兩臺機器,這裏選取3臺機器組成的服務器集羣爲例。

初始化啓動期間Leader選舉流程如下圖所示。

         在集羣初始化階段,當有一臺服務器ZK1啓動時,其單獨無法進行和完成Leader選舉,當第二臺服務器ZK2啓動時,此時兩臺機器可以相互通信,每臺機器都試圖找到Leader,於是進入Leader選舉過程。選舉過程開始,過程如下:

  (1) 每個Server發出一個投票。由於是初始情況,ZK1和ZK2都會將自己作爲Leader服務器來進行投票,每次投票會包含所推舉的服務器的myid和ZXID,使用(myid, ZXID)來表示,此時ZK1的投票爲(1, 0),ZK2的投票爲(2, 0),然後各自將這個投票發給集羣中其他機器。

  (2) 接受來自各個服務器的投票。集羣的每個服務器收到投票後,首先判斷該投票的有效性,如檢查是否是本輪投票、是否來自LOOKING狀態的服務器。

  (3) 處理投票。針對每一個投票,服務器都需要將別人的投票和自己的投票進行比較,規則如下

  • 優先檢查ZXID。ZXID比較大的服務器優先作爲Leader。

  • 如果ZXID相同,那麼就比較myid。myid較大的服務器作爲Leader服務器。

  對於ZK1而言,它的投票是(1, 0),接收ZK2的投票爲(2, 0),首先會比較兩者的ZXID,均爲0,再比較myid,此時ZK2的myid最大,於是ZK2勝。ZK1更新自己的投票爲(2, 0),並將投票重新發送給ZK2。

  (4) 統計投票。每次投票後,服務器都會統計投票信息,判斷是否已經有過半機器接受到相同的投票信息,對於ZK1、ZK2而言,都統計出集羣中已經有兩臺機器接受了(2, 0)的投票信息,此時便認爲已經選出ZK2作爲Leader。

  (5) 改變服務器狀態。一旦確定了Leader,每個服務器就會更新自己的狀態,如果是Follower,那麼就變更爲FOLLOWING,如果是Leader,就變更爲LEADING。當新的Zookeeper節點ZK3啓動時,發現已經有Leader了,不再選舉,直接將直接的狀態從LOOKING改爲FOLLOWING。

0x06、Zookeeper集羣運行期間Leader重新選

       在Zookeeper運行期間,如果Leader節點掛了,那麼整個Zookeeper集羣將暫停對外服務,進入新一輪Leader選舉。

       假設正在運行的有ZK1、ZK2、ZK3三臺服務器,當前Leader是ZK2,若某一時刻Leader掛了,此時便開始Leader選舉。選舉過程如下圖所示。

  (1) 變更狀態。Leader掛後,餘下的非Observer服務器都會講自己的服務器狀態變更爲LOOKING,然後開始進入Leader選舉過程。

  (2) 每個Server會發出一個投票。在運行期間,每個服務器上的ZXID可能不同,此時假定ZK1的ZXID爲124,ZK3的ZXID爲123;在第一輪投票中,ZK1和ZK3都會投自己,產生投票(1, 124),(3, 123),然後各自將投票發送給集羣中所有機器。

  (3) 接收來自各個服務器的投票。與啓動時過程相同。

  (4) 處理投票。與啓動時過程相同,由於ZK1事務ID大,ZK1將會成爲Leader。

  (5) 統計投票。與啓動時過程相同。

  (6) 改變服務器的狀態。與啓動時過程相同。

參考:http://www.jasongj.com/zookeeper/fastleaderelection/

          https://blog.csdn.net/chengyuqiang/article/details/79190061

往期精彩

01 漫談發版哪些事,好課程推薦

02 Linux的常用最危險的命令

03 互聯網支付系統整體架構詳解

04 優秀的Java程序員必須瞭解的GC哪些

05 IT大企業有哪些病,別被這些病毀了自己?

關注我每天進步一點點

你點的在看,我都當成了喜歡

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章