[梁山好漢說IT] 如何理解腦裂問題
本文通過梁山好漢的例子來加深理解腦裂問題。
1. 問題描述
Split-brain, 就是在集群環境中,因為異常情況發生后,產生兩個子集群。每個子集群都選出一個leader(master)節點。最后互相競爭資源導致故障。
2. 如何解決?
概括起來有幾種常見的辦法(包括軟件,硬件),比如上級干預,內部聯絡,自己反省,延時處理.
我們假設梁山好漢108人失散了,各54人,宋江盧俊義各率領一半,都以為另外一半掛了,就分別成立了梁山忠義堂。那么雙方見面之后,怎么決定誰是老大呢?
a. 上級干預: 使用額外的探測節點,當雙方直連斷開之后,使用一個約定好的共同節點來探測是否是直連故障。 回到梁山這里,就是兩幫好漢都去九天玄女廟,讓玄女娘娘指定誰是老大.
b. 專線直連 假如宋江這伙里面有解珍,盧俊義這里有解寶。哥倆之間有特殊心跳聯系。所以兩幫人知道大家實際都沒掛,所以不會分別內部選舉而是等待重聚時候再選老大
c. 過半機制 只有某個子集群超過原集群數目一半,才允許選出老大 梁山這里,因為都是54人,都不超過一半,所以都不能選舉,只能等待重聚時候選老大
d. 延長選舉時間 比如es有參數,據此參數決定從節點訪問主節點后如果n秒之內沒有回復則默認主節點掛了。這個參數可以調大。 梁山這里,就是約好了如果失散之后1個月聯系不上,才能選舉老大。現在調整為1年之后才能選舉。那么1年之內其實重聚的可能性很大。
3. 具體案例
a. Zookeeper采用“過半機制”解決
在領導者選舉過程中,如果某臺zkserver獲得了超過半數的選票,則此zkServer就可以成為leader了。 關鍵代碼:
return (set.size() > n/2); n 表示舊集群中zkServer參與者的數目 set標是故障之后,本子集群的參與者個數。
關鍵點是:必須超過原集群的半數才能成為leader。這就保證了無論怎么出現故障分裂,所以子集群中或者都沒有leader,或者只有一個leader(該子集群超過半數了)。比如原來6臺,n/2=3。如果分裂成兩個3臺的子集群,則都沒有leader,如果一個4臺,一個2臺,則4臺的會成為leader.
b. ElasticSearch有調節參數
discovery.zen.ping_timeout:3
discovery.zen.minimum_master_nodes:1
該參數的意思是,當具備成為主節點的從節點的個數滿足這個數字且都認為主節點掛了則會進行選舉產生新的主節點。 例如:es集群有三個從節點有資格成為主節點,這時這三個節點都認為主節點掛了則會進行選舉,此時如果這個參數的值是4則不會進行選舉。 我們可以適當的把這個值改大,減少出現腦裂的概率,官方給出的建議是(n/2)+1。
4. 參考:
https://my.oschina.net/u/236698/blog/525413
https://mp.weixin.qq.com/s/VlkK_Lb-ZlGcYi-QfHC22Q
浙公網安備 33010602011771號