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

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

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

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

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


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