首發於 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將無法產生.
參考資料
版權宣告
出處:部落格園-瘦風的南牆(https://www.cnblogs.com/shoufeng)
感謝閱讀,公眾號 「瘦風的南牆」 ,手機端閱讀更佳,還有其他福利和心得輸出,歡迎掃碼關注?
本文版權歸博主所有,歡迎轉載,但 [必須在頁面明顯位置標明原文連結],否則博主保留追究相關人士法律責任的權利。