zookeeper leader選舉

     如何在zookeeper集羣中選舉出一個leader,zookeeper使用了三種算法,具體使用哪一種算法,在配置文件中是能夠配置的,對應的配置項是」electionAlg」,其中1對應的是LeaderElection算法,2對應的是AuthFastLeaderElection算法,3對應的是FastLeaderElection算法.默認使用FastLeaderElection算法,此處僅以默認算法流程;
     首先了解幾個屬性:
      electionEpoch:每執行一次leader選舉,electionEpoch就會自增,用來標記leader選舉的輪次
      peerEpoch:每次leader選舉完成以後,都會選舉出一個新的peerEpoch,用來標記事務請求所屬的輪次
      serverID:配置文件中配置的每一個服務器對應的ID
      zxid:爲了保證事務一致性,zk採用了遞增的事務ID號(zxid)來標識事務。全部的提議都在唄提出的時候加上了zxid。實現中,zxid是一個64位的數字,它高32位是epoch用來標識leader關係是否改變,每次一個leader被選出來,它都會有一個新的peerEpoch,標識當前屬於那個leader的通知時期,低32位用於遞增計數;
     選舉狀態:
          Looking: 當前server不知道leader是誰,正在搜尋
          Following:leader已經選舉出來,當前server與之同步
          Leading:當前server即爲選舉出來的leader
          Observing:大多數行爲與following一致,可是不參加選舉,只接受選舉的結果html

   選舉發送內容:
     serverID,zxid,peerEpoch,當前選舉狀態;算法

   選舉流程:
     1.每一個服務器都發送本身選舉的leader,首輪會發送的選票都會投給本身;
     2.服務器收到其餘服務器的選票:
      收到的推薦人是looking狀態:
       首先判斷邏輯時間:
         (1) 收到的選票邏輯時間大於目前的邏輯時鐘,則說明選舉已經進入新一輪了,因此須要更新本機邏輯時間,並清空以前收到的選票信息;而後更新選票信息,廣播出去;
         (2) 收到的選票邏輯時間等於目前的邏輯時鐘,則判斷是否須要更新推薦人,如更新,則廣播出去; 
       而後記錄選票信息,本地進行選舉,如選舉出來,則等待一段時間沒有新的選票後,則進行角色確認,更改狀態返回最終選票;
      收到的推薦人是following、leading狀態:
       (1)  收到的選票邏輯時間等於目前的邏輯時鐘,進行本地選舉,並肯定收到的選票爲leader,若是肯定,則進行角色確認,返回最終選票
       (2)  若是上一步沒有肯定角色且返回最終選票,則將選票存入outofelection中,進行再次選舉,若是能肯定出leader,且肯定收到的選票爲leader,若是肯定,則進行角色確認,返回最終選票;
  流程圖:
       
  選舉斷定:
       依次斷定peerEpoch,zxid,serverId
        
   
    
 選舉源碼類:
      FastLeaderElection,實現Election接口的lookForLeader方法,從類關係上來看,AuthFastLeaderElection,LeaderElection這兩個實現類已經被廢棄,目前僅剩FastLeaderElection這個實現類;
      服務器

 以上爲最近根據源碼及網上資料總結,總結的過程當中可使本身的理解更深入,
 spa

 
   參考資料: 
    http://codemacro.com/2014/10/19/zk-fastleaderelection/ 
    http://http://www.cnblogs.com/leesf456/p/6508185.html 
    http://blog.jobbole.com/107583/code

相關文章
相關標籤/搜索