成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

運(yùn)維必備:Zookeeper集群“腦裂”問(wèn)題處理大全

運(yùn)維 系統(tǒng)運(yùn)維
本文重點(diǎn)分享Zookeeper腦裂問(wèn)題的處理辦法。ZooKeeper是用來(lái)協(xié)調(diào)(同步)分布式進(jìn)程的服務(wù),提供了一個(gè)簡(jiǎn)單高性能的協(xié)調(diào)內(nèi)核,用戶可以在此之上構(gòu)建更多復(fù)雜的分布式協(xié)調(diào)功能。

本文重點(diǎn)分享Zookeeper腦裂問(wèn)題的處理辦法。ZooKeeper是用來(lái)協(xié)調(diào)(同步)分布式進(jìn)程的服務(wù),提供了一個(gè)簡(jiǎn)單高性能的協(xié)調(diào)內(nèi)核,用戶可以在此之上構(gòu)建更多復(fù)雜的分布式協(xié)調(diào)功能。

腦裂通常會(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)。

一、 Zookeeper集群節(jié)點(diǎn)為什么要部署成奇數(shù)

Zookeeper容錯(cuò)指的是當(dāng)宕掉幾個(gè)Zookeeper節(jié)點(diǎn)服務(wù)器之后,剩下的個(gè)數(shù)必須大于宕掉的個(gè)數(shù),也就是剩下的節(jié)點(diǎn)服務(wù)數(shù)必須大于n/2,這樣Zookeeper集群才可以繼續(xù)使用,無(wú)論奇偶數(shù)都可以選舉Leader。例如5臺(tái)Zookeeper節(jié)點(diǎn)機(jī)器最多宕掉2臺(tái),還可以繼續(xù)使用,因?yàn)槭O?臺(tái)大于5/2。

至于為什么最好為奇數(shù)個(gè)節(jié)點(diǎn)?

這樣是為了以最大容錯(cuò)服務(wù)器個(gè)數(shù)的條件下,能節(jié)省資源。

比如,最大容錯(cuò)為2的情況下,對(duì)應(yīng)的Zookeeper服務(wù)數(shù),奇數(shù)為5,而偶數(shù)為6,也就是6個(gè)Zookeeper服務(wù)的情況下最多能宕掉2個(gè)服務(wù)。

所以從節(jié)約資源的角度看,沒(méi)必要部署6(偶數(shù))個(gè)Zookeeper服務(wù)節(jié)點(diǎn)。

Zookeeper集群有這樣一個(gè)特性:集群中只要有過(guò)半的機(jī)器是正常工作的,那么整個(gè)集群對(duì)外就是可用的。

也就是說(shuō)如果有2個(gè)Zookeeper節(jié)點(diǎn),那么只要有1個(gè)Zookeeper節(jié)點(diǎn)死了,那么Zookeeper服務(wù)就不能用了,因?yàn)?沒(méi)有過(guò)半,所以2個(gè)Zookeeper的死亡容忍度為0。

同理,要是有3個(gè)Zookeeper,一個(gè)死了,還剩下2個(gè)正常的,過(guò)半了,所以3個(gè)Zookeeper的容忍度為1。

同理也可以多列舉幾個(gè):2->0; 3->1; 4->1; 5->2; 6->2 就會(huì)發(fā)現(xiàn)一個(gè)規(guī)律,2n和2n-1的容忍度是一樣的,都是n-1,所以為了更加高效,何必增加那一個(gè)不必要的Zookeeper呢。

所以說(shuō),根據(jù)以上可以得出結(jié)論:從資源節(jié)省的角度來(lái)考慮,Zookeeper集群的節(jié)點(diǎn)最好要部署成奇數(shù)個(gè)!

二、 Zookeeper集群中的"腦裂"場(chǎng)景說(shuō)明

對(duì)于一個(gè)集群,想要提高這個(gè)集群的可用性,通常會(huì)采用多機(jī)房部署,比如現(xiàn)在有一個(gè)由6臺(tái)zkServer所組成的一個(gè)集群,部署在了兩個(gè)機(jī)房:

圖1

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

圖2

