什麼是ZooKeeper的腦裂? 為什麼會發生腦裂現象? ZooKeeper如何解決腦裂? 本篇文章告訴你答案~ ...
目錄
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將無法產生.
參考資料
版權聲明
作者: ma_shoufeng(馬瘦風)
出處: 博客園 馬瘦風的博客
您的支持是對博主的極大鼓勵, 感謝您的閱讀.
本文版權歸博主所有, 歡迎轉載, 但請保留此段聲明, 併在文章頁面明顯位置給出原文鏈接, 否則博主保留追究相關人員法律責任的權利.