zookeeper 是如何選取主 leader 的 ?

當 leader 崩潰或者 leader 失去大多數的 follower,這時 zk 進入恢復模式,恢復模式需要重新選舉出一個新的


leader,讓所有的 Server 都恢復到一個正確的狀態。 Zk 的選舉算法有兩種:一種是基於 basic paxos 實現
的,另外一種是基於 fast paxos 算法實現的。系統默認的選舉算法為 fast paxos。
1、 Zookeeper 選主流程(basic paxos)
(1)選舉線程由當前 Server 發起選舉的線程擔任,其主要功能是對投票結果進行統計,並選出推薦的Server;
(2)選舉線程首先向所有 Server 發起一次詢問(包括自己);
(3)選舉線程收到回覆後,驗證是否是自己發起的詢問(驗證 zxid 是否一致),然後獲取對方的 id(myid),並存儲到當前詢問對象列表中,最後獲取對方提議的 leader 相關信息(id,zxid),並將這些信息存儲到當次選舉的投票記錄表中;
(4)收到所有 Server 回覆以後,就計算出 zxid 最大的那個 Server,並將這個 Server 相關信息設置成下一次
要投票的 Server;
(5)線程將當前 zxid 最大的 Server 設置為當前 Server 要推薦的 Leader,如果此時獲勝的 Server 獲得 n/2+ 1 的 Server 票數,設置當前推薦的 leader 為獲勝的 Server,將根據獲勝的 Server 相關信息設置自己的狀態,否則,繼續這個過程,直到 leader 被選舉出來。 通過流程分析我們可以得出:要使 Leader 獲得多數Server 的支持,則 Server 總數必須是奇數 2n+1,且存活的 Server 的數目不得少於 n+1. 每個 Server 啟動後都會重複以上流程。在恢復模式下,如果是剛從崩潰狀態恢復的或者剛啟動的 server 還會從磁盤快照中恢復數據和會話信息,zk 會記錄事務日誌並定期進行快照,方便在恢復時進行狀態恢復 。


2、 Zookeeper 選主流程(basic paxos)fast paxos 流程是在選舉過程中,某 Server 首先向所有 Server 提議自己要成為 leader,當其它 Server 收到提議以後,解決 epoch 和 zxid 的衝突,並接受對方的提議,然後向對方發送接受提議完成的消息,重複這個流程,最後一定能選舉出 Leader。


分享到:


相關文章: