溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

ZooKeeper的選舉機(jī)制是怎樣的

發(fā)布時(shí)間:2021-12-24 15:04:17 來(lái)源:億速云 閱讀:175 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)ZooKeeper的選舉機(jī)制是怎樣的,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

今天開(kāi)始我們將深入 ZK 選舉相關(guān)的知識(shí)

ZooKeeper的選舉機(jī)制是怎樣的

一、選舉的基本規(guī)則

ZKr~這次我決定一反常態(tài),先不講故事了~先得聊聊在 ZK 選舉中非常重要的一些東西。

1.1 zxid

zxid 就是我們之前提到的事務(wù)編號(hào),是一個(gè) 8 字節(jié)的整型數(shù)字,但是 ZK 設(shè)計(jì)的時(shí)候把這一個(gè)數(shù)字拆成了兩部分使用,一魚(yú)兩吃!

8 個(gè)字節(jié)的整數(shù)一共有 64 位長(zhǎng)度,前 32 位用來(lái)記錄 epoch,后 32 位就是用來(lái)計(jì)數(shù)。你可能要問(wèn)了?epoch?是啥?

zxid 初始化是 0,也就是這樣

00000000000000000000000000000000 00000000000000000000000000000000

每一次寫(xiě)請(qǐng)求都會(huì)增加后 32 位,假設(shè)現(xiàn)在進(jìn)行了 10 次寫(xiě)請(qǐng)求(無(wú)論該請(qǐng)求有沒(méi)有真的修改到數(shù)據(jù)),zxid 就會(huì)變成這樣

00000000000000000000000000000000 00000000000000000000000000001010

當(dāng)進(jìn)行一次選舉的時(shí)候,前 32 位就會(huì)增加 1,并且清零后 32 位

00000000000000000000000000000001 00000000000000000000000000000000

除了選舉以外,當(dāng)后 32 位徹底用完(變成全 1,也就是 ZK 正常執(zhí)行了 2^32 - 1 次寫(xiě)請(qǐng)求都沒(méi)進(jìn)行過(guò)一次選舉,牛逼!)也會(huì)讓前 32 位增加  1,相當(dāng)于進(jìn)位

# 進(jìn)位前 00000000000000000000000000000000 11111111111111111111111111111111 # 進(jìn)位后 00000000000000000000000000000001 00000000000000000000000000000000

到這里我就可以回答大家前面的問(wèn)題了,epoch 就是 zxid 前 32 位的這個(gè)數(shù)字,epoch 本身的翻譯是“紀(jì)元,時(shí)代”的意思,意味著更新?lián)Q代,而  zxid 的后 32 位數(shù)字僅僅是寫(xiě)請(qǐng)求的計(jì)數(shù)罷了

1.2 myid

在之前的小故事里,我給 ZK 的集群中的各個(gè)節(jié)點(diǎn)都起了一個(gè)好記的名字(神特么好記!)。但是 ZK 官方自己是如何給每一個(gè)集群中的節(jié)點(diǎn)起名字的呢?用的就是  myid!

ZK 的啟動(dòng)配置 zoo.cfg 中有一項(xiàng) dataDir 指定了數(shù)據(jù)存放的路徑(默認(rèn)是  /tmp/zookeeper),在此路徑下新建一個(gè)文本文件,命名為 myid, 文本內(nèi)容就是一個(gè)數(shù)字,這個(gè)數(shù)字就是當(dāng)前節(jié)點(diǎn)的 myid

/tmp └── zookeeper     ├── myid     └── ...

然后在 zoo.cfg 是這樣配置集群信息

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

