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