這就相當(dāng)于原本一個(gè)集群,被分成了兩個(gè)集群,出現(xiàn)了兩個(gè)"大腦",這就是所謂的"腦裂"現(xiàn)象。

對(duì)于這種情況,其實(shí)也可以看出來(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)題的,原因就在于過(guò)半機(jī)制。

Zookeeper的過(guò)半機(jī)制:在領(lǐng)導(dǎo)者選舉的過(guò)程中,如果某臺(tái)zkServer獲得了超過(guò)半數(shù)的選票,則此zkServer就可以成為L(zhǎng)eader了。

舉個(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。

那么Zookeeper選舉的過(guò)程中為什么一定要有一個(gè)過(guò)半機(jī)制驗(yàn)證?

因?yàn)檫@樣不需要等待所有zkServer都投了同一個(gè)zkServer就可以選舉出來(lái)一個(gè)Leader了。這樣比較快,所以叫快速領(lǐng)導(dǎo)者選舉算法。

Zookeeper過(guò)半機(jī)制中為什么是大于,而不是大于等于?

這就是跟腦裂問(wèn)題有關(guān)系了。比如回到上文出現(xiàn)腦裂問(wèn)題的場(chǎng)景 (如上圖1):

當(dāng)機(jī)房中間的網(wǎng)絡(luò)斷掉之后,機(jī)房1內(nèi)的三臺(tái)服務(wù)器會(huì)進(jìn)行領(lǐng)導(dǎo)者選舉,但是此時(shí)過(guò)半機(jī)制的條件是 "節(jié)點(diǎn)數(shù) > 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ī)制的條件是 "節(jié)點(diǎn)數(shù) >= 3",那么機(jī)房1和機(jī)房2都會(huì)選出一個(gè)Leader,這樣就出現(xiàn)了腦裂。這就可以解釋為什么過(guò)半機(jī)制中是大于而不是大于等于,目的就是為了防止腦裂。

如果假設(shè)我們現(xiàn)在只有5臺(tái)機(jī)器,也部署在兩個(gè)機(jī)房:

圖3

此時(shí)過(guò)半機(jī)制的條件是 "節(jié)點(diǎn)數(shù) > 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集群來(lái)說(shuō),要么沒(méi)有Leader,要么只有1個(gè)Leader,這樣Zookeeper也就能避免了腦裂問(wèn)題。

三、 Zookeeper集群"腦裂"問(wèn)題處理

1、什么是腦裂?

簡(jiǎn)單點(diǎn)來(lái)說(shuō),腦裂(Split-Brain) 就是比如當(dāng)你的 cluster 里面有兩個(gè)節(jié)點(diǎn),它們都知道在這個(gè) cluster 里需要選舉出一個(gè) master。那么當(dāng)它們兩個(gè)之間的通信完全沒(méi)有問(wèn)題的時(shí)候,就會(huì)達(dá)成共識(shí),選出其中一個(gè)作為 master。

但是如果它們之間的通信出了問(wèn)題,那么兩個(gè)結(jié)點(diǎn)都會(huì)覺(jué)得現(xiàn)在沒(méi)有 master,所以每個(gè)都把自己選舉成 master,于是 cluster 里面就會(huì)有兩個(gè) master。

對(duì)于Zookeeper來(lái)說(shuō)有一個(gè)很重要的問(wèn)題,就是到底是根據(jù)一個(gè)什么樣的情況來(lái)判斷一個(gè)節(jié)點(diǎn)死亡down掉了?在分布式系統(tǒng)中這些都是有監(jiān)控者來(lái)判斷的,但是監(jiān)控者也很難判定其他的節(jié)點(diǎn)的狀態(tài),唯一一個(gè)可靠的途徑就是心跳,所以Zookeeper也是使用心跳來(lái)判斷客戶端是否仍然活著。

