一、前言
前面學習了Zookeeper服務端的相關細節(jié),其中對于集群啟動而言,很重要的一部分就是Leader選舉,接著就開始深入學習Leader選舉。
二、Leader選舉
2.1 Leader選舉概述
Leader選舉是保證分布式數(shù)據(jù)一致性的關鍵所在。當Zookeeper集群中的一臺服務器出現(xiàn)以下兩種情況之一時,需要進入Leader選舉。
(1) 服務器初始化啟動。
(2) 服務器運行期間無法和Leader保持連接。
下面就兩種情況進行分析講解。
1. 服務器啟動時期的Leader選舉
若進行Leader選舉,則至少需要兩臺機器,這里選取3臺機器組成的服務器集群為例。在集群初始化階段,當有一臺服務器Server1啟動時,其單獨無法進行和完成Leader選舉,當?shù)诙シ掌鱏erver2啟動時,此時兩臺機器可以相互通信,每臺機器都試圖找到Leader,于是進入Leader選舉過程。選舉過程如下
(1) 每個Server發(fā)出一個投票。由于是初始情況,Server1和Server2都會將自己作為Leader服務器來進行投票,每次投票會包含所推舉的服務器的myid和ZXID,使用(myid, ZXID)來表示,此時Server1的投票為(1, 0),Server2的投票為(2, 0),然后各自將這個投票發(fā)給集群中其他機器。
(2) 接受來自各個服務的投票。集群的每個服務器收到投票后,首先判斷該投票的有效性,如檢查是否是本輪投票、是否來自LOOKING狀態(tài)的服務器。
(3) 處理投票。針對每一個投票,服務器都需要將別人的投票和自己的投票進行PK,PK規(guī)則如下
· 優(yōu)先檢查ZXID。ZXID比較大的服務器優(yōu)先作為Leader。
· 如果ZXID相同,那么就比較myid。myid較大的服務器作為Leader服務器。
對于Server1而言,它的投票是(1, 0),接收Server2的投票為(2, 0),首先會比較兩者的ZXID,均為0,再比較myid,此時Server2的myid最大,于是更新自己的投票為(2, 0),然后重新投票,對于Server2而言,其無須更新自己的投票,只是再次向集群中所有機器發(fā)出上一次投票信息即可。
(4) 統(tǒng)計投票。每次投票后,服務器都會統(tǒng)計投票信息,判斷是否已經(jīng)有過半機器接受到相同的投票信息,對于Server1、Server2而言,都統(tǒng)計出集群中已經(jīng)有兩臺機器接受了(2, 0)的投票信息,此時便認為已經(jīng)選出了Leader。
(5) 改變服務器狀態(tài)。一旦確定了Leader,每個服務器就會更新自己的狀態(tài),如果是Follower,那么就變更為FOLLOWING,如果是Leader,就變更為LEADING。
2. 服務器運行時期的Leader選舉
在Zookeepe