ZooKeeper 05 - ZooKeeper 集羣的腦裂問題(Split Brain)

首發於 2018-12-08,修改於 2021-12-06。

1 ZooKeeper的主從機制

Leader == Master, Follower == Slaver.

集羣中的各個節點都會嘗試註冊爲leader節點, 其他沒有註冊成功的則成爲follower(隨從)節點.

這些follower節點通過watcher(觀察者)監控着leader節點:

—— ZooKeeper內部通過心跳機制來確定leader的狀態, 一旦leader節點出現問題, : 就能很快獲悉並迅速通知其他follower節點, 這些follower節點得知消息之後將及時採取相關操作.

2 什麼是ZooKeeper的腦裂

2.1 腦裂現象的表現

ZooKeeper集羣中, 各個節點間的網絡通信不良時, 容易出現腦裂(split-brain)現象:

集羣中的節點監聽不到leader節點的心跳, 就會認爲leader節點出了問題, 此時集羣將分裂爲不同的小集羣, 這些小集羣會各自選舉出自己的leader節點, 導致原有的集羣中出現多個leader節點.

—— 這就是腦裂現象.

2.2 爲什麼會出現腦裂

設想這樣一種情況:

① 集羣中網絡通信不好, 導致心跳監測超時 —— follower認爲leader節點由於某種原因掛掉了, 可其實leader節點並未真正掛掉 —— 這就是假死現象.
② leader節點假死後, ZooKeeper通知所有follower節點進行選舉 ==> 某個follower節點升級爲新的leader. —— 此時集羣中存在2個leader節點.
③ 此時ZooKeeper需要將新leader節點的信息通知給所有的follower節點, 還要通知到所有的client(比如通過: 搭建的Solr集羣中的Solr實例就是一個client), 而這個過程由於網絡等環境的影響, 消息到達就會存在快慢之分.
④ 如果部分client獲得了新leader節點的信息, 而部分沒有獲得, 而此時client向ZooKeeper發起讀寫請求, ZooKeeper內部的不一致就會導致: 部分client連接到了新的leader節點上, 而部分client連接到了舊的leader節點上 —— 服務中出現了2個leader, client不知道聽誰的好, 就像1個大腦被分裂成2個, 很形象吧O(∩_∩)O

3 ZooKeeper如何解決"腦裂"

3.1 3種可行的思路

(1) Quorums(ˈkwɔrəm, 法定人數)法:

通過設置法定人數, 進而確定集羣的容忍度, 當集羣中存活的節點少於法定人數, 集羣將不可用. 比如:

3個節點的集羣中, Quorums = 2 —— 集羣可以容忍 (3 - 2 = 1) 個節點失敗, 這時候還能選舉出leader, 集羣仍然可用;
4個節點的集羣中, Quorums = 3 —— 集羣同樣可以容忍 1 個節點失敗, 如果2個節點失敗, 那整個集羣就不可用了.

(2) Redundant communications(冗餘通信):

集羣中採用多種通信方式, 防止一種通信方式失效導致集羣中的節點無法通信.

(3) Fencing(共享資源):

通過共享資源的方式, 將所有共享資源添加到集羣中, 能對共享資源進行寫操作(即加鎖)的節點就是leader節點.

3.2 ZooKeeper採用的方法

ZooKeeper默認採用了Quorums(法定人數)的方式: 只有獲得超過半數節點的投票, 才能選舉出leader.

這種方式可以確保要麼選出唯一的leader, 要麼選舉失敗.

ZooKeeper中Quorums的作用:

① 指定集羣中選舉leader所需的最少節點數, 保證集羣可用;
② client的數據被安全保存到集羣中所需的最少節點數, 一旦這些節點保存了數據, 客戶端將被通知數據已經安全保存, 可以繼續其他任務 —— 基於最終一致性, 集羣中剩餘的節點最終也會保存相關的數據.

ZooKeeper的寫也遵循quorum機制, 因此得不到大多數支持的寫是無效的.

3.3 ZooKeeper的具體解決思路

假設: leader發生了假死, followers選舉出了一個新的leader.

當舊的leader復活並認爲自己仍然是leader, 它向其他followers發出寫請求時, 會被拒絕.

—— 因爲ZooKeeper維護了一個叫epoch的變量, 每當新leader產生時, epoch都會遞增, followers如果確認了新的leader存在, 同時也會知道其epoch的值 —— 它們會拒絕epoch小於現任leader的epoch的所有舊leader的任何請求.

注意: 仍然會存在有部分followers不知道新leader的存在, 但肯定不是大多數, 否則新leader將無法產生.

參考資料

zookeeper(二)常見問題彙總

Zookeeper集羣節點數量爲什麼要是奇數個?


版權聲明

作者:瘦風(https://healchow.com)

出處:博客園-瘦風的南牆(https://www.cnblogs.com/shoufeng)

感謝閱讀,公衆號 「瘦風的南牆」 ,手機端閱讀更佳,還有其他福利和心得輸出,歡迎掃碼關注🤝

本文版權歸博主所有,歡迎轉載,但 [必須在頁面明顯位置標明原文鏈接],否則博主保留追究相關人士法律責任的權利。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章