使用ZooKeeper來(lái)做Leader HA基本都是同樣的方式:

  •  每個(gè)節(jié)點(diǎn)都嘗試注冊(cè)一個(gè)象征Leader的臨時(shí)節(jié)點(diǎn),其他沒(méi)有注冊(cè)成功的則成為follower,并且通過(guò)watch機(jī)制 (這里有介紹) 監(jiān)控著leader所創(chuàng)建的臨時(shí)節(jié)點(diǎn);
  •  Zookeeper通過(guò)內(nèi)部心跳機(jī)制來(lái)確定leader的狀態(tài),一旦Leader出現(xiàn)意外Zookeeper能很快獲悉并且通知其他的follower,其他flower在之后作出相關(guān)反應(yīng),這樣就完成了一個(gè)切換。這種模式也是比較通用的模式,基本大部分都是這樣實(shí)現(xiàn)的。

但是這里面有個(gè)很嚴(yán)重的問(wèn)題,如果注意不到會(huì)導(dǎo)致短暫的時(shí)間內(nèi)系統(tǒng)出現(xiàn)腦裂。因?yàn)樾奶霈F(xiàn)超時(shí)可能是Leader掛了,但是也可能是Zookeeper節(jié)點(diǎn)之間網(wǎng)絡(luò)出現(xiàn)了問(wèn)題,導(dǎo)致Leader假死的情況。

Leader其實(shí)并未死掉,但是與ZooKeeper之間的網(wǎng)絡(luò)出現(xiàn)問(wèn)題導(dǎo)致Zookeeper認(rèn)為其掛掉了然后通知其他節(jié)點(diǎn)進(jìn)行切換,這樣follower中就有一個(gè)成為了Leader。

但是原本的Leader并未死掉,這時(shí)候client也獲得Leader切換的消息,仍然會(huì)有一些延時(shí),Zookeeper通訊需要一個(gè)一個(gè)通知。

這時(shí)候整個(gè)系統(tǒng)在混亂中,很有可能有一部分client已經(jīng)通知到了連接到新的Leader上去了,而有的client仍然連接在老的Leader上。

如果同時(shí)有兩個(gè)client需要對(duì)Leader的同一個(gè)數(shù)據(jù)更新,并且剛好這兩個(gè)client此刻分別連接在新老的Leader上,就會(huì)出現(xiàn)很嚴(yán)重問(wèn)題。

這里做下小總結(jié):

  •  假死:由于心跳超時(shí)(網(wǎng)絡(luò)原因?qū)е碌模┱J(rèn)為L(zhǎng)eader死了,但其實(shí)leader還存活著;
  •  腦裂:由于假死會(huì)發(fā)起新的Leader選舉,選舉出一個(gè)新的Leader,但舊的Leader網(wǎng)絡(luò)又通了,導(dǎo)致出現(xiàn)了兩個(gè)Leader ,有的客戶端連接到老的Leader,而有的客戶端則連接到新的leader。

2、Zookeeper腦裂是什么原因?qū)е碌模?/strong>

主要原因是Zookeeper集群和Zookeeper client判斷超時(shí)并不能做到完全同步,也就是說(shuō)可能一前一后,如果是集群先于client發(fā)現(xiàn),那就會(huì)出現(xiàn)上面的情況。

同時(shí),在發(fā)現(xiàn)并切換后通知各個(gè)客戶端也有先后快慢。一般出現(xiàn)這種情況的幾率很小,需要Leader節(jié)點(diǎn)與Zookeeper集群網(wǎng)絡(luò)斷開(kāi),但是與其他集群角色之間的網(wǎng)絡(luò)沒(méi)有問(wèn)題,還要滿足上面那些情況,但是一旦出現(xiàn)就會(huì)引起很嚴(yán)重的后果,數(shù)據(jù)不一致。

3、Zookeeper是如何解決"腦裂"問(wèn)題的?

要解決Split-Brain腦裂的問(wèn)題,一般有下面幾種種方法:

  •  Quorums (法定人數(shù)) 方式: 比如3個(gè)節(jié)點(diǎn)的集群,Quorums = 2, 也就是說(shuō)集群可以容忍1個(gè)節(jié)點(diǎn)失效,這時(shí)候還能選舉出1個(gè)lead,集群還可用。比如4個(gè)節(jié)點(diǎn)的集群,它的Quorums = 3,Quorums要超過(guò)3,相當(dāng)于集群的容忍度還是1,如果2個(gè)節(jié)點(diǎn)失效,那么整個(gè)集群還是無(wú)效的。這是Zookeeper防止"腦裂"默認(rèn)采用的方法;
  •  Redundant communications (冗余通信)方式:集群中采用多種通信方式,防止一種通信方式失效導(dǎo)致集群中的節(jié)點(diǎn)無(wú)法通信。
  •  Fencing (共享資源) 方式:比如能看到共享資源就表示在集群中,能夠獲得共享資源的鎖的就是Leader,看不到共享資源的,就不在集群中。
  •  仲裁機(jī)制方式;
  •  啟動(dòng)磁盤鎖定方式。

