腦裂
一般腦裂都是出現在集羣環境中的。指的是一個集羣環境中出現了多個master節點(類似zookeeper的master、elasticsearch的master節點),導致嚴重數據問題,數據不一致等等。
出現的原因:可能就是網絡環境有問題如斷開,假死等等,導致一部分slave節點會重新進入崩壞恢復模式,重新選舉新的master節點,然後對外提供事務服務。
例如機房A和機房B通信,一個6個節點,選舉機房A的一個節點爲master節點。
當機房A和機房B出現通信網絡故障,如下圖會導致機房B重新選舉master。在網絡恢復後就會出現兩個master。
解決辦法
- 採用冗餘心跳通信
- 採用過半原則
冗餘心跳說白了就是節點之間採用多路心跳來保證單心跳鏈路的不穩定性。這裏着重介紹一下過半原則:在領導者選舉的過程中,如果某臺zkServer獲得了超過半數的選票,則此zkServer就可以成爲Leader了。
這裏貼一下底層源碼:return (set.size() > n/2),其中n爲集羣中有效節點的個數,set.size 表示某臺zkServer獲得的票數
。
拿上面的圖來說,n = 6,那麼set.size要爲4(4>3)就是在機房A和機房B中有4個節點才能選舉新的master節點。如圖二,機房A和B斷了,機房B只有3個節點,是無法選舉新的master節點的,所以就保證了即使機房A和B之間的網絡斷了,機房B也不會選舉新的master節點。這就是過半機制。
以上描述如有問題請大佬指正^^。