這個(gè) server. 之后的數(shù)字就是 myid,這個(gè) myid 在整個(gè)集群中,各個(gè)節(jié)點(diǎn)之間是不能重復(fù)的。我忘記之前在哪兒看到的了,說(shuō)是 myid 只能是  1 到 255 的數(shù)字,我一直信以為真,直到這次,我本著嚴(yán)謹(jǐn)?shù)膽B(tài)度去做了實(shí)踐,一切以事實(shí)為主,并且我的實(shí)驗(yàn)覆蓋了 3.4、3.5、3.6  三大版本(都是三臺(tái)機(jī)器的簡(jiǎn)單集群),結(jié)論是:myid 只要是不等于 -1 就行(-1 是一個(gè)固定的值會(huì)導(dǎo)致當(dāng)前節(jié)點(diǎn)啟動(dòng)報(bào)錯(cuò)),不能大于  Long.MAX_VALUE 或者小于 Long.MIN_VALUE,但是如果在當(dāng)前的節(jié)點(diǎn)中配置了  zookeeper.extendedTypesEnabled=true 那當(dāng)前節(jié)點(diǎn)的最大 myid 是 254(負(fù)數(shù)不影響,我也不知道這個(gè) 254  的用意,但是代碼中的確有判斷) 是不是奇怪的知識(shí)又增加了呢~

關(guān)于配置更多的信息,之后單獨(dú)再整理,今天就點(diǎn)到為止

1.3 選舉規(guī)則

知道了上面這些有什么用呢?非常重要!因?yàn)檫x舉 Leader 完全看的就是這幾個(gè)值

  • epoch

  • 寫(xiě)請(qǐng)求次數(shù)

  • myid

優(yōu)先級(jí)從上到下逐級(jí)比較,誰(shuí)大誰(shuí)就更有資格成為 Leader,當(dāng)前級(jí)一樣就比較下一級(jí),直到分出勝負(fù)為止!因?yàn)?myid  是不能重復(fù)的,所以最終是一定能分出勝負(fù)的!

好了,現(xiàn)在大家知道了最基本的選舉規(guī)則了~讓我們進(jìn)入下一節(jié)吧

二、三馬之爭(zhēng)

馬果果一定想不到,這輩子自己可以和兩位鼎鼎大名的明星企業(yè)家相提并論,讓我們一起去看看發(fā)生了什么吧~

2.1 準(zhǔn)備開(kāi)工

之前馬果果規(guī)定了三個(gè)辦事處在對(duì)外開(kāi)張前必須選出一個(gè) Leader,在正式開(kāi)始選之前,每一個(gè)辦事處也有一些準(zhǔn)備工作需要做:

  • 每一個(gè)辦事處必須得知道一共有多少個(gè)辦事處

  • 額外聘請(qǐng)一些專門負(fù)責(zé)和其他辦事處溝通的話務(wù)員

  • 準(zhǔn)備好一個(gè)票箱用來(lái)對(duì)投票統(tǒng)計(jì)和歸票

  • 為每一個(gè)辦事處設(shè)置一個(gè)固定的 myid

所以現(xiàn)在辦公室的布置變成了這樣(我省略了之前章節(jié)的其他要素):

ZooKeeper的選舉機(jī)制是怎樣的

有了這些準(zhǔn)備工作以后所有辦事處都可以進(jìn)入選舉的階段了,并且村委會(huì)規(guī)定了幾種狀態(tài)用于表示當(dāng)前辦事處正處在的階段:

  • LOOKING,正在尋找 Leader,處于此階段的辦事處不能對(duì)外提供服務(wù)

  • LEADING,當(dāng)前辦事處就是 Leader,可以對(duì)外提供服務(wù)

  • FOLLOWING,當(dāng)前辦事處正在跟隨 Leader,可以對(duì)外提供服務(wù)

很明顯剛剛準(zhǔn)備好的各個(gè)辦事處現(xiàn)在都處于 LOOKING 狀態(tài),下面讓我們正式進(jìn)入選舉流程吧

2.2 開(kāi)始選舉