要想避免Zookeeper"腦裂"情況其實(shí)也很簡(jiǎn)單,在follower節(jié)點(diǎn)切換的時(shí)候不在檢查到老的Leader節(jié)點(diǎn)出現(xiàn)問(wèn)題后馬上切換,而是在休眠一段足夠的時(shí)間,確保老的leader已經(jīng)獲知變更并且做了相關(guān)的shutdown清理工作了,然后再注冊(cè)成為master就能避免這類問(wèn)題了。

這個(gè)休眠時(shí)間一般定義為與Zookeeper定義的超時(shí)時(shí)間就夠了,但是這段時(shí)間內(nèi)系統(tǒng)可能是不可用的,但是相對(duì)于數(shù)據(jù)不一致的后果來(lái)說(shuō)還是值得的。

1)ZooKeeper默認(rèn)采用了Quorums這種方式來(lái)防止"腦裂"現(xiàn)象

即只有集群中超過(guò)半數(shù)節(jié)點(diǎn)投票才能選舉出Leader。

這樣的方式可以確保Leader的唯一性,要么選出唯一的一個(gè)Leader,要么選舉失敗。在zookeeper中Quorums作用如下:

  •  集群中最少的節(jié)點(diǎn)數(shù)用來(lái)選舉Leader保證集群可用;
  •  通知客戶端數(shù)據(jù)已經(jīng)安全保存前集群中最少數(shù)量的節(jié)點(diǎn)數(shù)已經(jīng)保存了該數(shù)據(jù)。一旦這些節(jié)點(diǎn)保存了該數(shù)據(jù),客戶端將被通知已經(jīng)安全保存了,可以繼續(xù)其他任務(wù)。而集群中剩余的節(jié)點(diǎn)將會(huì)最終也保存了該數(shù)據(jù)。

假設(shè)某個(gè)Leader假死,其余的followers選舉出了一個(gè)新的Leader。這時(shí),舊的Leader復(fù)活并且仍然認(rèn)為自己是Leader,這個(gè)時(shí)候它向其他followers發(fā)出寫請(qǐng)求也是會(huì)被拒絕的。

因?yàn)槊慨?dāng)新Leader產(chǎn)生時(shí),會(huì)生成一個(gè)epoch標(biāo)號(hào)(標(biāo)識(shí)當(dāng)前屬于那個(gè)Leader的統(tǒng)治時(shí)期),這個(gè)epoch是遞增的,followers如果確認(rèn)了新的Leader存在,知道其epoch,就會(huì)拒絕epoch小于現(xiàn)任Leader epoch的所有請(qǐng)求。

那有沒(méi)有follower不知道新的Leader存在呢?有可能,但肯定不是大多數(shù),否則新Leader無(wú)法產(chǎn)生。Zookeeper的寫也遵循quorum機(jī)制,因此,得不到大多數(shù)支持的寫是無(wú)效的,舊Leader即使各種認(rèn)為自己是leader,依然沒(méi)有什么作用。

Zookeeper除了可以采用上面默認(rèn)的Quorums方式來(lái)避免出現(xiàn)"腦裂",還可以可采用下面的預(yù)防措施:

2)添加冗余的心跳線,例如雙線條線,盡量減少“裂腦”發(fā)生機(jī)會(huì)

3)啟用磁盤鎖

正在服務(wù)一方鎖住共享磁盤,"裂腦"發(fā)生時(shí),讓對(duì)方完全"搶不走"共享磁盤資源。但使用鎖磁盤也會(huì)有一個(gè)不小的問(wèn)題,如果占用共享盤的一方不主動(dòng)"解鎖",另一方就永遠(yuǎn)得不到共享磁盤。

