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