zookeeper系列(五):Leader選舉

服務(wù)器各角色

leader

  • 事務(wù)請求的唯一調(diào)度和處理者师溅,保證集群事務(wù)處理的順序性。(事務(wù)請求個人理解其實就是寫請求)盾舌。
  • 集群內(nèi)部各個服務(wù)器的調(diào)度者(管理follower墓臭,數(shù)據(jù)同步)。
  • 將自己寫完的數(shù)據(jù)妖谴,同步給follower和abserver

follower

  • 處理非請求事務(wù)窿锉,轉(zhuǎn)發(fā)事務(wù)請求給leader
  • 參與事務(wù)請求prososal投票
  • 參與leader選舉投票

observer

  • 處理非事務(wù)請求,轉(zhuǎn)發(fā)事務(wù)請求給leader
  • 只為了擴(kuò)展系統(tǒng)存在膝舅,提高讀寫速度

observer存在的意義是什么:
他存在的意義必然是因為他不參與投票的特殊性嗡载。為什么zk要單獨拎出來一個不投票的服務(wù)器呢。
原因在于zk的分布式一致性協(xié)議仍稀,當(dāng)事務(wù)請求commit的時候洼滚,需要超過半數(shù)的投票,才能進(jìn)行commit琳轿,投票的機(jī)器數(shù)量越多判沟,網(wǎng)絡(luò)消耗就越大。所以就需要一種不需要參與投票的崭篡,只負(fù)責(zé)讀請求的機(jī)器挪哄,來緩解集群讀請求壓力,這種服務(wù)器就是observer琉闪。

所以迹炼,zk中一共有兩種投票。

  • leader選舉投票
  • 事務(wù)請求commt投票

leader選舉

leader選舉的觸發(fā)條件

  • 服務(wù)器初始化啟動颠毙。也就是剛組成集群的時候斯入。
  • 服務(wù)器運行期間無法和leader保持連接。也就是leader掛了蛀蜜。

zk在正常運行過程中刻两,一旦選出了leader,這個leader就不會變化了滴某,即使有新的機(jī)器加入集群磅摹,即使有非leader機(jī)器掛了。只有l(wèi)eader自己掛了霎奢,才會開始leader選舉户誓。

leader是干嘛的,選leader有什么用

  • 分布式一致性幕侠。只讓leader自己處理寫請求帝美,然后將寫的數(shù)據(jù),同步給從(在分布式協(xié)議中細(xì)講)晤硕。
  • 恢復(fù)數(shù)據(jù)
  • 發(fā)起投票悼潭,更新系統(tǒng)狀態(tài)

術(shù)語解釋

術(shù)語 解釋
SID:服務(wù)器ID SID是一個數(shù)字庇忌,唯一標(biāo)識一個zookeeper服務(wù)器
ZXID:事務(wù)ID 唯一標(biāo)識一次服務(wù)器狀態(tài)的變更。在某一個時刻女责,集群中每臺機(jī)器的ZXID不一定全都一致漆枚,為什么?抵知??软族?在主從同步先回滾再差異化同步策略中會講
Vote:投票 leader選舉刷喜,必須通過投票來實現(xiàn)。當(dāng)集群中的機(jī)器發(fā)現(xiàn)自己無法檢測到leader機(jī)器的時候立砸,就會開始嘗試進(jìn)行投票
Quorum:過半機(jī)器數(shù) 可以把這個術(shù)語理解為一個量詞掖疮,如果集群中總的機(jī)器數(shù)是n,那么Quorum=(n/2 + 1)颗祝,總數(shù)是3浊闪,Quorum就是2。

vote的數(shù)據(jù)結(jié)構(gòu)

屬性 說明
id 被推舉的leader的SID
zxid 被推舉的leader的事務(wù)ID
electionEpoch 邏輯時鐘螺戳,用來判斷多個投票是否在通一輪選舉周期中搁宾。該值再服務(wù)端是一個自增序列。每次進(jìn)入新的一輪投票后倔幼,都會對該值進(jìn)行+1
peerEpoch 被推舉的leader的epoch
state 當(dāng)前服務(wù)器的狀態(tài)

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

狀態(tài) 說明
looking 尋找leader狀態(tài)盖腿。當(dāng)服務(wù)器處于該狀態(tài)時,它會認(rèn)為當(dāng)前集群中沒有l(wèi)eader损同,因此需要進(jìn)入leader選舉流程
following 跟隨者狀態(tài)翩腐,表明該服務(wù)器的角色是leader
leading 領(lǐng)導(dǎo)者狀態(tài),表明該服務(wù)器的角色是leader
observing 觀察者狀態(tài)膏燃,表明該服務(wù)器的角色是observer

laader選舉

選舉的原則

  1. 誰ZXID大茂卦,選誰。(最新的session)
  2. ZXID一樣大组哩,誰SID大選誰等龙。

開始第一次投票

投票中包含了兩個最基本的信息:所推舉服務(wù)器的SID和所推舉服務(wù)器的ZXID。以(SID, ZXID)表示禁炒。舉例而咆,如果當(dāng)前服務(wù)器要推舉SID為1,ZXID為8的服務(wù)器成為leader幕袱,那么它這次投票信息可以表示為(1,8)暴备。

注:第一次投票,都是投給自己们豌。