現(xiàn)實(shí)中假如服務(wù)節(jié)點(diǎn)突然死機(jī)或崩潰,就不可能執(zhí)行解鎖命令。后備節(jié)點(diǎn)也就接管不了共享資源和應(yīng)用服務(wù)。于是有人在HA中設(shè)計(jì)了"智能"鎖。即正在服務(wù)的一方只在發(fā)現(xiàn)心跳線全部斷開(kāi)(察覺(jué)不到對(duì)端)時(shí)才啟用磁盤鎖。平時(shí)就不上鎖了。

4)設(shè)置仲裁機(jī)制

例如設(shè)置參考IP(如網(wǎng)關(guān)IP),當(dāng)心跳線完全斷開(kāi)時(shí),2個(gè)節(jié)點(diǎn)都各自ping一下 參考IP,不通則表明斷點(diǎn)就出在本端,不僅"心跳"、還兼對(duì)外"服務(wù)"的本端網(wǎng)絡(luò)鏈路斷了,即使啟動(dòng)(或繼續(xù))應(yīng)用服務(wù)也沒(méi)有用了,那就主動(dòng)放棄競(jìng)爭(zhēng),讓能夠ping通參考IP的一端去起服務(wù)。

更保險(xiǎn)一些,ping不通參考IP的一方干脆就自我重啟,以徹底釋放有可能還占用著的那些共享資源。 

 

責(zé)任編輯:龐桂玉 來(lái)源: DBAplus社群
相關(guān)推薦

2019-11-29 11:12:56

Zookeeper腦裂選舉算法

2024-12-19 17:09:55

Redis哨兵模式數(shù)據(jù)庫(kù)

2024-04-18 08:00:00

腦裂問(wèn)題Redis哨兵模式

2017-09-02 16:23:45

AWSAZ群集

2025-01-13 00:00:00

配置Redis腦裂

2017-03-23 15:07:09

2021-07-29 06:56:36

分布式系統(tǒng)腦裂

2022-06-20 05:25:54

裂腦Oracle RAC數(shù)據(jù)庫(kù)

2024-10-31 16:46:36

2017-01-17 10:25:06

HBase集群運(yùn)維

2021-09-10 15:16:19

Kubernetes核心組件運(yùn)維

2018-11-12 10:10:09

Linux遠(yuǎn)程數(shù)據(jù)工具

2013-12-18 10:56:48

Linux運(yùn)維運(yùn)維技能

2020-09-24 10:50:10

運(yùn)維架構(gòu)技術(shù)

2016-03-04 15:38:49

運(yùn)維故障規(guī)范

2013-11-28 09:41:36

云會(huì)計(jì)軟件CRM客戶關(guān)系管理

2018-06-23 07:31:05

2017-02-03 20:50:08

Linux

2010-05-21 17:28:50

組策略

2019-04-12 08:38:02

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产成人精品久久 | 老司机精品福利视频 | 国产亚洲一级 | 草逼网站| 精品九九在线 | 中文字幕在线视频精品 | 欧美成年网站 | 中文字幕一区在线观看视频 | 日韩免费视频 | 国产高清区 | 亚洲日本中文字幕在线 | 国产高清在线 | а_天堂中文最新版地址 | www.色婷婷 | 国产网站在线免费观看 | 午夜婷婷激情 | 91精品观看 | 一区二区免费在线观看 | 久久久久久国产精品 | 精品久久久久久久久久久 | 日本一区视频在线观看 | 国产高清在线 | 欧美五月婷婷 | 成人精品在线视频 | 成人在线视频网站 | 男女性毛片 | 成人深夜福利在线观看 | 91精品在线播放 | 日本精品一区二区在线观看 | 国产成人精品一区二区三区视频 | 99久久免费精品国产男女高不卡 | 欧美一区二区在线观看 | 亚洲最大的黄色网址 | 91视频国产一区 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 国产精品一区2区 | 精品粉嫩超白一线天av | 91久久国产精品 | a级片在线观看 | 久久精品中文字幕 | 亚洲精品区|