由于各個(gè)辦事處剛準(zhǔn)備好,所以彼此之間還沒(méi)有通過(guò)信,又加上大家都是姓馬的,心里面都是想當(dāng)老大的,所以每一個(gè)辦事都會(huì)率先擬一張寫(xiě)著自己的選票發(fā)給其他辦事處。主要有這些信息:

  • sid:我是誰(shuí)

  • leader:我選誰(shuí)

  • state:我當(dāng)前的狀態(tài)

  • epoch:我當(dāng)前的 epoch

  • zxid:我選擇的 leader 的最大的事務(wù)編號(hào)

以馬果果舉例:

ZooKeeper的選舉機(jī)制是怎樣的

馬小云和馬小騰也一樣,一開(kāi)始都選了自己做 Leader 候選人,并且都把自己認(rèn)為的候選人(當(dāng)前場(chǎng)景下就是自己)的票分別發(fā)送給了其他兩位(以及自己)

ZooKeeper的選舉機(jī)制是怎樣的

2.2.1 馬果果視角

每個(gè)辦事處各自也會(huì)收到來(lái)自其他辦事處的選票(也有可能是自己的),每拿到一張選票,都需要和當(dāng)前自己認(rèn)為的 Leader  候選人做比較,理論上自己投給自己的選票會(huì)先一步達(dá)到自己的票箱,因?yàn)椴恍枰?jīng)過(guò)通訊減少了傳輸?shù)穆窂?,自己的選票和自己的候選人是一致的所以不需要比較,只需要在票箱中記上一筆,我們還是以馬果果舉例:

ZooKeeper的選舉機(jī)制是怎樣的

=》的左邊是辦事處的名字,右邊是該辦事處選的 Leader。當(dāng)前投票統(tǒng)計(jì)是指,當(dāng)前節(jié)點(diǎn)所選的 Leader 獲得的選票統(tǒng)計(jì)。

假設(shè)他再收到了馬小云的選票:

  • 馬果果首先看到的是馬小云也處在 LOOKING 狀態(tài)

  • 接著就會(huì)比較自己候選人和馬小云的選票(左邊代表當(dāng)前辦事處的候選人,右邊代表收到的選票信息,下同)

e:0      ==  e:0 z:0      ==  z:0 l: 馬果果(69) >   l: 馬小云(56)

最終因?yàn)轳R果果的 myid 69 要比馬小云的 myid 56  要大,所以馬果果最終勝出!雖然馬小云勝出了,但是當(dāng)前投票統(tǒng)計(jì)是不能修改的,因?yàn)轳R小云這一輪的選票就是選的馬小云,需要等待他重新改票后再投才能修改投票統(tǒng)計(jì)。

之后會(huì)往投票箱記錄:

ZooKeeper的選舉機(jī)制是怎樣的

緊接著是馬小騰的投票:

e:0      ==  e:0 z:0      ==  z:0 l: 馬果果(69) >   l: 馬小騰(49)

馬果果還是勝出!

記錄投票箱:

ZooKeeper的選舉機(jī)制是怎樣的

每次收到投票的時(shí)候,馬果果都會(huì)依據(jù)當(dāng)前的投票統(tǒng)計(jì)進(jìn)行歸票,但是很遺憾選舉仍然無(wú)法結(jié)束,因?yàn)榻Y(jié)束的規(guī)則必須有某一個(gè)辦事處獲得半數(shù)以上的選票,現(xiàn)在只有一個(gè)馬果果自己的選票,不滿足半數(shù)以上,所以馬果果只能再等等了。

而在馬果果這邊忙的熱火朝天的同時(shí),馬小云和馬小騰也在進(jìn)行著同樣的動(dòng)作。

2.2.2 馬小云視角

我們這省略描述馬小云記錄自己選票的過(guò)程,假設(shè)他這邊是先收到馬果果的選票,是怎么處理的呢?

e:0      ==  e:0 z:0      ==  z:0 l: 馬小云(56) <   l: 馬果果(69)

馬小云看到自己認(rèn)為的 Leader 候選人被馬果果的選票擊敗了,所以將自己的候選人改為馬果果,并將新的選票重新廣播出去