現(xiàn)在假設(shè)zk由5臺機(jī)器組成涯捻,SID分別為1浅妆,2,3障癌,4凌外,5,ZXID分別為9涛浙,9康辑,9,8轿亮,8疮薇。并且此時leader是SID為2的機(jī)器。某一時刻1和2出現(xiàn)故障我注,開始進(jìn)行l(wèi)eader選舉

在第一次投票的時候按咒,都投自己。3投(3,9)但骨,4投(4,8)励七,5投(5, 8)

投票變更

集群中每臺機(jī)器發(fā)出自己的投票后,也會接收其他機(jī)器的投票奔缠。

收到其他機(jī)器的(SID, ZXID)后掠抬,都會跟自己的(SID, ZXID)比較。按照選舉規(guī)則添坊。

  • server3剿另,收到(4,8)和(5,8),自己是(3,9)贬蛙,先比ZXID雨女,自己是9,最大阳准,不變更氛堕,將(3,9)發(fā)出去。
  • server4野蝇,收到(3,9)和(5,8)讼稚,因為9比自己大,變更投票為(3,9)绕沈,將這個變更投票發(fā)出去锐想。
  • server5,收到(3,9)和(4,8)乍狐,因為9比自己大赠摇,變更投票為(3,9),將這個變更投票發(fā)出去。

確定leader

經(jīng)過第二次投票后藕帜,集群中的每臺機(jī)器又會收到其他所有機(jī)器的投票烫罩,這個時候就要計算了票數(shù)了。

只要有一臺機(jī)器收到了超過半數(shù)的相同的投票洽故,那么這個投票對應(yīng)的SID機(jī)器即為leader贝攒。

本例子中,每臺服務(wù)器會收到兩次(3,9)的投票时甚,所以server3當(dāng)選leader隘弊。

leader選舉技術(shù)細(xì)節(jié)QuorumCnxManager:網(wǎng)絡(luò)I/O

zk處理所有選舉相關(guān)網(wǎng)絡(luò)連接。就是這個QuorumCnxManager撞秋。
在每臺服務(wù)器啟動的時候长捧,都會啟動一個QuorumCnxManager,負(fù)責(zé)各臺服務(wù)器之間的leader選舉過程中的底層網(wǎng)絡(luò)通信吻贿。

QuorumCnxManager維護(hù)了一系列的消息隊列,用于保存接收到的哑子、待發(fā)送的消息舅列,以及消息的發(fā)送器。

屬性 解釋
recvQueue 消息接收隊列卧蜓,用于存放那些從其他服務(wù)器收到的消息
sendQueue 消息發(fā)送隊列帐要,用于存放待發(fā)送的消息
queueSendMap 消息發(fā)送隊列,用于保存那些待發(fā)送的消息弥奸。它是一個map榨惠,按照SID分組,分別為每臺機(jī)器分配一個單獨的隊列盛霎,從而保證各臺服務(wù)器之間的消息發(fā)送互不影響
senderWorkerMap 發(fā)送器集合赠橙。也是按照SID進(jìn)行分組。每個senderWorker發(fā)送器愤炸,都對應(yīng)一臺zk服務(wù)器期揪,負(fù)責(zé)消息的發(fā)送。
lastMessageSent 最近發(fā)送過的消息规个。在這個集合中凤薛,為每個SID保存最近發(fā)送過的一個消息
workerReceiver 選票接收器。該數(shù)據(jù)會不斷的從QuorumCnxManager接收其他服務(wù)器的選舉消息诞仓,并轉(zhuǎn)換成自己最終的投票(根據(jù)選舉規(guī)則)缤苫,然后保存到recvQueue隊列中。如果發(fā)現(xiàn)該外部投票的輪次小于當(dāng)前服務(wù)器墅拭,忽略這個投票活玲。如果發(fā)現(xiàn)這個投票來自observer,也忽略該投票
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市翼虫,隨后出現(xiàn)的幾起案子屑柔,更是在濱河造成了極大的恐慌,老刑警劉巖珍剑,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掸宛,死亡現(xiàn)場離奇詭異,居然都是意外死亡招拙,警方通過查閱死者的電腦和手機(jī)唧瘾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來别凤,“玉大人饰序,你說我怎么就攤上這事」婺模” “怎么了求豫?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诉稍。 經(jīng)常有香客問我蝠嘉,道長,這世上最難降的妖魔是什么杯巨? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任蚤告,我火速辦了婚禮,結(jié)果婚禮上服爷,老公的妹妹穿的比我還像新娘杜恰。我一直安慰自己,他們只是感情好仍源,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布心褐。 她就那樣靜靜地躺著,像睡著了一般镜会。 火紅的嫁衣襯著肌膚如雪檬寂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天戳表,我揣著相機(jī)與錄音桶至,去河邊找鬼。 笑死匾旭,一個胖子當(dāng)著我的面吹牛镣屹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播价涝,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼女蜈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伪窖,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤逸寓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后覆山,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竹伸,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年簇宽,在試婚紗的時候發(fā)現(xiàn)自己被綠了勋篓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡魏割,死狀恐怖譬嚣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钞它,我是刑警寧澤拜银,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站遭垛,受9級特大地震影響盐股,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜耻卡,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望牲尺。 院中可真熱鬧卵酪,春花似錦、人聲如沸谤碳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜒简。三九已至瘸羡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間搓茬,已是汗流浹背犹赖。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留卷仑,地道東北人峻村。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像锡凝,于是被迫代替她去往敵國和親粘昨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348