<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用大白話給你解釋Zookeeper的選舉機(jī)制

          共 3272字,需瀏覽 7分鐘

           ·

          2020-12-17 18:47


          Zookeeper 是一個(gè)分布式服務(wù)框架,主要是用來(lái)解決分布式應(yīng)用中遇到的一些數(shù)據(jù)管理問題如:統(tǒng)一命名服務(wù)狀態(tài)同步服務(wù)集群管理分布式應(yīng)用配置項(xiàng)的管理等。

          我們可以簡(jiǎn)單把 Zookeeper 理解為分布式家庭的大管家,那么管家團(tuán)隊(duì)是如何選出Leader的呢?好奇嗎,接下來(lái)帶領(lǐng)大家一探究竟。

          人類選舉的基本原理

          講解 Zookeeper 選舉過程前先來(lái)介紹一下人類的選舉。

          我們每個(gè)人或多或少都經(jīng)歷過幾次選舉,在投票的過程中可能會(huì)遇到這樣幾種情況:

          情況1:自己與幾個(gè)候選人都比較熟,你會(huì)將票投給你認(rèn)為能力比較強(qiáng)的人

          熟人選舉

          情況2:自己也是候選人,并且與其他幾個(gè)候選人都不熟,這個(gè)時(shí)候你肯定想著要去拉票,因?yàn)橛X得自己才是最厲害的人呀,所有人都應(yīng)該把票投給我。但是遺憾的是在拉票的過程中,你發(fā)現(xiàn)別人比你強(qiáng),你開始自卑了,最終還是把票投給了自己認(rèn)為最強(qiáng)的人。

          自己參與選舉

          所有人都投完票之后,最后從投票箱中進(jìn)行統(tǒng)計(jì),獲得票數(shù)最多的人當(dāng)選。

          思維導(dǎo)圖

          在整個(gè)投票過程中我們可以提煉出四個(gè)最核心的概念:

          • 候選人能力:投票的基本原則是選最強(qiáng)的人。
          • 遇強(qiáng)改投:如果后面發(fā)現(xiàn)更強(qiáng)的人可以改投票。
          • 投票箱:所有人的票都會(huì)放在投票箱。
          • 領(lǐng)導(dǎo)者:得票最多的人即為領(lǐng)導(dǎo)者。

          從人類選舉的原理我們來(lái)簡(jiǎn)單推導(dǎo)一下Zookeeper的選舉原理。

          Zookeeper選舉的基本原理

          注意如果 Zookeeper 是單機(jī)部署是不需要選舉的,集群模式下才需要選舉。

          Zookeeper 的選舉原理和人類選舉的邏輯類似,套用一下人類選舉的四個(gè)基本概念詳細(xì)解釋一下Zookeeper。

          • 個(gè)人能力

          如何衡量 Zookeeper 節(jié)點(diǎn)個(gè)人能力?答案是靠數(shù)據(jù)是否夠新,如果節(jié)點(diǎn)的數(shù)據(jù)越新就代表這個(gè)節(jié)點(diǎn)的個(gè)人能力越強(qiáng),是不是感覺很奇怪,就是這么定的!

          在 Zookeeper 中通常是以事務(wù)id(后面簡(jiǎn)稱zxid)來(lái)標(biāo)識(shí)數(shù)據(jù)的新舊程度(版本),節(jié)點(diǎn)最新的zxid越大代表這個(gè)節(jié)點(diǎn)的數(shù)據(jù)越新,也就代表這個(gè)節(jié)點(diǎn)能力越強(qiáng)。

          zxid 的全稱是 ZooKeeper Transaction Id,即 Zookeeper 事務(wù)id。

          • 遇強(qiáng)改投

          在集群選舉開始時(shí),節(jié)點(diǎn)首先認(rèn)為自己是最強(qiáng)的(即數(shù)據(jù)是最新的),然后在選票上寫上自己的名字(包括zxidsid),zxid 是事務(wù)id,sid 唯一標(biāo)識(shí)自己。

          緊接著會(huì)將選票傳遞給其他節(jié)點(diǎn),同時(shí)自己也會(huì)接收其他節(jié)點(diǎn)傳過來(lái)的選票。每個(gè)節(jié)點(diǎn)接收到選票后會(huì)做比較,這個(gè)人是不是比我強(qiáng)(zxid比我大),如果比較強(qiáng),那我就需要改票,明明別人比我強(qiáng),我也不能厚著臉皮對(duì)吧。

          • 投票箱

          與人類選舉投票箱稍微有點(diǎn)不一樣,Zookeeper 集群會(huì)在每個(gè)節(jié)點(diǎn)的內(nèi)存中維護(hù)一個(gè)投票箱。節(jié)點(diǎn)會(huì)將自己的選票以及其他節(jié)點(diǎn)的選票都放在這個(gè)投票箱中。由于選票是互相傳閱的,所以最終每個(gè)節(jié)點(diǎn)投票箱中的選票會(huì)是一樣的。

          • 領(lǐng)導(dǎo)者

          在投票的過程中會(huì)去統(tǒng)計(jì)是否有超過一半的選票和自己選擇的是同一個(gè)節(jié)點(diǎn),即都認(rèn)為某個(gè)節(jié)點(diǎn)是最強(qiáng)的。一旦集群中有超過半數(shù)的節(jié)點(diǎn)都認(rèn)為某個(gè)節(jié)點(diǎn)最強(qiáng),那該節(jié)點(diǎn)就是領(lǐng)導(dǎo)者了,投票也宣告結(jié)束。

          什么場(chǎng)景下 Zookeeper 需要選舉?

          當(dāng) Zookeeper 集群中的一臺(tái)服務(wù)器出現(xiàn)以下兩種情況之一時(shí),需要進(jìn)入 Leader 選舉

          (1)服務(wù)器初始化啟動(dòng)。

          (2)服務(wù)器運(yùn)行期間 Leader 故障。

          啟動(dòng)時(shí)期的 Leader 選舉

          假設(shè)一個(gè) Zookeeper 集群中有5臺(tái)服務(wù)器,id從1到5編號(hào),并且它們都是最新啟動(dòng)的,沒有歷史數(shù)據(jù)。

          集群剛啟動(dòng)選舉過程

          假設(shè)服務(wù)器依次啟動(dòng),我們來(lái)分析一下選舉過程:

          (1)服務(wù)器1啟動(dòng)

          發(fā)起一次選舉,服務(wù)器1投自己一票,此時(shí)服務(wù)器1票數(shù)一票,不夠半數(shù)以上(3票),選舉無(wú)法完成。

          投票結(jié)果:服務(wù)器1為1票。

          服務(wù)器1狀態(tài)保持為LOOKING

          (2)服務(wù)器2啟動(dòng)

          發(fā)起一次選舉,服務(wù)器1和2分別投自己一票,此時(shí)服務(wù)器1發(fā)現(xiàn)服務(wù)器2的id比自己大,更改選票投給服務(wù)器2。

          投票結(jié)果:服務(wù)器1為0票,服務(wù)器2為2票。

          服務(wù)器1,2狀態(tài)保持LOOKING

          (3)服務(wù)器3啟動(dòng)

          發(fā)起一次選舉,服務(wù)器1、2、3先投自己一票,然后因?yàn)榉?wù)器3的id最大,兩者更改選票投給為服務(wù)器3;

          投票結(jié)果:服務(wù)器1為0票,服務(wù)器2為0票,服務(wù)器3為3票。此時(shí)服務(wù)器3的票數(shù)已經(jīng)超過半數(shù)(3票),服務(wù)器3當(dāng)選Leader

          服務(wù)器1,2更改狀態(tài)為FOLLOWING,服務(wù)器3更改狀態(tài)為LEADING

          (4)服務(wù)器4啟動(dòng)

          發(fā)起一次選舉,此時(shí)服務(wù)器1,2,3已經(jīng)不是LOOKING 狀態(tài),不會(huì)更改選票信息。交換選票信息結(jié)果:服務(wù)器3為3票,服務(wù)器4為1票。此時(shí)服務(wù)器4服從多數(shù),更改選票信息為服務(wù)器3。

          服務(wù)器4并更改狀態(tài)為FOLLOWING

          (5)服務(wù)器5啟動(dòng)

          與服務(wù)器4一樣投票給3,此時(shí)服務(wù)器3一共5票,服務(wù)器5為0票。

          服務(wù)器5并更改狀態(tài)為FOLLOWING

          最終的結(jié)果

          服務(wù)器3是 Leader,狀態(tài)為 LEADING;其余服務(wù)器是 Follower,狀態(tài)為 FOLLOWING

          運(yùn)行時(shí)期的Leader選舉

          在 Zookeeper運(yùn)行期間 Leader非 Leader 各司其職,當(dāng)有非 Leader 服務(wù)器宕機(jī)或加入不會(huì)影響 Leader,但是一旦 Leader 服務(wù)器掛了,那么整個(gè) Zookeeper 集群將暫停對(duì)外服務(wù),會(huì)觸發(fā)新一輪的選舉。

          初始狀態(tài)下服務(wù)器3當(dāng)選為Leader,假設(shè)現(xiàn)在服務(wù)器3故障宕機(jī)了,此時(shí)每個(gè)服務(wù)器上zxid可能都不一樣,server1為99,server2為102,server4為100,server5為101

          集群 Leader 節(jié)點(diǎn)故障

          運(yùn)行期選舉與初始狀態(tài)投票過程基本類似,大致可以分為以下幾個(gè)步驟:

          (1)狀態(tài)變更。Leader 故障后,余下的非 Observer 服務(wù)器都會(huì)將自己的服務(wù)器狀態(tài)變更為LOOKING,然后開始進(jìn)入Leader選舉過程

          (2)每個(gè)Server會(huì)發(fā)出投票。

          (3)接收來(lái)自各個(gè)服務(wù)器的投票,如果其他服務(wù)器的數(shù)據(jù)比自己的新會(huì)改投票。

          (4)處理和統(tǒng)計(jì)投票,每一輪投票結(jié)束后都會(huì)統(tǒng)計(jì)投票,超過半數(shù)即可當(dāng)選。

          (5)改變服務(wù)器的狀態(tài),宣布當(dāng)選。

          話不多說(shuō)先來(lái)一張圖:

          運(yùn)行器 Leader 故障后選舉流程

          (1)第一次投票,每臺(tái)機(jī)器都會(huì)將票投給自己。

          (2)接著每臺(tái)機(jī)器都會(huì)將自己的投票發(fā)給其他機(jī)器,如果發(fā)現(xiàn)其他機(jī)器的zxid比自己大,那么就需要改投票重新投一次。比如server1 收到了三張票,發(fā)現(xiàn)server2的xzid為102,pk一下發(fā)現(xiàn)自己輸了,后面果斷改投票選server2為老大。

          選舉機(jī)制中涉及到的核心概念

          敲黑板了,這些概念是面試必考的。

          (1)Server id(或sid):服務(wù)器ID

          比如有三臺(tái)服務(wù)器,編號(hào)分別是1,2,3。編號(hào)越大在選擇算法中的權(quán)重越大,比如初始化啟動(dòng)時(shí)就是根據(jù)服務(wù)器ID進(jìn)行比較。

          (2)Zxid:事務(wù)ID

          服務(wù)器中存放的數(shù)據(jù)的事務(wù)ID,值越大說(shuō)明數(shù)據(jù)越新,在選舉算法中數(shù)據(jù)越新權(quán)重越大。

          (3)Epoch:邏輯時(shí)鐘

          也叫投票的次數(shù),同一輪投票過程中的邏輯時(shí)鐘值是相同的,每投完一次票這個(gè)數(shù)據(jù)就會(huì)增加。

          (4)Server狀態(tài):選舉狀態(tài)

          LOOKING,競(jìng)選狀態(tài)。

          FOLLOWING,隨從狀態(tài),同步leader狀態(tài),參與投票。

          OBSERVING,觀察狀態(tài),同步leader狀態(tài),不參與投票。

          LEADING,領(lǐng)導(dǎo)者狀態(tài)。

          總結(jié)

          (1)Zookeeper 選舉會(huì)發(fā)生在服務(wù)器初始狀態(tài)和運(yùn)行狀態(tài)下。

          (2)初始狀態(tài)下會(huì)根據(jù)服務(wù)器sid的編號(hào)對(duì)比,編號(hào)越大權(quán)值越大,投票過半數(shù)即可選出Leader。

          (3)Leader 故障會(huì)觸發(fā)新一輪選舉,zxid 代表數(shù)據(jù)越新,權(quán)值也就越大。

          (4)在運(yùn)行期選舉還可能會(huì)遇到腦裂的情況,大家可以自行學(xué)習(xí)。


          瀏覽 66
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本中文字幕播放 | 十八女人毛片 | 亚洲高清视频在线观看在线观看 | 亚洲精品国产原创在线 | 人人插人人搞 |