ZooKeeper的選舉機(jī)制是怎樣的

然后在自己的投票箱中記錄:

ZooKeeper的選舉機(jī)制是怎樣的

為了敘述的完整性,我們還是把馬小騰的票也看完

e:0      ==  e:0 z:0      ==  z:0 l: 馬果果(69) >   l: 馬小騰(49)

馬果果還是勝出了,所以馬小云的投票箱最終變成這樣:

ZooKeeper的選舉機(jī)制是怎樣的

講道理接下來(lái)應(yīng)該以馬小騰為主視角,再講一遍剛才的過(guò)程,但是可以認(rèn)為幾乎和馬小云是一樣的,為了故事的順暢,我們需要回到馬果果的視角,因?yàn)轳R小云輸給馬果果之后改票了,又發(fā)了一輪選票

2.2.3 馬果果視角(再)

馬果果又再一次收到了馬小云的選票(改票后),投票箱就會(huì)改成這樣:

ZooKeeper的選舉機(jī)制是怎樣的

收到這個(gè)投票后,當(dāng)前投票統(tǒng)計(jì)就會(huì)增加馬小云的記錄,然后馬果果進(jìn)行歸票就發(fā)現(xiàn)了這次自己的選票超過(guò)半數(shù)了,然后會(huì)進(jìn)行二次確認(rèn),會(huì)等待一會(huì)看看還能不能收到更新的選票,這里假設(shè)沒(méi)有收到更新的投票,就會(huì)進(jìn)行判斷,當(dāng)前過(guò)半數(shù)的候選人是不是自己?如果是的話,那自己就是  Leader,不是的話,自己就是 Follower。

很明顯,馬果果就是 Leader,然后會(huì)把自己的狀態(tài)修改為 LEADING。

與此同時(shí),馬小云、馬小騰也進(jìn)行歸票,歸票結(jié)果自己為 Follower,把自己狀態(tài)修改為 FOLLOWING,然后各自都會(huì)和 Leader  進(jìn)行數(shù)據(jù)的同步,同步完成之后整個(gè)辦事處就都可以對(duì)外提供服務(wù)了。

ZooKeeper的選舉機(jī)制是怎樣的

2.3 馬小騰停電啦

選舉本身涉及到集群間的通信、節(jié)點(diǎn)自身的狀態(tài)管理和狀態(tài)變更,本身就是一個(gè)比較復(fù)雜的過(guò)程,剛才只是舉例了一個(gè)最簡(jiǎn)單的啟動(dòng)選舉流程,下面會(huì)舉更多的例子幫助大家能理解整個(gè)選舉的邏輯。

現(xiàn)在假設(shè)辦事處安然無(wú)恙得對(duì)外提供了一段時(shí)間服務(wù)后,馬小騰的辦事處突然停電了,就不能和另外兩馬進(jìn)行通訊了,而另外兩馬在一段時(shí)間內(nèi)都沒(méi)有收到過(guò)馬小騰的信息的時(shí)候就知道,出事了!但是各自盤點(diǎn)了下目前仍然還有兩個(gè)辦事處可以對(duì)外提供服務(wù),是達(dá)到整個(gè)集群總數(shù)的半數(shù)以上的,是可以繼續(xù)讓村民們來(lái)辦理業(yè)務(wù)的,所以現(xiàn)在整個(gè)集群變成了這樣:

ZooKeeper的選舉機(jī)制是怎樣的

沒(méi)過(guò)一會(huì),因?yàn)殡娏镜姆e極搶修,馬小騰的辦事處恢復(fù)供電了,重新開(kāi)張了,但是每一個(gè)辦事處在開(kāi)張前都是處在 LOOKING  狀態(tài)的,還是會(huì)優(yōu)先投票給自己,并會(huì)通過(guò)復(fù)盤本地的存檔來(lái)得到自己辦事處最新的數(shù)據(jù),假設(shè)馬小騰停電前是這樣:

