zookeepr選舉算法

源碼下載:

http://www.java2s.com/Code/Jar/z/Downloadzookeeper345sourcesjar.htm


選舉算法

2.4.1 LeaderElection選舉算法


選舉線程由當前Server發起選舉的線程擔任,他主要的功能對投票結果進行統計,並選出推薦的Server。選舉線程首先向所有Server發起一次詢問(包括自己),被詢問方,根據自己當前的狀態作相應的回覆,選舉線程收到回覆後,驗證是否是自己發起的詢問(驗證xid 是否一致),然後獲取對方的id(myid),並存儲到當前詢問對象列表中,最後獲取對方提議 的

leader 相關信息(id,zxid),並將這些 信息存儲到當次選舉的投票記錄表中,當向所有Serve r

都詢問完以後,對統計結果進行篩選並進行統計,計算出當次詢問後獲勝的是哪一個Server,並將當前zxid最大的Server 設置爲當前Server要推薦的Server(有可能是自己,也有可以是其它的Server,根據投票結果而定,但是每一個Server在第一次投票時都會投自己),如果此時獲勝的Server獲得n/2 + 1Server票數,設置當前推薦的leader爲獲勝Server。根據獲勝的Server相關信息設置自己的狀態。每一個Server都重複以上流程直到選舉出Leader

初始化選票(第一張選票): 每個quorum節點一開始都投給自己;

收集選票使用UDP協議儘量收集所有quorum節點當前的選票(單線程/同步方式),超時設置200ms;

統計選票: 1).每個quorum節點的票數;

         2).爲自己產生一張新選票(zxidmyid均最大);

選舉成功某一個quorum節點的票數超過半數;

更新選票在本輪選舉失敗的情況下,當前quorum節點會從收集的選票中選取合適的選票(zxidmyid均最大)作爲自己下一輪選舉的投票;

異常問題的處理

1). 選舉過程中,Server的加入

當一個Server啓動時它都會發起一次選舉,此時由選舉線程發起相關流程,那麼每個 Serve r都會獲得當前zxi d最大的哪個Serve r是誰,如果當次最大的Serve r沒有獲得n/2+1 個票數,那麼下一次投票時,他將向zxid最大的Server投票,重複以上流程,最後一定能選舉出一個Leader

2). 選舉過程中,Server的退出

只要保證n/2+1Server存活就沒有任何問題,如果少於n/2+1Server 存活就沒辦法選出Leader

3). 選舉過程中,Leader死亡

當選舉出Leader以後,此時每個Server應該是什麼狀態(FLLOWING)都已經確定,此時由於Leader已經死亡我們就不管它,其它的Fllower按正常的流程繼續下去,當完成這個流程以後,所有的Fllower都會向Leader發送Ping消息,如果無法ping通,就改變自己的狀爲(FLLOWING ==> LOOKING),發起新的一輪選舉。

4). 選舉完成以後,Leader死亡

處理過程同上。

5). 雙主問題

Leader的選舉是保證只產生一個公認的Leader的,而且Follower重新選舉與舊Leader恢復並退出基本上是同時發生的,當Follower無法pingLeader是就認爲Leader已經出問題開始重新選舉,Leader收到Followerping沒有達到半數以上則要退出Leader重新選舉。

2.4.2 FastLeaderElection選舉算法

FastLeaderElection是標準的fast paxos的實現,它首先向所有Server提議自己要成爲leader,當其它Server收到提議以後,解決 epoch 和 zxid 的衝突,並接受對方的提議,然後向對方發送接受提議完成的消息。

FastLeaderElection算法通過異步的通信方式來收集其它節點的選票,同時在分析選票時又根據投票者的當前狀態來作不同的處理,以加快Leader的選舉進程。

每個Server都一個接收線程池和一個發送線程池在沒有發起選舉時,這兩個線程池處於阻塞狀態,直到有消息到來時才解除阻塞並處理消息,同時每個Serve r都有一個選舉線程(可以發起選舉的線程擔任)

1). 主動發起選舉端(選舉線程)的處理

首先自己的 logicalclock1,然後生成notification消息,並將消息放入發送隊列中, 系統中配置有幾個Server就生成幾條消息,保證每個Server都能收到此消息,如果當前Server 的狀態是LOOKING就一直循環檢查接收隊列是否有消息,如果有消息,根據消息中對方的狀態進行相應的處理。

2).主動發送消息端(發送線程池)的處理

將要發送的消息由Notification消息轉換成ToSend消息,然後發送對方,並等待對方的回覆。

3). 被動接收消息端(接收線程池)的處理

將收到的消息轉換成Notification消息放入接收隊列中,如果對方Serverepoch小於logicalclock則向其發送一個消息(讓其更新epoch);如果對方Server處於Looking狀態,自己則處於FollowingLeading狀態,則也發送一個消息(當前Leader已產生,讓其儘快收斂)


2.4.3 AuthFastLeaderElection選舉算法

AuthFastLeaderElection算法同FastLeaderElection算法基本一致,只是在消息中加入了認證信息,該算法在最新的Zookeeper中也建議棄用。


來源:http://blog.csdn.net/xhh198781/article/details/10949697

發佈了5 篇原創文章 · 獲贊 11 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章