天天看點

Zookeeper(七)Zookeeper叢集角色及選舉原理分析

一、叢集角色解析

Zookeeper(七)Zookeeper叢集角色及選舉原理分析

Leader【上司者】

  主要工作:

  • 處理寫請求和讀請求
  • 發表叢集事務【寫請求同步ACK】
  • 協調叢集内部服務

  是否參與選舉:是

Follower【跟随者】

  • 處理非事務請求【讀請求】,轉發事務請求【寫請求】給Leader伺服器
  • 參與叢集事務過半投票【寫請求ACK】
  • 選舉Leader時進行投票

Observer【觀察者】

  • 提升非事務請求【讀請求】的性能,轉發事務請求【寫請求】給Leader伺服器,可以響應讀請求
  • 不參與投票選舉,也不參與叢集事務過半投票【寫請求ACK】
  • 動态擴充zookeeper叢集,而又不影響叢集的性能【因為觀察者節點不參與投票,即使是觀察者節點當機了,對叢集的運作狀态沒有影響】

  是否參與選舉:否

  PS:當ZooKeeper叢集中follower的數量很多時,投票過程會成為一個性能瓶頸,Observer主要就是為了解決投票造成的壓力。

二、選舉流程簡析

Leader election(選舉階段)

  節點在一開始都處于選舉階段,隻要有一個節點得到超過半數節點的票數,它就可以當選準Leader。

Discovery(發現階段)

  在這個階段,Followers跟準Leader進行通信,同步Followers最近接收的事務提議。

Synchronization(同步階段)

  同步階段主要是利用Leader前一階段獲得的最新提議曆史,同步叢集中所有的副本。同步完成之後準Leader才會成為真正的Leader。

Broadcast(廣播階段)

  到了這個階段,Zookeeper叢集才能正式對外提供事務服務,并且Leader可以進行消息廣播,響應用戶端的讀寫請求并同步資料。同時如果有新的節點加入,還需要對新節點進行同步。

三、叢集如何處理寫請求?【消息廣播流程】

Zookeeper(七)Zookeeper叢集角色及選舉原理分析

  處理過程如下:

  • 1、收到寫請求的follower,将寫請求發送給leader。
  • 2、leader收到來自follower(或observer)的寫請求後,首先計算這次寫操作之後的狀态,然後将這個寫請求轉換成帶有各種狀态的事務(如版本号、zxid等等)。
  • 3、leader将這個事務以提議的方式廣播出去(即發送proposal)。
  • 4、所有follower收到proposal後,對這個提議進行投票,投票完成後傳回ack給leader。follower的投票隻有兩種方式:(1)确認這次提議表示同意(2)丢棄這次提議表示不同意。
  • 5、leader收集投票結果,隻要投票數量超過半數,這次提議就通過。
  • 6、提議通過後,leader向所有server發送一個送出通知。
  • 7、所有節點将這次事務寫入事務日志,并進行送出。
  • 8、送出後,收到寫請求的那個server向用戶端傳回成功資訊。

四、選舉流程詳細分析【leader選舉和崩潰恢複流程】

Zookeeper(七)Zookeeper叢集角色及選舉原理分析

第一次啟動

  • (1)伺服器1啟動并發起一次選舉。伺服器1投自己一票,此時伺服器1票數一票,不夠半數以上(3票),則選舉無法完成,伺服器1狀态保持為LOOKING。
  • (2)伺服器2啟動,再發起一次選舉。伺服器1和2分别投自己一票并交換選票資訊
    • 伺服器1發現伺服器2的myid比自己目前投票推舉的(伺服器1) 大,更改選票為推舉伺服器2。
    • 此時伺服器1票數0票,伺服器2票數2票,沒有超過半數,選舉無法完成,伺服器1,2狀态保持LOOKING。
  • (3)伺服器3啟動,發起一次選舉。此時伺服器1和2都會更改選票為伺服器3。
    • 伺服器1為0票,伺服器2為0票,伺服器3為3票。此時伺服器3的票數已經超過半數,伺服器3當選Leader。
    • 伺服器1,2更改狀态為FOLLOWING,伺服器3更改狀态為LEADING。
  • (4)伺服器4啟動,發起一次選舉。此時伺服器1,2,3已經不是LOOKING狀态,不會更改選票資訊。
    • 伺服器3為3票,伺服器4為1票。此時伺服器4服從多數,更改選票資訊為伺服器3,并更改狀态為FOLLOWING。
  • (5)伺服器5啟動,同4一樣更新狀态為FOLLOWING。

非第一次啟動

  • (1)當ZooKeeper叢集中的一台伺服器出現以下兩種情況之一時,就會開始進入Leader選舉:
    • 伺服器初始化啟動。
    • 伺服器運作期間無法和Leader保持連接配接。
  • (2)而當一台機器進入Leader選舉流程時,目前叢集也可能會處于以下兩種狀态:
    • 叢集中本來就已經存在一個Leader【由于網絡波動導緻的暫時失聯,重選leader的場景】。
    • 對于第一種已經存在Leader的情況,機器試圖去選舉Leader時,會被告知目前伺服器的Leader資訊,對于該機器來說,僅僅需要和Leader機器建立連接配接,并進行狀态同步即可。
  • (3)叢集中确實不存在Leader,則遵循以下原則進行選舉:
    • 1️⃣EPOCH大的直接勝出
    • 2️⃣EPOCH相同,事務id大的勝出
    • 3️⃣事務id相同,伺服器id大的勝出

舉個????

繼續閱讀