e:0      z:21       l: 馬小騰(49) LOOKING

他和之前一樣會(huì)給另外兩個(gè)辦事處發(fā)自己的選票

ZooKeeper的選舉機(jī)制是怎樣的

但和之前的情況不同,無(wú)論是馬果果還是馬小云他們現(xiàn)在都處在工作的狀態(tài),收到了馬小騰的選票后就會(huì)把當(dāng)前的 Leader  也就是馬果果的選票信息以及自己當(dāng)前的狀態(tài)發(fā)送給他。

馬果果發(fā)送的選票信息:

e:0      z:30       l: 馬果果(69) LEADING

馬小云發(fā)送的選票信息:

e:0      z:30       l: 馬果果(69) FOLLOWING

馬小騰收到兩位的選票信息后,知道了當(dāng)前的 Leader 是馬果果,并且馬果果本人也確認(rèn)了是 LEADING 狀態(tài),就馬上把自己的狀態(tài)修改為了  FOLLOWING 狀態(tài),并且會(huì)和之前一樣與 Leader 進(jìn)行數(shù)據(jù)的同步,關(guān)于具體怎么同步的,我打算留到之后再進(jìn)行講解~

同步之后,馬小騰的狀態(tài)變成了和馬小云一樣的了。

我再假設(shè)這里有一個(gè)平行世界,回到馬小騰剛恢復(fù)完供電準(zhǔn)備開(kāi)張上線的時(shí)候,此時(shí)的馬小騰的狀態(tài)假設(shè)是這樣的:

e:1      z:7       l: 馬小騰(49) LOOKING

哪怕 epoch 比目前的 Leader 還要大,其實(shí)照道理是更有資格當(dāng) Leader,但是由于當(dāng)前集群中的其他辦事處已經(jīng)有了一個(gè)明確的  Leader,馬小騰也只能忍辱負(fù)重(誰(shuí)讓你停電了呢)還是以 Follower 的身份加入到集群中來(lái),并且仍然以當(dāng)前 Leader  的信息來(lái)同步,你也可以理解為降級(jí)(把自己的 epoch 降級(jí)回 0 )

職場(chǎng)就是這么殘忍,你稍微請(qǐng)個(gè)長(zhǎng)假再回來(lái)可能已經(jīng)是物是人非了~

2.4 馬果果又病啦

馬果果畢竟年事已高,又又又生病了,辦事處只能含淚關(guān)門,但是和上一次馬小騰停電不同,這次是作為 Leader  的馬果果停止服務(wù)了,因?yàn)橹岸ㄏ碌囊?guī)定,整個(gè)辦事處集群必須得有一個(gè) Leader?,F(xiàn)在馬小云和馬小騰發(fā)現(xiàn) Leader 聯(lián)系不上了,說(shuō)明 Leader  無(wú)法服務(wù)了,他們就知道必須選出一個(gè)新的 Leader。于是紛紛將自己的狀態(tài)都修改為 LOOKING  狀態(tài),并且再次把候選人選為自己,重新向其他仍然可以提供服務(wù)的辦事處廣播自己的選票(當(dāng)前這個(gè)場(chǎng)景就是互相發(fā)選票了)。

ZooKeeper的選舉機(jī)制是怎樣的

無(wú)論誰(shuí)收到選票后經(jīng)過(guò)比較后都會(huì)知道是馬小騰勝出

e:1      ==  e:1 z:77      <   z:80 l: 馬小云(56)     l: 馬小騰(49)

馬小云會(huì)把自己的候選人修改為馬小騰之后重新再把自己的選票發(fā)出去,現(xiàn)在馬小騰就獲得了 2  票通過(guò),同時(shí)也滿足大于整個(gè)辦事處集群半數(shù)以上,所以馬小騰和馬小云各自修改狀態(tài)為 LEADING 和 FOLLOWING 后,并且會(huì)和之前說(shuō)的一樣,把 epoch  加 1 同時(shí)清空計(jì)數(shù)部分,最后重新恢復(fù)對(duì)村民提供服務(wù)。

