Zookeeper選舉——FastLeaderElection

術(shù)語介紹

myid
每個Zookeeper服務(wù)器睦授,都需要在數(shù)據(jù)文件夾下創(chuàng)建一個名為myid的文件剃允,該文件包含整個Zookeeper集群唯一的ID(整數(shù))省核。例如某Zookeeper集群包含三臺服務(wù)器结笨,hostname分別為zoo1签夭、zoo2和zoo3昌渤,其myid分別為1稻励、2和3,則在配置文件中其ID與hostname必須一一對應(yīng),如下所示望抽。在該配置文件中加矛,server.后面的數(shù)據(jù)即為myid

server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888

zxid
類似于RDBMS中的事務(wù)ID,用于標(biāo)識一次更新操作的Proposal ID煤篙。為了保證順序性斟览,該zkid必須單調(diào)遞增。因此Zookeeper使用一個64位的數(shù)來表示辑奈,高32位是Leader的epoch苛茂,從1開始,每次選出新的Leader鸠窗,epoch加一妓羊。低32位為該epoch內(nèi)的序號,每次epoch變化稍计,都將低32位的序號重置畅卓。這樣保證了zkid的全局遞增性缨恒。

支持的領(lǐng)導(dǎo)選舉算法

可通過electionAlg配置項設(shè)置Zookeeper用于領(lǐng)導(dǎo)選舉的算法椎扬。

到3.4.10版本為止尺迂,可選項有

  • 0 基于UDP的LeaderElection
  • 1 基于UDP的FastLeaderElection
  • 2 基于UDP和認(rèn)證的FastLeaderElection
  • 3 基于TCP的FastLeaderElection

在3.4.10版本中,默認(rèn)值為3硅则,也即基于TCP的FastLeaderElection淹父。另外三種算法已經(jīng)被棄用,并且有計劃在之后的版本中將它們徹底刪除而不再支持怎虫。

FastLeaderElection

FastLeaderElection選舉算法是標(biāo)準(zhǔn)的Fast Paxos算法實現(xiàn)暑认,可解決LeaderElection選舉算法收斂速度慢的問題。

服務(wù)器狀態(tài)

  • LOOKING 不確定Leader狀態(tài)大审。該狀態(tài)下的服務(wù)器認(rèn)為當(dāng)前集群中沒有Leader穷吮,會發(fā)起Leader選舉
  • FOLLOWING 跟隨者狀態(tài)。表明當(dāng)前服務(wù)器角色是Follower饥努,并且它知道Leader是誰
  • LEADING 領(lǐng)導(dǎo)者狀態(tài)捡鱼。表明當(dāng)前服務(wù)器角色是Leader,它會維護(hù)與Follower間的心跳
  • OBSERVING 觀察者狀態(tài)酷愧。表明當(dāng)前服務(wù)器角色是Observer驾诈,與Folower唯一的不同在于不參與選舉,也不參與集群寫操作時的投票

選票數(shù)據(jù)結(jié)構(gòu)

每個服務(wù)器在進(jìn)行領(lǐng)導(dǎo)選舉時溶浴,會發(fā)送如下關(guān)鍵信息

  • logicClock 每個服務(wù)器會維護(hù)一個自增的整數(shù)乍迄,名為logicClock,它表示這是該服務(wù)器發(fā)起的第多少輪投票
  • state 當(dāng)前服務(wù)器的狀態(tài)
  • self_id 當(dāng)前服務(wù)器的myid
  • self_zxid 當(dāng)前服務(wù)器上所保存的數(shù)據(jù)的最大zxid
  • vote_id 被推舉的服務(wù)器的myid
  • vote_zxid 被推舉的服務(wù)器上所保存的數(shù)據(jù)的最大zxid

投票流程

自增選舉輪次
Zookeeper規(guī)定所有有效的投票都必須在同一輪次中士败。每個服務(wù)器在開始新一輪投票時闯两,會先對自己維護(hù)的logicClock進(jìn)行自增操作褥伴。

初始化選票
每個服務(wù)器在廣播自己的選票前,會將自己的投票箱清空漾狼。該投票箱記錄了所收到的選票重慢。例:服務(wù)器2投票給服務(wù)器3,服務(wù)器3投票給服務(wù)器1逊躁,則服務(wù)器1的投票箱為(2, 3), (3, 1), (1, 1)似踱。票箱中只會記錄每一投票者的最后一票,如投票者更新自己的選票稽煤,則其它服務(wù)器收到該新選票后會在自己票箱中更新該服務(wù)器的選票核芽。

發(fā)送初始化選票
每個服務(wù)器最開始都是通過廣播把票投給自己。

接收外部投票
服務(wù)器會嘗試從其它服務(wù)器獲取投票酵熙,并記入自己的投票箱內(nèi)轧简。如果無法獲取任何外部投票,則會確認(rèn)自己是否與集群中其它服務(wù)器保持著有效連接匾二。如果是哮独,則再次發(fā)送自己的投票;如果否假勿,則馬上與之建立連接。

