Zookeeper的Leader選舉流程
一、Zookeeper集群
Zookeeper可以配置多個實例共同構成一個集群對外提供服務以達到水平擴展的目的,每個服務器上的數(shù)據(jù)都是相同的,每一個服務器均可以對外提供讀和寫的服務,這點和Redis是相同的,即對客戶端來說每個服務器都是平等的。

在集群中,需要一個Leader來完成處理事務,協(xié)調Zookeeper中的其他節(jié)點等工作,接下來就來介紹Zookeeper集群是如何選擇出一個Leader節(jié)點的。
1. ZK集群中服務器的狀態(tài)
Zookeeper集群中服務器被劃分為以下四種狀態(tài)
LOOKING:尋找Leader狀態(tài)。處于該狀態(tài)的服務器會認為集群中沒有Leader,需要進行Leader選舉;
FOLLOWING:跟隨著狀態(tài),說明當前服務器角色為Follower;
LEADING:領導者狀態(tài),表明當前服務器角色為Leader;
OBSERVING:觀察者狀態(tài),表明當前服務器角色為Observer。

2. 選票信息
每個選票中包含四個最基本的信息,服務器的ID,數(shù)據(jù)ID,邏輯時鐘以及選舉狀態(tài):
服務器ID:即myId,服務器的唯一標識,編號越大在選擇算法中的權重越大;
數(shù)據(jù)ID:服務器中存放的最大數(shù)據(jù)ID,值越大說明數(shù)據(jù)越新,在選舉算法中數(shù)據(jù)新權重越大;
邏輯時鐘:Epoch,邏輯時鐘,或者叫投票次數(shù),同一輪投票過程時鐘值是相同的,每投完一次票這個數(shù)據(jù)就會增加,然后與接收到的其他服務器返回的投票信息中的數(shù)值相比,根據(jù)不同的值做出不同的判斷;
選舉狀態(tài):即上文提到的四種狀態(tài)。
3. Leader選舉的觸發(fā)時機
集群啟動,這個時候需要選舉出新的Leader;
Leader服務器宕機;
Follow服務器宕機后,Leader服務器發(fā)現(xiàn)自己已經(jīng)沒有過半的Follow跟隨自己了,不能對外提供服務(領導者選舉)。
二、Leader的選舉流程
1. 服務器啟動時期的Leader選舉
假設想在的有三臺機器搭建集群,在集群初始化階段,當只有一個服務器(Server1)啟動時,無法完成Leader的選舉;當?shù)诙_服務器(Server2)啟動后,兩臺機器開始互相通信,每臺機器都會嘗試去選舉Leader,于是進入了Leader選舉過程,這個過程大概如下:
每個Server發(fā)出一個投票投給自己。在初始情況下,Server1和Server2都會將自己作為Leader,將票投給自己。每次投票會包含所推舉的服務器的myid和ZXID,使用(myid,ZXID)來表示,此時Server1的投票為(1, 0),Server2的投票為(2, 0),然后各自將這個投票發(fā)給集群中的其他機器;
接受來自各個服務器的投票。集群的每個服務器收到投票后,首先判斷該投票是否有效,如檢查是否是本輪投票、是否來自LOOKING狀態(tài)的服務器;
處理投票。針對每一個投票,服務器都需要將別人的投票和自己的投票進行PK,PK的規(guī)則如下:
對于Server1而言,它的投票是(1, 0),接收Server2的投票為(2, 0),首先會比較兩者的ZXID,均為0,再比較myid,此時Server2的myid最大,于是更新自己的投票為(2, 0),然后重新投票,對于Server2而言,其無須更新自己的投票,只是再次向集群中所有機器發(fā)出上一次投票信息即可。
優(yōu)先檢查ZXID。ZXID比較大的服務器優(yōu)先作為Leader;
如果ZXID相同,那么就比較myid。myid較大的服務器作為Leader服務器。
統(tǒng)計投票。每次投票后,服務器都會統(tǒng)計投票信息,判斷是否已經(jīng)過半機器接收到相同的投票信息,對于Server1、Server2而言,都統(tǒng)計出集群中已經(jīng)有兩臺機器接受了(2, 0)的投票信息,此時便認為已經(jīng)選出了Leader。
改變服務器狀態(tài)。一旦確定了Leader,每個服務器都會更新自己的狀態(tài),如果是Follower,那么就變更為FOLLOWING,如果是Leader,就變更為LEADING。
2. 服務器運行期間的 Leader 選舉
在Zookeeper運行期間,即便有新服務器加入,也不會影響到Leader,新加入的服務器會將原有的Leader服務器視為Leader,進行同步。但是一旦Leader宕機了,那么整個集群就將暫停對外服務,進行新一輪Leader的選舉,其過程和啟動時期的Leader選舉過程基本一致。假設正在運行的有Server1、Server2、Server3三臺服務器,當前Leader是Server2,若某一時刻Leader掛了,此時便開始Leader選舉。選舉過程如下:
變更狀態(tài)。Leader宕機后,余下的非Observer服務器都會將自己的服務器狀態(tài)變更為LOOKING,然后開始進行Leader選舉流程;
每個Server會發(fā)出一個投票。在這個過程中,需要生成投票信息(myid,ZXID)每個服務器上的ZXID可能不同,我們假定Server1的ZXID為123,而Server3的ZXID為122;在第一輪投票中,Server1和Server3都會投自己,產(chǎn)生投票(1, 123),(3, 122),然后各自將投票發(fā)送給集群中所有機器;
接收來自各個服務器的投票。與啟動時過程相同;
處理投票;
統(tǒng)計投票;
改變服務器的狀態(tài)。

騰訊、阿里、滴滴后臺面試題匯總總結 — (含答案)
面試:史上最全多線程面試題 !
最新阿里內(nèi)推Java后端面試題
JVM難學?那是因為你沒認真看完這篇文章

關注作者微信公眾號 —《JAVA爛豬皮》
了解更多java后端架構知識以及最新面試寶典


看完本文記得給作者點贊+在看哦~~~大家的支持,是作者源源不斷出文的動力
作者:周二鴨
出處:https://www.cnblogs.com/jojop/p/14319464.html