而馬果果這邊病好以后,會(huì)重新開(kāi)張和之前的例子一樣也是先從 LOOKING 狀態(tài)開(kāi)始,最后會(huì)從其他兩馬那里得知目前的 Leader  是馬小騰之后,就會(huì)主動(dòng)和馬小騰同步數(shù)據(jù)并以 Follower 的身份加入到辦事處集群中對(duì)外提供服務(wù)。

2.5 招商引資

辦事處的熱火朝天被村委會(huì)看在了眼里,心想只有三個(gè)辦事處就能達(dá)到這樣的效果,如果有更多的辦事處呢?于是和三馬商量了下,決定對(duì)外招商引入社會(huì)資本,讓他們自己按照現(xiàn)有模式建立新的辦事處,這樣村委會(huì)不用出一分錢,村民還能獲得實(shí)在的好處,秒啊!

圖片

此舉一度引來(lái)社會(huì)資本的大量關(guān)注,但是商量過(guò)后,三馬又覺(jué)得如果過(guò)多的引入外部力量勢(shì)必會(huì)削弱自己手中的權(quán)力,所以又出了一個(gè)規(guī)定,三馬自封為  Participant 只有他們?nèi)齻€(gè)才有資格進(jìn)行 Leader 的競(jìng)選,而引入的社會(huì)資本所創(chuàng)建的辦事處只能作為 Observer  加入辦事處的集群中對(duì)外提供只讀服務(wù),沒(méi)有資格競(jìng)爭(zhēng) Leader,這樣就可以在不增加選舉復(fù)雜程度的同時(shí),提升整個(gè)辦事處集群對(duì)讀請(qǐng)求的吞吐量。

要聲明當(dāng)前節(jié)點(diǎn)是 Observer,需要在 zoo.cfg 中先配置 peerType=observer

同時(shí)聲明的集群信息最后要多加一個(gè) :observer 用來(lái)標(biāo)識(shí),這樣其他節(jié)點(diǎn)也會(huì)知道當(dāng)前 myid 為 1 和 2 都是 Observer

server.69=maguoguo:2888:3888 server.56=maxiaoyun:2888:3888 server.49=maxiaoteng:2888:3888 server.1=dongdong:2888:3888:observer server.2=jitaimei:2888:3888:observer

而在 LOOKING 狀態(tài)的 Observer 一開(kāi)始的 Leader 候選人也會(huì)選自己,但是選票信息被設(shè)置成了這樣,以東東舉例:

e:Long.MIN_VALUE      z:Long.MIN_VALUE       l: 東東(1) LOOKING

因?yàn)?epoch 被設(shè)置成了最小值所以這個(gè)選票等同于形同虛設(shè),可以被直接忽略,并且在三馬那里會(huì)維護(hù)一個(gè) Participant 的列表,如果他們收到了來(lái)自  Participant 以外的辦事處的選票會(huì)直接選擇忽略,所以可以說(shuō) Observer 的選票對(duì)選舉結(jié)果是完全沒(méi)有影響的。最終是等待 Participant  之間的選舉結(jié)果通知,Observer 自身修改狀態(tài)為 OBSERVING,開(kāi)始和 Leader 進(jìn)行同步數(shù)據(jù),這點(diǎn)和 Follower 沒(méi)區(qū)別,之后  Observer 和 Follower 會(huì)統(tǒng)稱為 Learner

2.6 小結(jié)

競(jìng)選 Leader 看的是 epoch、寫(xiě)請(qǐng)求操作數(shù)、myid 三個(gè)字段,依次比較誰(shuí)大誰(shuí)就更有資格成為 Leader

獲選超過(guò)半數(shù)以上的辦事處正式成為 Leader,修改自己狀態(tài)為 LEADING

其他 Participant 修改為 FOLLOWING,Observer 則修改為 OBSERVING

如果集群中已經(jīng)存在一個(gè) Leader,其他辦事處如果中途加入的話,直接跟隨該 Leader 即可

還得提一句,如果當(dāng)前可提供服務(wù)的節(jié)點(diǎn)已經(jīng)不足半數(shù)以上了,那么這個(gè)選舉就永遠(yuǎn)無(wú)法選出結(jié)果,每個(gè)節(jié)點(diǎn)都會(huì)一直處在 LOOKING  狀態(tài),整個(gè)辦事處集群也就無(wú)法對(duì)外提供服務(wù)了

三、猿話一下

扯蛋扯完了,現(xiàn)在用咱的行話對(duì)有一些概念再深入一下。

首先我必須要說(shuō)的是,故事里的三馬,為了一定的節(jié)目效果,我描述成了三個(gè)角色,但是實(shí)際中 ZK  服務(wù)端是不會(huì)做這樣的區(qū)分的,都是相同的代碼,根據(jù)不同的配置啟動(dòng),才有了運(yùn)行時(shí)期 Leader、Follower、Observer  的角色之分,所以更貼近于實(shí)際的應(yīng)該類似于火影里的影分身或者龍珠里的殘像拳之類的(好像混入了什么奇怪的東西)。

我畫(huà)了下選舉的簡(jiǎn)單流程圖:

ZooKeeper的選舉機(jī)制是怎樣的

其他地方我基本上都講過(guò)了,這里再講下紅色部分,因?yàn)榭赡芤恍┚W(wǎng)絡(luò)因素,發(fā)出去的選票對(duì)方卻沒(méi)收到,這個(gè)發(fā)起重新廣播投票就是為了能讓對(duì)方再重新發(fā)一次剛剛的選票。

同監(jiān)聽(tīng)客戶端 2181 端口不同的是,服務(wù)端集群之間相互通信,直接使用的是原生的 Socket 并沒(méi)有使用 NIO 或者是  Netty,因?yàn)榉?wù)端節(jié)點(diǎn)一共就這么幾個(gè)而且針對(duì)每一個(gè)其他節(jié)點(diǎn)都會(huì)啟動(dòng)一個(gè)線程去監(jiān)聽(tīng),所以直接采用了這種比較原始的并且是阻塞的方式通信,更簡(jiǎn)單直接,而且假設(shè)對(duì)方服務(wù)不可用了的話,  Socket 會(huì)直接報(bào)錯(cuò)退出。

收發(fā)選票也是采用了 ZK  中非常常見(jiàn)的生產(chǎn)者-消費(fèi)者模式,分別維護(hù)了兩個(gè)阻塞隊(duì)列,一個(gè)對(duì)應(yīng)發(fā)送出去的選票,一個(gè)對(duì)應(yīng)收到的選票,各自使用一個(gè)子線程去輪詢?cè)撟枞?duì)列。

之前的 ZK 是擁有 3 種選舉策略的,雖然另外兩種之前都是被廢棄的狀態(tài),不建議使用,但是通過(guò)配置文件還是可以強(qiáng)行使用的。不過(guò)在最新的 3.6.2  中另兩種策略直接從源碼中刪除了,現(xiàn)在只有一種選舉的策略,源碼中對(duì)應(yīng) FastLeaderElection,另外兩個(gè)我也沒(méi)研究過(guò),就不展開(kāi)了。

關(guān)于服務(wù)端之間的心跳檢測(cè):

  • 服務(wù)端之間的心跳檢測(cè)(PING)是由 Leader 發(fā)起的,發(fā)向所有集群中的其他節(jié)點(diǎn)

  • Follower 收到 PING 后會(huì)回一個(gè)PING 給 Leader 并帶上自己這邊的客戶端會(huì)話數(shù)據(jù)

  • 而 Leader 收到 Follower 的 PING 后,就會(huì)對(duì)這些客戶端進(jìn)行會(huì)話連接

以上就是ZooKeeper的選舉機(jī)制是怎樣的,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI