<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的Leader選舉流程

          共 2507字,需瀏覽 6分鐘

           ·

          2021-06-05 12:59

          走過路過不要錯過

          點擊藍(lán)字關(guān)注我們


          一、Zookeeper集群

          Zookeeper可以配置多個實例共同構(gòu)成一個集群對外提供服務(wù)以達(dá)到水平擴展的目的,每個服務(wù)器上的數(shù)據(jù)都是相同的,每一個服務(wù)器均可以對外提供讀和寫的服務(wù),這點和Redis是相同的,即對客戶端來說每個服務(wù)器都是平等的。

          在集群中,需要一個Leader來完成處理事務(wù),協(xié)調(diào)Zookeeper中的其他節(jié)點等工作,接下來就來介紹Zookeeper集群是如何選擇出一個Leader節(jié)點的。

          1. ZK集群中服務(wù)器的狀態(tài)

          Zookeeper集群中服務(wù)器被劃分為以下四種狀態(tài)

          • LOOKING:尋找Leader狀態(tài)。處于該狀態(tài)的服務(wù)器會認(rèn)為集群中沒有Leader,需要進(jìn)行Leader選舉;

          • FOLLOWING:跟隨著狀態(tài),說明當(dāng)前服務(wù)器角色為Follower;

          • LEADING:領(lǐng)導(dǎo)者狀態(tài),表明當(dāng)前服務(wù)器角色為Leader;

          • OBSERVING:觀察者狀態(tài),表明當(dāng)前服務(wù)器角色為Observer。

          2. 選票信息

          每個選票中包含四個最基本的信息,服務(wù)器的ID,數(shù)據(jù)ID,邏輯時鐘以及選舉狀態(tài):

          • 服務(wù)器ID:即myId,服務(wù)器的唯一標(biāo)識,編號越大在選擇算法中的權(quán)重越大;

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

          • 邏輯時鐘:Epoch,邏輯時鐘,或者叫投票次數(shù),同一輪投票過程時鐘值是相同的,每投完一次票這個數(shù)據(jù)就會增加,然后與接收到的其他服務(wù)器返回的投票信息中的數(shù)值相比,根據(jù)不同的值做出不同的判斷;

          • 選舉狀態(tài):即上文提到的四種狀態(tài)。

          3. Leader選舉的觸發(fā)時機

          • 集群啟動,這個時候需要選舉出新的Leader;

          • Leader服務(wù)器宕機;

          • Follow服務(wù)器宕機后,Leader服務(wù)器發(fā)現(xiàn)自己已經(jīng)沒有過半的Follow跟隨自己了,不能對外提供服務(wù)(領(lǐng)導(dǎo)者選舉)。

          二、Leader的選舉流程

          1. 服務(wù)器啟動時期的Leader選舉

          假設(shè)想在的有三臺機器搭建集群,在集群初始化階段,當(dāng)只有一個服務(wù)器(Server1)啟動時,無法完成Leader的選舉;當(dāng)?shù)诙_服務(wù)器(Server2)啟動后,兩臺機器開始互相通信,每臺機器都會嘗試去選舉Leader,于是進(jìn)入了Leader選舉過程,這個過程大概如下:

          1. 每個Server發(fā)出一個投票投給自己。在初始情況下,Server1和Server2都會將自己作為Leader,將票投給自己。每次投票會包含所推舉的服務(wù)器的myid和ZXID,使用(myid,ZXID)來表示,此時Server1的投票為(1, 0),Server2的投票為(2, 0),然后各自將這個投票發(fā)給集群中的其他機器;

          2. 接受來自各個服務(wù)器的投票。集群的每個服務(wù)器收到投票后,首先判斷該投票是否有效,如檢查是否是本輪投票、是否來自LOOKING狀態(tài)的服務(wù)器;

          3. 處理投票。針對每一個投票,服務(wù)器都需要將別人的投票和自己的投票進(jìn)行PK,PK的規(guī)則如下:

            對于Server1而言,它的投票是(1, 0),接收Server2的投票為(2, 0),首先會比較兩者的ZXID,均為0,再比較myid,此時Server2的myid最大,于是更新自己的投票為(2, 0),然后重新投票,對于Server2而言,其無須更新自己的投票,只是再次向集群中所有機器發(fā)出上一次投票信息即可。

            1. 優(yōu)先檢查ZXID。ZXID比較大的服務(wù)器優(yōu)先作為Leader;

            2. 如果ZXID相同,那么就比較myid。myid較大的服務(wù)器作為Leader服務(wù)器。

          4. 統(tǒng)計投票。每次投票后,服務(wù)器都會統(tǒng)計投票信息,判斷是否已經(jīng)過半機器接收到相同的投票信息,對于Server1、Server2而言,都統(tǒng)計出集群中已經(jīng)有兩臺機器接受了(2, 0)的投票信息,此時便認(rèn)為已經(jīng)選出了Leader。

          5. 改變服務(wù)器狀態(tài)。一旦確定了Leader,每個服務(wù)器都會更新自己的狀態(tài),如果是Follower,那么就變更為FOLLOWING,如果是Leader,就變更為LEADING。

          2. 服務(wù)器運行期間的 Leader 選舉

          在Zookeeper運行期間,即便有新服務(wù)器加入,也不會影響到Leader,新加入的服務(wù)器會將原有的Leader服務(wù)器視為Leader,進(jìn)行同步。但是一旦Leader宕機了,那么整個集群就將暫停對外服務(wù),進(jìn)行新一輪Leader的選舉,其過程和啟動時期的Leader選舉過程基本一致。假設(shè)正在運行的有Server1、Server2、Server3三臺服務(wù)器,當(dāng)前Leader是Server2,若某一時刻Leader掛了,此時便開始Leader選舉。選舉過程如下:

          1. 變更狀態(tài)。Leader宕機后,余下的非Observer服務(wù)器都會將自己的服務(wù)器狀態(tài)變更為LOOKING,然后開始進(jìn)行Leader選舉流程;

          2. 每個Server會發(fā)出一個投票。在這個過程中,需要生成投票信息(myid,ZXID)每個服務(wù)器上的ZXID可能不同,我們假定Server1的ZXID為123,而Server3的ZXID為122;在第一輪投票中,Server1和Server3都會投自己,產(chǎn)生投票(1, 123),(3, 122),然后各自將投票發(fā)送給集群中所有機器;

          3. 接收來自各個服務(wù)器的投票。與啟動時過程相同;

          4. 處理投票;

          5. 統(tǒng)計投票;

          6. 改變服務(wù)器的狀態(tài)。





          往期精彩推薦



          騰訊、阿里、滴滴后臺面試題匯總總結(jié) — (含答案)

          面試:史上最全多線程面試題 !

          最新阿里內(nèi)推Java后端面試題

          JVM難學(xué)?那是因為你沒認(rèn)真看完這篇文章


          END


          關(guān)注作者微信公眾號 —《JAVA爛豬皮》


          了解更多java后端架構(gòu)知識以及最新面試寶典


          你點的每個好看,我都認(rèn)真當(dāng)成了


          看完本文記得給作者點贊+在看哦~~~大家的支持,是作者源源不斷出文的動力


          作者:周二鴨

          出處:https://www.cnblogs.com/jojop/p/14319464.html

          瀏覽 85
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  黄色一级大片在线观看 | 特黄AAAAAAAA免费看直播 | 丁香婷婷五月天亚洲天堂 | 欧美日高清视频免费在线播放 | 国产黄色免费看 |