zookeeper集羣啓動後,各節點進入選舉過程。以3節點集羣爲例,當server1啓動後,它本身單獨沒法完成選舉。須要等集羣內其餘節點啓動。這時,server2啓動後,兩臺機器能夠相互通訊,每臺機器都試圖找到Leader,因而進入Leader選舉過程。html
(1) 每一個Server發出一個投票。因爲是初始狀況,Server1和Server2都會將本身做爲Leader服務器來進行投票,每次投票會包含所推舉的服務器的myid和ZXID,使用(myid, ZXID)來表示,此時Server1的投票爲(1, 0),Server2的投票爲(2, 0),而後各自將這個投票發給集羣中其餘機器。服務器
(2) 接受來自各個服務器的投票。集羣的每一個服務器收到投票後,首先判斷該投票的有效性,如檢查是不是本輪投票、是否來自LOOKING狀態的服務器。ide
(3) 處理投票。針對每個投票,服務器都須要將別人的投票和本身的投票進行PK,PK規則以下spa
· 優先檢查ZXID。ZXID比較大的服務器優先做爲Leader。orm
· 若是ZXID相同,那麼就比較myid。myid較大的服務器做爲Leader服務器。server
對於Server1而言,它的投票是(1, 0),接收Server2的投票爲(2, 0),首先會比較二者的ZXID,均爲0,再比較myid,此時Server2的myid最大,因而更新本身的投票爲(2, 0),而後從新投票,對於Server2而言,其無須更新本身的投票,只是再次向集羣中全部機器發出上一次投票信息便可。htm
(4) 統計投票。每次投票後,服務器都會統計投票信息,判斷是否已經有過半機器接受到相同的投票信息,對於Server一、Server2而言,都統計出集羣中已經有兩臺機器接受了(2, 0)的投票信息,此時便認爲已經選出了Leader。blog
(5) 改變服務器狀態。一旦肯定了Leader,每一個服務器就會更新本身的狀態,若是是Follower,那麼就變動爲FOLLOWING,若是是Leader,就變動爲LEADING。get
leader選舉參考http://www.javashuo.com/article/p-yuxerins-cb.html。it