摘要:本篇文章著重來給大家講一下中的腦裂問題,以及是如果解決腦裂問題的。過半機制在領導者選舉的過程中,如果某臺獲得了超過半數的選票,則此就可以成為了。就是為了防止腦裂。有痛點才有創新,一個技術肯定都是為了解決某個痛點才出現的。
什么是腦裂
腦裂(split-brain)就是“大腦分裂”,也就是本來一個“大腦”被拆分了兩個或多個“大腦”,我們都知道,如果一個人有多個大腦,并且相互獨立的話,那么會導致人體“手舞足蹈”,“不聽使喚”。
腦裂通常會出現在集群環境中,比如ElasticSearch、Zookeeper集群,而這些集群環境有一個統一的特點,就是它們有一個大腦,比如ElasticSearch集群中有Master節點,Zookeeper集群中有Leader節點。
本篇文章著重來給大家講一下Zookeeper中的腦裂問題,以及是如果解決腦裂問題的。
Zookeeper集群中的腦裂場景對于一個集群,想要提高這個集群的可用性,通常會采用多機房部署,比如現在有一個由6臺zkServer所組成的一個集群,部署在了兩個機房:
正常情況下,此集群只會有一個Leader,那么如果機房之間的網絡斷了之后,兩個機房內的zkServer還是可以相互通信的,如果不考慮過半機制,那么就會出現每個機房內部都將選出一個Leader。
這就相當于原本一個集群,被分成了兩個集群,出現了兩個“大腦”,這就是腦裂。
對于這種情況,我們也可以看出來,原本應該是統一的一個集群對外提供服務的,現在變成了兩個集群同時對外提供服務,如果過了一會,斷了的網絡突然聯通了,那么此時就會出現問題了,兩個集群剛剛都對外提供服務了,數據該怎么合并,數據沖突怎么解決等等問題。
剛剛在說明腦裂場景時,有一個前提條件就是沒有考慮過半機制,所以實際上Zookeeper集群中是不會出現腦裂問題的,而不會出現的原因就跟過半機制有關。
過半機制在領導者選舉的過程中,如果某臺zkServer獲得了超過半數的選票,則此zkServer就可以成為Leader了。
過半機制的源碼實現其實非常簡單:
public class QuorumMaj implements QuorumVerifier { private static final Logger LOG = LoggerFactory.getLogger(QuorumMaj.class); int half; // n表示集群中zkServer的個數(準確的說是參與者的個數,參與者不包括觀察者節點) public QuorumMaj(int n){ this.half = n/2; } // 驗證是否符合過半機制 public boolean containsQuorum(Setset){ // half是在構造方法里賦值的 // set.size()表示某臺zkServer獲得的票數 return (set.size() > half); } }
大家仔細看一下上面方法中的注釋,核心代碼就是下面兩行:
this.half = n/2; return (set.size() > half);
舉個簡單的例子:
如果現在集群中有5臺zkServer,那么half=5/2=2,那么也就是說,領導者選舉的過程中至少要有三臺zkServer投了同一個zkServer,才會符合過半機制,才能選出來一個Leader。
那么有一個問題我們想一下,選舉的過程中為什么一定要有一個過半機制驗證?
因為這樣不需要等待所有zkServer都投了同一個zkServer就可以選舉出來一個Leader了,這樣比較快,所以叫快速領導者選舉算法唄。
那么再來想一個問題,過半機制中為什么是大于,而不是大于等于呢?
這就是更腦裂問題有關系了,比如回到上文出現腦裂問題的場景:
當機房中間的網絡斷掉之后,機房1內的三臺服務器會進行領導者選舉,但是此時過半機制的條件是set.size() > 3,也就是說至少要4臺zkServer才能選出來一個Leader,所以對于機房1來說它不能選出一個Leader,同樣機房2也不能選出一個Leader,這種情況下整個集群當機房間的網絡斷掉后,整個集群將沒有Leader。
而如果過半機制的條件是set.size() >= 3,那么機房1和機房2都會選出一個Leader,這樣就出現了腦裂。所以我們就知道了,為什么過半機制中是大于,而不是大于等于。就是為了防止腦裂。
如果假設我們現在只有5臺機器,也部署在兩個機房:
此時過半機制的條件是set.size() > 2,也就是至少要3臺服務器才能選出一個Leader,此時機房件的網絡斷開了,對于機房1來說是沒有影響的,Leader依然還是Leader,對于機房2來說是選不出來Leader的,此時整個集群中只有一個Leader。
所以,我們可以總結得出,有了過半機制,對于一個Zookeeper集群,要么沒有Leader,要沒只有1個Leader,這樣就避免了腦裂問題。
有痛點才有創新,一個技術肯定都是為了解決某個痛點才出現的。
請幫忙轉發一下,如果想第一時間學習更多的精彩的內容,請關注微信公眾號:1點25
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75570.html
摘要:摘要目前是最流行的開源分布式搜索引擎系統,其使用作為單機存儲引擎并提供強大的搜索查詢能力。前言分布式一致性原理剖析系列將會對的分布式一致性原理進行詳細的剖析,介紹其實現方式原理以及其存在的問題等基于版本。相當于一次正常情況的新節點加入。 摘要: ES目前是最流行的開源分布式搜索引擎系統,其使用Lucene作為單機存儲引擎并提供強大的搜索查詢能力。學習其搜索原理,則必須了解Lucene,...
摘要:摘要目前是最流行的開源分布式搜索引擎系統,其使用作為單機存儲引擎并提供強大的搜索查詢能力。前言分布式一致性原理剖析系列將會對的分布式一致性原理進行詳細的剖析,介紹其實現方式原理以及其存在的問題等基于版本。相當于一次正常情況的新節點加入。 摘要: ES目前是最流行的開源分布式搜索引擎系統,其使用Lucene作為單機存儲引擎并提供強大的搜索查詢能力。學習其搜索原理,則必須了解Lucene,...
摘要:是如何實現的我們前面說到,是如何判斷是否健康,接下來當處于非健康狀態時,是如何進行切換的呢在這個類中,實行了兩個重要的函數,一個叫,另一個叫,顧名思義就是選舉和健康檢查用的回調函數,其中還有兩個重要的組成部分,,總體的就如上圖所示。 博客原文:hackershell 之前在準備中級課程PPT,整理了下HA的基本內容,并且感謝松哥為我們提供了HA不會切的問題,以至于之后剛好出現的Name...
閱讀 2424·2021-11-23 10:04
閱讀 1494·2021-09-02 15:21
閱讀 891·2019-08-30 15:44
閱讀 1060·2019-08-30 10:48
閱讀 707·2019-08-29 17:21
閱讀 3553·2019-08-29 13:13
閱讀 1983·2019-08-23 17:17
閱讀 1784·2019-08-23 17:04