欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Zookeeper如何解決腦裂問(wèn)題?

什么是腦裂?

腦裂(split-brain)就是“大腦分裂”,也就是本來(lái)一個(gè)“大腦”被拆分了兩個(gè)或多個(gè)“大腦”,我們都知道,如果一個(gè)人有多個(gè)大腦,并且相互獨(dú)立的話,那么會(huì)導(dǎo)致人體“手舞足蹈”,“不聽(tīng)使喚”。

創(chuàng)新互聯(lián)是一家業(yè)務(wù)范圍包括IDC托管業(yè)務(wù),網(wǎng)頁(yè)空間、主機(jī)租用、主機(jī)托管,四川、重慶、廣東電信服務(wù)器租用,四川聯(lián)通機(jī)房服務(wù)器托管,成都網(wǎng)通服務(wù)器托管,成都服務(wù)器租用,業(yè)務(wù)范圍遍及中國(guó)大陸、港澳臺(tái)以及歐美等多個(gè)國(guó)家及地區(qū)的互聯(lián)網(wǎng)數(shù)據(jù)服務(wù)公司。

腦裂通常會(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ī)房:

Zookeeper如何解決腦裂問(wèn)題?

正常情況下,此集群只會(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。

Zookeeper如何解決腦裂問(wèn)題?

這就相當(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(Set<Long> set){
       // 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)景:

Zookeeper如何解決腦裂問(wèn)題?

當(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ī)房:

Zookeeper如何解決腦裂問(wèn)題?

此時(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)題。


推薦閱讀

金三銀四季,阿里工作10多年Java大牛的“心得”,獻(xiàn)給迷茫中的你

本文題目:Zookeeper如何解決腦裂問(wèn)題?
標(biāo)題網(wǎng)址:http://www.chinadenli.net/article38/jcoipp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司網(wǎng)站制作網(wǎng)頁(yè)設(shè)計(jì)公司Google全網(wǎng)營(yíng)銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化