Zookeeper腦裂

什麼是腦裂

腦裂(split-brain)就是“大腦分裂”,也就是本來一個“大腦”被拆分了兩個或多個“大腦”,我們都知道,如果一個人有多個大腦,並且相互獨立的話,那麼會導致人體“手舞足蹈”,“不聽使喚”。

腦裂通常會出現在集羣環境中,比如ElasticSearch、Zookeeper集羣,而這些集羣環境有一個統一的特點,就是它們有一個大腦,比如ElasticSearch集羣中有Master節點,Zookeeper集羣中有Leader節點。

本篇文章着重來給大家講一下Zookeeper中的腦裂問題,以及是如果解決腦裂問題的。

Zookeeper集羣中的腦裂場景

對於一個集羣,想要提高這個集羣的可用性,通常會採用多機房部署,比如現在有一個由6臺zkServer所組成的一個集羣,部署在了兩個機房:
在這裏插入圖片描述
正常情況下,此集羣只會有一個Leader,那麼如果機房之間的網絡斷了之後,兩個機房內的zkServer還是可以相互通信的,如果不考慮過半機制,那麼就會出現每個機房內部都將選出一個Leader。
在這裏插入圖片描述
這就相當於原本一個集羣,被分成了兩個集羣,出現了兩個“大腦”,這就是腦裂。

對於這種情況,我們也可以看出來,原本應該是統一的一個集羣對外提供服務的,現在變成了兩個集羣同時對外提供服務,如果過了一會,斷了的網絡突然聯通了,那麼此時就會出現問題了,兩個集羣剛剛都對外提供服務了,數據該怎麼合併,數據衝突怎麼解決等等問題。

剛剛在說明腦裂場景時,有一個前提條件就是沒有考慮過半機制,所以實際上Zookeeper集羣中是不會出現腦裂問題的,而不會出現的原因就跟過半機制有關。

過半機制

在領導者選舉的過程中,如果某臺zkServer獲得了超過半數的選票,則此zkServer就可以成爲Leader了。

過半機制的源碼實現其實非常簡單:


public class QuorumMaj implements QuorumVerifier {
    private static final Logger LOG = LoggerFactory.getLogger(QuorumMaj.class);
    
    int half;
    
    // n表示集羣中zkServer的個數(準確的說是參與者的個數,參與者不包括觀察者節點)
    public QuorumMaj(int n){
        this.half = n/2;
    }
 
    // 驗證是否符合過半機制
    public boolean containsQuorum(Set<Long> set){
        // half是在構造方法裏賦值的
        // set.size()表示某臺zkServer獲得的票數
        return (set.size() > half);
    }
    
}

大家仔細看一下上面方法中的註釋,核心代碼就是下面兩行:

this.half = n/2;
return (set.size() > half);

舉個簡單的例子:如果現在集羣中有5臺zkServer,那麼half=5/2=2,那麼也就是說,領導者選舉的過程中至少要有三臺zkServer投了同一個zkServer,纔會符合過半機制,才能選出來一個Leader。

那麼有一個問題我們想一下,選舉的過程中爲什麼一定要有一個過半機制驗證?因爲這樣不需要等待所有zkServer都投了同一個zkServer就可以選舉出來一個Leader了,這樣比較快,所以叫快速領導者選舉算法唄。

那麼再來想一個問題,過半機制中爲什麼是大於,而不是大於等於呢?

這就是更腦裂問題有關係了,比如回到上文出現腦裂問題的場景:
在這裏插入圖片描述
當機房中間的網絡斷掉之後,機房1內的三臺服務器會進行領導者選舉,但是此時過半機制的條件是set.size() > 3,也就是說至少要4臺zkServer才能選出來一個Leader,所以對於機房1來說它不能選出一個Leader,同樣機房2也不能選出一個Leader,這種情況下整個集羣當機房間的網絡斷掉後,整個集羣將沒有Leader。

而如果過半機制的條件是set.size() >= 3,那麼機房1和機房2都會選出一個Leader,這樣就出現了腦裂。所以我們就知道了,爲什麼過半機制中是大於,而不是大於等於。就是爲了防止腦裂。

如果假設我們現在只有5臺機器,也部署在兩個機房:
在這裏插入圖片描述
此時過半機制的條件是set.size() > 2,也就是至少要3臺服務器才能選出一個Leader,此時機房件的網絡斷開了,對於機房1來說是沒有影響的,Leader依然還是Leader,對於機房2來說是選不出來Leader的,此時整個集羣中只有一個Leader。

所以,我們可以總結得出,有了過半機制,對於一個Zookeeper集羣,要麼沒有Leader,要沒只有1個Leader,這樣就避免了腦裂問題。

原文鏈接:https://blog.csdn.net/l18848956739/article/details/97398463

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章