何時須要進行選舉?服務器
當Zookeeper集羣中的一臺服務器出現如下兩種狀況之一時,須要進行Leader選舉:大數據
1)服務器初始化啓動spa
2)服務器運行期間沒法和Leader保持鏈接server
怎樣進行選舉?class
1.服務器初始化啓動的Leader選舉集羣
前提:至少須要兩臺服務器,當只有一臺服務器時,其單獨沒法進行Leader選舉,當有兩臺服務器時,而且他們之間能夠相互通訊,此時才能進入選舉狀態統計
選舉過程:通信
1)每臺服務器發出本身的投票。初始投票每臺服務器都會投本身,投票內容爲(myid,ZXID,Epoch)數據
2)接收來自各個服務器的投票。每臺服務器接收到其餘服務器的投票後,首先判斷該投票的有效性(根據Epoch判斷是否爲本輪投票,是否來自LOOKING狀態的服務器)tab
3)處理投票。針對接收到的每個投票,都須要將該投票與本身的投票進行PK,規則以下:
1)首先檢查ZXID,ZXID大的服務器優先做爲Leader
2)ZXID相同,myid大的服務器做爲Leader
4)將投票的處理結果發送給其餘服務器,進行從新投票。
5)統計投票結果。若超過半數的服務器接受到相同的投票信息,則即可以認爲選出了Leader。
6)改變服務器狀態。一旦肯定了Leader,每臺服務器根據選舉結果,更新本身的狀態爲Leader或是Follower。
//啓動的順序不一樣,選舉的結果有可能不一樣
2.服務器運行期間的Leader選舉
前提:Leader服務器掛了。在服務器運行期間,Follower服務器掛掉不會影響Leader,只有當Leader服務器掛掉,纔會進入選舉狀態。此時,整個集羣暫停對外的服務,進入選舉狀態。
選舉過程:
1)變動狀態。Leader掛掉,其餘的Observer服務器都會將本身的服務器狀態變動爲Looking,並進入選舉過程。
。。。與初始化啓動選舉過程一致
1)Looking:尋找Leader狀態。擁有此狀態及服務器會進入Leader選舉狀態
2)Follower:跟隨者狀態。代表當前服務器的角色爲Follower
3)Leading:領導者狀態。代表當前服務器的角色爲Leader
4)Observing:觀察者狀態。表名當前服務器的角色爲Observer
myid:服務器ID,編號越大在選舉中所佔權重越大
ZXID:服務器中存放的最大數據ID,值越大代表數據越新,在選舉中所佔權重越大。
Epoch:邏輯時鐘,每一輪投票過程當中邏輯時鐘必須是相同的,每投完一輪這個數值就會增長。