Leader選舉算法

7.6.1 Leader選舉算法概述

在paxos到zookeeper這本書里對Leader選舉并沒有詳細的介紹,只是輕描帶過,上一節講到Leader選舉算法的設計思路:

很簡單,找所有機器中擁有最大ZXID的事務Proposal的服務器。1.可以保證新Leader一定具有所有已經提交的事務。2.可以省去Leader服務器檢查Proposal的提交和廢棄。
Leader選舉的一些概念

1.服務器狀態:具有四種狀態,分別是LOOKING、FOLLOWING、LEADING、OBSERVING。

LOOKING:尋找Leader狀態。當服務器處于該狀態時,它會認為當前集群中沒有Leader,因此需要進入Leader選舉狀態。
FOLLOWING:跟隨者狀態。表明當前服務器角色是Follower。
LEADING:領導者狀態。表明當前服務器角色是Leader。
OBSERVING:觀察者狀態。表明當前服務器角色是Observer
何時需要Leader選舉

集群服務器初始化啟動時
集群服務器運行期建Leader宕機或失聯
服務器啟動時期的Leader選舉

若要進行Leader選舉,至少需要兩臺機器.我們假設現在集群中有三臺zk服務器.簡單描述起見,我們描述當兩臺服務器啟動時選舉的場景。選舉過程如下:

1.每個Server發起一個投票: 由于是第一輪投票,大家都會講自己作為Leader服務器來進行投票,每次投票會包含鎖推舉的服務器的myid(設置zk服務器集群時需要配置一個myid) 和ZXID,我們使用(myid,ZXID)來表示,此時Server1的投票為(1,0),Server2的投票為(2,0),然后各自將這個投票發給集群中的其他機器.
2.接收來自各個服務器的投票: 集群的每個服務器接收到來自別人的投票時,先判斷該投票是否有效:如是否是本輪投票,是否來自LOOKING狀態的服務器等等
3.處理投票: 針對每一個投票,服務器都需要將別人的投票和自己的投票進行PK,規則如下:
優先檢查ZXID,ZXID大的服務器優先獲得選票
如果ZXID相同,那么久比較myid.myid大的服務器優先獲取
對于Server1而言, 他的投票是(1,0),接收到Server2的投票為(2,0),根據上面的投票規則,1.比較ZXID,相同 2.比較myid,于是Server1將自己的選票更新為(2,0),而Server2無需變更,再次向集群中所有機器發送(2,0)的投票結果即可
4.統計選票: 每次投票后,服務器都會統計投票結果,判斷是否已經有半數機器接受到相同的投票信息,因此當第二輪投票結束后,得到統一結果為(2,0),此時myid為2的Server2就是Leader
5.改變服務器狀態: 一旦確定Leader,每個服務器就會變更自己的狀態,如果是Follower,那么狀態就是FOLLOWING,如果是Leader,就變更為LEADING。
集群運行中的Leader選舉

假設原先集群中正常運行的有Server1,Server2,Server3三臺服務器,當前Leader是Server2,若當某一時刻Leader掛了,此時Leader選舉過程如下:
1.變更狀態: Leader掛掉以后,余下的非Observer服務器都會將自己的服務器狀態變更為LOOKING,然后開始進入Leader選舉過程.
2.每個Server發起一個投票: 在運行期間,每個服務器的ZXID可能不同,此時假定Server1的ZXID為123,則Server1的投票數據為(1,123);Server3的ZXID為122,則Server1的投票數據為(3,122);然后大家趕緊向其他服務器發消息,找一個老大
3.接收來自各個服務器的投票。 與啟動時過程相同。
4.處理投票。 與啟動時過程相同,此時,Server1將會成為Leader。
5.統計投票。 與啟動時過程相同。
6.改變服務器的狀態。 與啟動時過程相同。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容