淺談分布式系統(tǒng)腦裂現(xiàn)象與ZK泄鹏、HDFS的避免方案

腦裂的概念與成因

"split brain"原本是指醫(yī)學(xué)中的“裂腦綜合征”,即連接大腦左右半球的胼胝體受損到一定程度后發(fā)生的癥狀秧耗。左右腦分離后备籽,會分別處理知覺、形成概念和對刺激產(chǎn)生反應(yīng)分井,相當(dāng)于有兩個腦在一個身體運作车猬,會造成患者行為的沖突。例如:

  • 當(dāng)一個裂腦患者更衣時尺锚,他有時會一只手將褲子拉起珠闰,卻另一只手將褲子往下脫。
  • 當(dāng)一個影像只投射在裂腦患者的左視覺區(qū)瘫辩,他無法說出看見了什么——因為左視覺區(qū)的影像只會傳遞到右腦伏嗜,而大部分人的語音控制中心在左腦,患者的左右腦無法交流信息伐厌。
https://www.nature.com/news/the-split-brain-a-tale-of-two-halves-1.10213

split brain這個詞也被計算機科學(xué)引入承绸,指采用主從(master-slave)架構(gòu)的分布式系統(tǒng)中,出現(xiàn)了多個活動的主節(jié)點的情況挣轨。但正常情況下军熏,集群中應(yīng)該只有一個活動主節(jié)點。

造成腦裂的原因主要是網(wǎng)絡(luò)分區(qū)(這個詞之前在講CAP理論時就已經(jīng)出現(xiàn)過了)卷扮。由于網(wǎng)絡(luò)故障或者集群節(jié)點之間的通信鏈路有問題荡澎,導(dǎo)致原本的一個集群被物理分割成為兩個甚至多個小的、獨立運作的集群画饥,這些小集群各自會選舉出自己的主節(jié)點衔瓮,并同時對外提供服務(wù)。網(wǎng)絡(luò)分區(qū)恢復(fù)后抖甘,這些小集群再度合并為一個集群热鞍,就出現(xiàn)了多個活動的主節(jié)點。

另外衔彻,主節(jié)點假死也有可能造成腦裂薇宠。由于當(dāng)前主節(jié)點暫時無響應(yīng)(如負載過高、頻繁GC等)導(dǎo)致其向其他節(jié)點發(fā)送心跳信號不及時艰额,其他節(jié)點認為它已經(jīng)宕機澄港,就觸發(fā)主節(jié)點的重新選舉。新的主節(jié)點選舉出來后柄沮,假死的主節(jié)點又復(fù)活回梧,就出現(xiàn)了兩個主節(jié)點废岂。

腦裂的危害非常大,會破壞集群數(shù)據(jù)和對外服務(wù)的一致性狱意,所以在各分布式系統(tǒng)的設(shè)計中湖苞,都會千方百計地避免產(chǎn)生腦裂。下面舉兩個例子說說详囤。

腦裂的避免方案

一般有以下三種思路來避免腦裂:

  • 法定人數(shù)/多數(shù)機制(Quorum)
  • 隔離機制(Fencing)
  • 冗余通信機制(Redundant communication)

例1:ZooKeeper & Quorum

Quorum一詞的含義是“法定人數(shù)”财骨,在ZooKeeper的環(huán)境中,指的是ZK集群能夠正常對外提供服務(wù)所需要的最少有效節(jié)點數(shù)藏姐。也就是說隆箩,如果n個節(jié)點的ZK集群有少于m個節(jié)點是up的,那么整個集群就down了羔杨。m就是所謂Quorum size捌臊,并且:

m = n / 2 + 1

為什么是這個數(shù)呢?

考慮一個n = 5的ZK集群兜材,并且它按3:2分布在兩個機房中娃属。

假設(shè)m = 2(即n / 2),當(dāng)兩個機房之間的網(wǎng)絡(luò)中斷時护姆,Server 1~3和Server 4~5將分別形成獨立的集群矾端,并且都能對外提供服務(wù)——也就意味著都能重新選舉出各自的Leader,即產(chǎn)生了腦裂卵皂。當(dāng)網(wǎng)絡(luò)恢復(fù)秩铆,兩個集群合并時,它們的數(shù)據(jù)就會不一致灯变。

但是殴玛,若m = 3(即n / 2 + 1),那么網(wǎng)絡(luò)中斷后添祸,DC2上的兩個節(jié)點不滿足Quorum要求的數(shù)量滚粟,故只有DC1上的三個節(jié)點能選舉出Leader并提供服務(wù),DC2上的兩個節(jié)點不能提供服務(wù)刃泌,當(dāng)然也就不會破壞數(shù)據(jù)一致性了凡壤。

由上可知,ZK的Quorum機制其實就是要求集群中過半的節(jié)點是正常的耙替,所以ZK集群包含奇數(shù)個節(jié)點比偶數(shù)個節(jié)點要更好亚侠。顯然,如果集群有6個節(jié)點的話俗扇,Quorum size是4硝烂,即能夠容忍2個節(jié)點失敗,而5個節(jié)點的集群同樣能容忍2個節(jié)點失敗铜幽,所以可靠性是相同的滞谢。偶數(shù)節(jié)點還需要額外多管理一個節(jié)點串稀,不劃算。

上面說的是網(wǎng)絡(luò)分區(qū)的情況狮杨,如果是Leader假死呢厨诸?

