zookeeper分佈式協調工具工作原理以及選舉流程

1、zookeeper一致性原理

一致性概念:強一致性、弱一致性、最終一致性

爲了保證主從節點的數據一致性,Zookeeper 採用了 ZAB 協議,這種協議非常類似於一致性算法 Paxos和 Raft

什麼是 ZAB

Zookeeper Atomic Broadcast,有效解決了 Zookeeper 集羣崩潰恢復,以及主從同步數據的問題。

#ZAB 協議定義的三種節點狀態

  • Looking :選舉狀態。
  • Following :Follower 節點(從節點)所處的狀態。
  • Leading :Leader 節點(主節點)所處狀態。

#最大 ZXID

最大 ZXID 也就是節點本地的最新事務編號,包含 epoch 和計數兩部分。epoch 是紀元的意思,相當於 Raft 算法選主時候的 term。

#ZAB 的崩潰恢復

假如 Zookeeper 當前的主節點掛掉了,集羣會進行崩潰恢復。ZAB 的崩潰恢復分成三個階段:

Leader election

選舉階段,此時集羣中的節點處於 Looking 狀態。它們會各自向其他節點發起投票,投票當中包含自己的服務器 ID 和最新事務 ID(ZXID)。

接下來,節點會用自身的 ZXID 和從其他節點接收到的 ZXID 做比較,如果發現別人家的 ZXID 比自己大,也就是數據比自己新,那麼就重新發起投票,投票給目前已知最大的 ZXID 所屬節點。

每次投票後,服務器都會統計投票數量,判斷是否有某個節點得到半數以上的投票。如果存在這樣的節點,該節點將會成爲準 Leader,狀態變爲 Leading。其他節點的狀態變爲 Following。

Discovery

發現階段,用於在從節點中發現最新的 ZXID 和事務日誌。或許有人會問:既然 Leader 被選爲主節點,已經是集羣裏數據最新的了,爲什麼還要從節點中尋找最新事務呢?

這是爲了防止某些意外情況,比如因網絡原因在上一階段產生多個 Leader 的情況。

所以這一階段,Leader 集思廣益,接收所有 Follower 發來各自的最新 epoch 值。Leader 從中選出最大的 epoch,基於此值加 1,生成新的 epoch 分發給各個 Follower。

各個 Follower 收到全新的 epoch 後,返回 ACK 給 Leader,帶上各自最大的 ZXID 和歷史事務日誌。Leader 選出最大的 ZXID,並更新自身歷史日誌。

Synchronization

同步階段,把 Leader 剛纔收集得到的最新歷史事務日誌,同步給集羣中所有的 Follower。只有當半數 Follower 同步成功,這個準 Leader 才能成爲正式的 Leader。

自此,故障恢復正式完成。

#ZAB 的數據寫入

Broadcast

ZAB 的數據寫入涉及到 Broadcast 階段,簡單來說,就是 Zookeeper 常規情況下更新數據的時候,由 Leader 廣播到所有的 Follower。其過程如下:

  • 客戶端發出寫入數據請求給任意 Follower。
  • Follower 把寫入數據請求轉發給 Leader。
  • Leader 採用二階段提交方式,先發送 Propose 廣播給 Follower。
  • Follower 接到 Propose 消息,寫入日誌成功後,返回 ACK 消息給 Leader。
  • Leader 接到半數以上ACK消息,返回成功給客戶端,並且廣播 Commit 請求給 Follower

ZAB 協議既不是強一致性,也不是弱一致性,而是處於兩者之間的單調一致性(順序一致性)。它依靠事務 ID 和版本號,保證了數據的更新和讀取是有序的。

2、zookeeper集羣選舉原理

zk的工作原理-選舉流程

zk的核心原子廣播,這個機制保證了各個Server之間的同步,實現這個機制的協議叫做Zab協議。Zab協議有兩種模式,分別是恢復模式(選主)和廣播模式(同步) .當服務器啓動或者leader崩潰以後,Zab進入一個恢
復模式,當Leader被選舉出來以後,然後進行同步模式。
zxid:是一個64位的數字,高32位是epoch, 用來標誌leader關係是否改變了,每一次新的leader選出來以後,都會用有一個新的epoch。 低32位用來遞增計數。zxid越大,表示數據越新。
serverid:給定服務器標誌的1d。
Epoch:選舉的輪數

當Leader崩潰或者Leader失去了大多數的follower, zk進入恢復模式,然後選出一個新的leader

zk選舉算法兩種,一種是基於basic paxos實現,一種是基於fast paxos算法實現的。zk系統默認的是fast

server在工作過程中的三個狀態:
LOOKING:當前server不知道Leader是誰,正在尋找。
LEADING:當前setver就是剛選舉出來的leader.
FOLLOWDING: leader已經選出來了,當前server正在和它同步 .

basic paxos流程:
1、選舉線程由當前server發起選舉的線程擔任, 主要是對投票結果進行統計,並選出推薦的server
2、選舉線程首先向所有的server發起一次詢問(包括自己)
3、選舉線程收到回覆以後,驗證是否是自己發起的詢問(驗證zxid是否一致),然後獲取對方的id,並存儲到當前的詢問對象列表裏,最後獲取對方提議的leader相關信息(myid, zxid) 。
4、收到所有的server回覆以後,就計算出zxid最大的那個server,將這個server相關信息設置成下一個投票的server.
5、線程將當前的zxid最大的server設置成要推薦的leader,如果此時獲勝的server獲得n/2+1的server票數,這個server就獲勝成爲當前新的leader.
備註: server總數必須是奇數2n+1

發佈了60 篇原創文章 · 獲贊 12 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章