判斷選舉輪次
收到外部投票后态鳖,首先會根據(jù)投票信息中所包含的logicClock來進(jìn)行不同處理

  • 外部投票的logicClock大于自己的logicClock转培。說明該服務(wù)器的選舉輪次落后于其它服務(wù)器的選舉輪次,立即清空自己的投票箱并將自己的logicClock更新為收到的logicClock浆竭,然后再對比自己之前的投票與收到的投票以確定是否需要變更自己的投票浸须,最終再次將自己的投票廣播出去。
  • 外部投票的logicClock小于自己的logicClock邦泄。當(dāng)前服務(wù)器直接忽略該投票删窒,繼續(xù)處理下一個投票。
  • 外部投票的logickClock與自己的相等顺囊。當(dāng)時進(jìn)行選票PK肌索。

選票PK
選票PK是基于(self_id, self_zxid)與(vote_id, vote_zxid)的對比

  • 外部投票的logicClock大于自己的logicClock,則將自己的logicClock及自己的選票的logicClock變更為收到的logicClock
  • 若logicClock一致特碳,則對比二者的vote_zxid诚亚,若外部投票的vote_zxid比較大,則將自己的票中的vote_zxid與vote_myid更新為收到的票中的vote_zxid與vote_myid并廣播出去午乓,另外將收到的票及自己更新后的票放入自己的票箱站宗。如果票箱內(nèi)已存在(self_myid, self_zxid)相同的選票,則直接覆蓋
  • 若二者vote_zxid一致益愈,則比較二者的vote_myid梢灭,若外部投票的vote_myid比較大,則將自己的票中的vote_myid更新為收到的票中的vote_myid并廣播出去,另外將收到的票及自己更新后的票放入自己的票箱

統(tǒng)計選票
如果已經(jīng)確定有過半服務(wù)器認(rèn)可了自己的投票(可能是更新后的投票)敏释,則終止投票库快。否則繼續(xù)接收其它服務(wù)器的投票。

更新服務(wù)器狀態(tài)
投票終止后颂暇,服務(wù)器開始更新自身狀態(tài)缺谴。若過半的票投給了自己,則將自己的服務(wù)器狀態(tài)更新為LEADING耳鸯,否則將自己的狀態(tài)更新為FOLLOWING

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末湿蛔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子县爬,更是在濱河造成了極大的恐慌阳啥,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件财喳,死亡現(xiàn)場離奇詭異察迟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)耳高,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門扎瓶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人泌枪,你說我怎么就攤上這事概荷。” “怎么了碌燕?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵误证,是天一觀的道長。 經(jīng)常有香客問我修壕,道長愈捅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任慈鸠,我火速辦了婚禮蓝谨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘青团。我一直安慰自己像棘,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布壶冒。 她就那樣靜靜地躺著缕题,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胖腾。 梳的紋絲不亂的頭發(fā)上烟零,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天瘪松,我揣著相機(jī)與錄音,去河邊找鬼锨阿。 笑死宵睦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的墅诡。 我是一名探鬼主播壳嚎,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼末早!你這毒婦竟也來了烟馅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤然磷,失蹤者是張志新(化名)和其女友劉穎郑趁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姿搜,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡寡润,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了舅柜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梭纹。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖致份,靈堂內(nèi)的尸體忽然破棺而出变抽,到底是詐尸還是另有隱情,我是刑警寧澤知举,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布瞬沦,位于F島的核電站太伊,受9級特大地震影響雇锡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜僚焦,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一锰提、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芳悲,春花似錦立肘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肮韧,卻和暖如春融蹂,著一層夾襖步出監(jiān)牢的瞬間旺订,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工超燃, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留区拳,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓意乓,卻偏偏與公主長得像樱调,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子届良,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 一笆凌、前言 前面學(xué)習(xí)了Zookeeper服務(wù)端的相關(guān)細(xì)節(jié),其中對于集群啟動而言伙窃,很重要的一部分就是Leader選舉菩颖,...
    阿斯蒂芬2閱讀 17,622評論 4 19
  • 最近在學(xué)習(xí)ZooKeeper,一直想寫篇相關(guān)博文記錄下學(xué)習(xí)內(nèi)容为障,礙于自己是個拖延癥重度患者總是停留在準(zhǔn)備階段晦闰,直到...
    Lexus90511閱讀 7,900評論 5 14
  • 【轉(zhuǎn)自】http://www.cnblogs.com/leesf456/p/6107600.html 一、前言 前...
    lxqfirst閱讀 830評論 0 0
  • 若進(jìn)行Leader選舉鳍怨,則至少需要兩臺機(jī)器呻右,這里選取3臺機(jī)器組成的服務(wù)器集群為例。在集群初始化階段鞋喇,當(dāng)有一臺服務(wù)器...
    白紙糊閱讀 960評論 0 1
  • 本文將從系統(tǒng)模型侦香、序列化與協(xié)議落塑、客戶端工作原理、會話罐韩、服務(wù)端工作原理以及數(shù)據(jù)存儲等方面來揭示ZooKeeper的技...
    端木軒閱讀 3,783評論 0 42