熊貓辦公ppt模板下載seo外包公司報(bào)價(jià)
什么是腦裂?
腦裂(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)。
**官方定義:**當(dāng)一個(gè)集群的不同部分在同一時(shí)間都認(rèn)為自己是活動(dòng)的時(shí)候,我們就可以將這個(gè)現(xiàn)象稱為腦裂癥狀。通俗的說(shuō),就是比如當(dāng)你的 cluster 里面有兩個(gè)結(jié)點(diǎn),它們都知道在這個(gè) cluster 里需要選舉出一個(gè) master。那么當(dāng)它們兩之間的通信完全沒(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。
在腦裂發(fā)生時(shí),集群中的每個(gè)子集可能都會(huì)繼續(xù)工作,執(zhí)行讀取和寫入操作。這可能會(huì)導(dǎo)致數(shù)據(jù)沖突和不一致性。例如,如果一個(gè)數(shù)據(jù)庫(kù)集群發(fā)生腦裂,不同的子集可能會(huì)同時(shí)接收寫入請(qǐng)求,導(dǎo)致數(shù)據(jù)在不同子集中不同步。當(dāng)腦裂問(wèn)題解決后,這些不同的數(shù)據(jù)可能會(huì)導(dǎo)致數(shù)據(jù)合并困難,進(jìn)而導(dǎo)致數(shù)據(jù)損壞或數(shù)據(jù)丟失。
集群腦裂產(chǎn)生的原因?
一般集群腦裂都是由以下三個(gè)原因產(chǎn)生的
- 網(wǎng)絡(luò)分區(qū): 當(dāng)集群中的節(jié)點(diǎn)之間的網(wǎng)絡(luò)連接出現(xiàn)問(wèn)題,導(dǎo)致某些節(jié)點(diǎn)無(wú)法與其他節(jié)點(diǎn)通信。例如高可用服務(wù)器各節(jié)點(diǎn)之間心跳線鏈路發(fā)生故障,高可用服務(wù)器上開(kāi)啟了iptables防火墻阻擋了心跳消息傳輸?shù)鹊?/li>
- 節(jié)點(diǎn)故障: 集群中的某些節(jié)點(diǎn)可能因?yàn)橛布收?、操作系統(tǒng)問(wèn)題或其他原因而失去響應(yīng),導(dǎo)致其他節(jié)點(diǎn)認(rèn)為它們已經(jīng)不再可用。例如網(wǎng)卡及相關(guān)驅(qū)動(dòng)壞了,ip配置及沖突問(wèn)題(網(wǎng)卡直連)因心跳線間連接的設(shè)備故障(網(wǎng)卡及交換機(jī))
- 通信問(wèn)題: 由于通信協(xié)議、時(shí)鐘同步等問(wèn)題,節(jié)點(diǎn)可能無(wú)法準(zhǔn)確地識(shí)別其他節(jié)點(diǎn)的狀態(tài),從而導(dǎo)致混淆。
那么如何判斷集群是否發(fā)生了腦裂?
在分布式系統(tǒng)中這些都是有監(jiān)控者來(lái)判斷判斷一個(gè)節(jié)點(diǎn)是否down 掉的,但是監(jiān)控者也很難判定其他的節(jié)點(diǎn)的狀態(tài),唯一一個(gè)可靠的途徑就是心跳,Zookeeper也是使用心跳來(lái)判斷客戶端是否仍然活著。
整體運(yùn)轉(zhuǎn)流程如下
- 每個(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ū)е碌?#xff09;認(rèn)為leader死了,但其實(shí)leader還存活著。
腦裂:由于假死會(huì)發(fā)起新的leader選舉,選舉出一個(gè)新的leader,但舊的leader網(wǎng)絡(luò)又通了,導(dǎo)致出現(xiàn)了兩個(gè)leader ,有的客戶端連接到老的leader,而有的客戶端則連接到新的leader。
如何解決腦裂問(wèn)題?
過(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ò)半機(jī)制中為什么是大于,而不是大于等于?
這是為了減少腦裂的概率,假設(shè)現(xiàn)在有一個(gè)由6臺(tái)zkServer所組成的一個(gè)集群,部署在了兩個(gè)機(jī)房,每個(gè)機(jī)房都有3臺(tái)zkServer,那么如果機(jī)房之間的網(wǎng)絡(luò)斷了之后,兩個(gè)機(jī)房?jī)?nèi)的zkServer還是可以相互通信的,如果不考慮過(guò)半機(jī)制,那么就會(huì)出現(xiàn)每個(gè)機(jī)房?jī)?nèi)部都將選出一個(gè)Leader。
Quornums機(jī)制
即只有集群中超過(guò)半數(shù)節(jié)點(diǎn)投票才能選舉出Leader。這樣的方式可以確保leader的唯一性,要么選出唯一的一個(gè)leader, 要么選舉失敗。這是zookeeper防止"腦裂"默認(rèn)采用的方法。
在ZooKeeper中Quorums有2個(gè)作用:
- 集群中最少的節(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,這個(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)有什么作用。
通過(guò)Quorums機(jī)制來(lái)防止腦裂和假死,當(dāng)leader掛掉之后,可以重新選舉出新的leader節(jié)點(diǎn)使整個(gè)集群達(dá)成一致;當(dāng)出現(xiàn)假死現(xiàn)象時(shí),通過(guò)epoch大小來(lái)拒絕舊的leader發(fā)起的請(qǐng)求,在前面也已經(jīng)講到過(guò),這個(gè)時(shí)候,重新恢復(fù)通信的老的leader節(jié)點(diǎn)會(huì)進(jìn)入恢復(fù)模式,與新的leader節(jié)點(diǎn)做數(shù)據(jù)同步。不過(guò)這個(gè)如果舊的leader處理了數(shù)據(jù),就會(huì)出現(xiàn)數(shù)據(jù)丟失的情況。
適當(dāng)?shù)某瑫r(shí)設(shè)置
ZooKeeper 使用會(huì)話(Session)來(lái)管理客戶端和服務(wù)器之間的連接,設(shè)置適當(dāng)?shù)臅?huì)話超時(shí)時(shí)間可以減少腦裂的影響。較短的會(huì)話超時(shí)時(shí)間可以更快地檢測(cè)到節(jié)點(diǎn)失效,從而減少不一致性。
采用Redundant communications (冗余通信)方式
集群中采用多種通信方式,防止一種通信方式失效導(dǎo)致集群中的節(jié)點(diǎn)無(wú)法通信。
網(wǎng)絡(luò)配置優(yōu)化
確保集群中的節(jié)點(diǎn)之間的網(wǎng)絡(luò)連接穩(wěn)定,避免分區(qū)和網(wǎng)絡(luò)延遲。優(yōu)化網(wǎng)絡(luò)配置可以減少網(wǎng)絡(luò)問(wèn)題引發(fā)的腦裂。
啟用磁盤鎖
在 ZooKeeper 中,磁盤鎖(Disk Lock)是一種額外的安全措施,用于防止腦裂問(wèn)題。磁盤鎖可以在主節(jié)點(diǎn)選舉時(shí)幫助確保只有一個(gè)節(jié)點(diǎn)被選為主節(jié)點(diǎn),從而降低腦裂風(fēng)險(xiǎn)。啟用磁盤鎖需要進(jìn)行一些特定的配置和步驟。
以下是啟用磁盤鎖的一般步驟:
- 配置數(shù)據(jù)目錄: 首先,您需要為每個(gè) ZooKeeper 節(jié)點(diǎn)配置一個(gè)數(shù)據(jù)目錄(dataDir)。數(shù)據(jù)目錄是節(jié)點(diǎn)用于存儲(chǔ)數(shù)據(jù)和元數(shù)據(jù)的位置。確保您的配置文件中已經(jīng)正確設(shè)置了數(shù)據(jù)目錄。
- 配置磁盤鎖目錄: 在 ZooKeeper 配置文件中,設(shè)置一個(gè)磁盤鎖目錄(dataLogDir)。這個(gè)目錄將用于存儲(chǔ)磁盤鎖的文件。
- 啟用磁盤鎖: 在 ZooKeeper 的配置文件中,設(shè)置
syncEnabled
選項(xiàng)為true
。這將啟用磁盤鎖機(jī)制。 - 配置自動(dòng)清理: 您還可以配置自動(dòng)清理磁盤鎖的選項(xiàng),以便在主節(jié)點(diǎn)意外失效時(shí),其他節(jié)點(diǎn)能夠順利選出新的主節(jié)點(diǎn)。具體配置可能因 ZooKeeper 版本而異,但通常會(huì)涉及到設(shè)置一些時(shí)間間隔。
- 重啟 ZooKeeper 節(jié)點(diǎn): 在配置文件修改完成后,您需要重啟所有的 ZooKeeper 節(jié)點(diǎn),以使配置生效。
磁盤鎖的原理是通過(guò)將選舉過(guò)程的相關(guān)信息寫入磁盤鎖文件,其他節(jié)點(diǎn)可以檢查這些文件以決定是否進(jìn)行選舉。這在一定程度上增加了選舉的穩(wěn)定性,從而降低了腦裂風(fēng)險(xiǎn)。
請(qǐng)注意,雖然啟用磁盤鎖可以增加系統(tǒng)的穩(wěn)定性,但它也會(huì)引入一些額外的磁盤 I/O 操作,可能會(huì)對(duì)性能產(chǎn)生一些影響。因此,在啟用磁盤鎖之前,建議您仔細(xì)評(píng)估您的系統(tǒng)需求和性能預(yù)期。
盡管磁盤鎖可以確保選舉信息寫入磁盤,但如果出現(xiàn)寫入延遲或錯(cuò)誤,節(jié)點(diǎn)之間的信息同步可能會(huì)受到影響,可能導(dǎo)致腦裂。
參考文章
HA高可用集群中”腦裂”問(wèn)題解決 - 運(yùn)維總結(jié) - 散盡浮華 - 博客園
Zookeeper集群”腦裂”問(wèn)題 - 運(yùn)維總結(jié) - 散盡浮華 - 博客園