之前某篇文章中其實說過了,集群每次選舉出一個Leader時禾酱,都會自增紀元值(epoch),也就是Leader的代數(shù)绘趋。所以颤陶,就算原來的Leader復(fù)活,它的紀元值已經(jīng)小于新選舉出來的現(xiàn)任Leader的紀元值陷遮,F(xiàn)ollower就會拒絕所有舊Leader發(fā)來的請求滓走,所以不會產(chǎn)生腦裂。當(dāng)然帽馋,有一部分Follower可能對新選舉出的Leader沒有感知搅方,但由于上述Quorum機制的保證,這部分肯定不會占多數(shù)绽族,故集群能夠正常運轉(zhuǎn)姨涡。除ZK外,Kafka集群的Controller也是靠紀元值防止腦裂的吧慢。

例2:HDFS NameNode HA & Fencing

下面先貼出HDFS高可用的官方經(jīng)典架構(gòu)圖涛漂。

HDFS NameNode高可用需要兩個NN節(jié)點,一個處于活動狀態(tài)检诗,另一個處于熱備狀態(tài)匈仗,由ZKFailoverController組件借助外部ZK集群提供主備切換支持。

當(dāng)活動NN假死時逢慌,ZK集群長時間收不到心跳信號悠轩,就會觸發(fā)熱備NN提升為活動NN,之前的NN復(fù)活就造成腦裂攻泼。如何解決呢火架?答案就是隔離,即將原來那個假死又復(fù)活的NN限制起來(就像用籬笆圍起來一樣)忙菠,使其無法對外提供服務(wù)距潘。具體來講涉及到三方面。

  • 兩個NN中同時只有一個能向共享存儲(QJM方案下就是JournalNode集群)寫入edit log只搁;
  • 兩個NN中同時只有一個能向DataNode發(fā)出數(shù)據(jù)增刪的指令音比;
  • 兩個NN中同時只有一個能響應(yīng)客戶端的請求。

為了實現(xiàn)Fencing氢惋,成為活動NN的節(jié)點會在ZK中創(chuàng)建一個路徑為/hadoop-ha/${dfs.nameservices}/ActiveBreadCrumb的持久znode洞翩。當(dāng)正常發(fā)生主備切換時稽犁,ZK Session正常關(guān)閉的同時會一起刪除上述znode。但是骚亿,如果NN假死已亥,ZK Session異常關(guān)閉,/hadoop-ha/${dfs.nameservices}/ActiveBreadCrumb這個znode就會殘留下來来屠。由熱備升格為活動的NN會檢測到這個節(jié)點虑椎,并執(zhí)行Fencing邏輯:

  1. 嘗試調(diào)用舊活動NN的RPC接口中的相關(guān)方法,強制將其轉(zhuǎn)換成熱備狀態(tài)俱笛;

  2. 如果轉(zhuǎn)換失敗捆姜,那么就根據(jù)dfs.ha.fencing.methods執(zhí)行sshfence、shellfence兩種隔離措施迎膜。sshfence就是通過SSH登錄到該節(jié)點上泥技,執(zhí)行fuser命令通過定位端口號殺掉NameNode進程;shellfence就是執(zhí)行用戶定義的Shell腳本來隔離NameNode進程磕仅。

只有Fencing執(zhí)行完畢之后珊豹,新的NN才會真正轉(zhuǎn)換成活動狀態(tài)并提供服務(wù),所以能夠避免腦裂榕订。

最后廢話一句店茶,JournalNode集群區(qū)分新舊NN同樣是靠紀元值,而它的可用性也是靠Quorum機制——即如果JournalNode集群有2N + 1個節(jié)點的話劫恒,最多可以容忍N個節(jié)點失敗忽妒。

The End

冗余通信機制沒有提到,其實就是在節(jié)點之間添加額外的心跳線兼贸,防止一個心跳路徑斷開導(dǎo)致誤判段直。

帝都疫情開始反彈,還是老實在家待著吧溶诞。

民那周末快樂鸯檬,晚安。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末螺垢,一起剝皮案震驚了整個濱河市喧务,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枉圃,老刑警劉巖功茴,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異孽亲,居然都是意外死亡坎穿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來玲昧,“玉大人栖茉,你說我怎么就攤上這事》跹樱” “怎么了吕漂?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長尘应。 經(jīng)常有香客問我惶凝,道長,這世上最難降的妖魔是什么犬钢? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任苍鲜,我火速辦了婚禮,結(jié)果婚禮上娜饵,老公的妹妹穿的比我還像新娘。我一直安慰自己官辈,他們只是感情好箱舞,可當(dāng)我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拳亿,像睡著了一般晴股。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肺魁,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天电湘,我揣著相機與錄音,去河邊找鬼鹅经。 笑死寂呛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瘾晃。 我是一名探鬼主播贷痪,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蹦误!你這毒婦竟也來了劫拢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤强胰,失蹤者是張志新(化名)和其女友劉穎舱沧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體偶洋,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡熟吏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了玄窝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片分俯。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡肾筐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缸剪,到底是詐尸還是另有隱情吗铐,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布杏节,位于F島的核電站唬渗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏奋渔。R本人自食惡果不足惜镊逝,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嫉鲸。 院中可真熱鬧撑蒜,春花似錦、人聲如沸玄渗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽藤树。三九已至浴滴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岁钓,已是汗流浹背升略。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屡限,地道東北人品嚣。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像钧大,于是被迫代替她去往敵國和親腰根。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,747評論 2 361