ZooKeeper 03 - ZooKeeper集群的腦裂問題 (Split Brain問題)


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集群節點數量為什么要是奇數個?

版權聲明

作者: 馬瘦風

出處: 博客園 馬瘦風的博客

您的支持是對博主的極大鼓勵, 感謝您的閱讀.

本文版權歸博主所有, 歡迎轉載, 但請保留此段聲明, 並在文章頁面明顯位置給出原文鏈接, 否則博主保留追究相關人員法律責任的權利.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM