1. 程式人生 > >腦裂是什麼?Zookeeper是如何解決的?

腦裂是什麼?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,這樣就避免了腦裂問題。

有痛點才有創新,一個技術肯定都是為了解決某個痛點才出現的。

請幫忙轉發一下,如果想第一時間學習更多的精彩的內容,請關注微信公眾號:1點25

相關推薦

是什麼?Zookeeper是如何解決的?

什麼是腦裂 腦裂(split-brain)就是“大腦分裂”,也就是本來一個“大腦”被拆分了兩個或多個“大腦”,我們都知道,如果一個人有多個大腦,並且相互獨立的話,那麼會導致人體“手舞足蹈”,“不聽使喚”。 腦裂通常會出現在叢集環境中,比如ElasticSearch、Zookeeper叢集,而這些叢集環境有一個

Zookeeper和分散式環境中的假死問題

最近和同事聊天無意間發現他們的系統也存在腦裂的問題。想想當初在我們的系統中為了解決腦裂花了非常大的功夫,現在和大家一起討論下腦裂,假死等等這些問題和解決的方法。 在一個大叢集中往往會有一個master存在,在長期執行過程中不可避免的會出現宕機等問題導致master不可用,在出現這樣的情況以後往往

Zookeeper已經分散式環境中的假死

Zookeeper簡介 在上班之前都不知道有這樣一個東西,在開始說假死腦裂之前先說說Zookeeper吧。 Zookeeper zookeeper是一個分散式應用程式的協調服務。它是一個為分散式應用提供一致性服務的軟體,提供的效能包括:配置維護、名字服

Zookeeper和分散式環境中的假死問題(轉發)

最近和同事聊天無意間發現他們的系統也存在腦裂的問題。想想當初在我們的系統中為了解決腦裂花了非常大的功夫,現在和大家一起討論下腦裂,假死等等這些問題和解決的方法。 在一個大叢集中往往會有一個master存在,在長期執行過程中不可避免的會出現宕機等問題導致master不可用,

keepalived中的

主動 雙線 高可用 網關 冗余 永遠 兩個 釋放 keepalive 在高可用(HA)系統中,當聯系2個節點的“心跳線”斷開時,本來為一整體、動作協調的HA系統,就分裂成為2個獨立的個體。由於相互失去了聯系,都以為是對方出了故障。兩個節點上的

keepalive和問題

pro pst 1.8 定時 後來 原因 cat 之間 ges keepalive keepalive起初專門為lvs負載均衡軟件設計的,用來管理監控lvs集群系統中各個服務節點的狀態,後來又加入了可以實現高可用的vrrp功能。 keepal

說說Keepalived的

HA 腦裂 1. 工作場景Keepalived提供了Loadbalancing和High-Availability的功能, 本文說的是其為2個Mycat節點提供HA功能的場景.2. 關鍵配置如下, 為主備非搶占模式.! mycat01, 192.168.4.196global_defs { #

keepalived問題查找

use html pro board tle plain 無法 題解 -a 在自己環境做keepalived+redis實驗時,當重啟了備用redies機器後,發現兩臺redies主機都拿到了VIP [plain] view plain copy [roo

rabbitmq (網絡分區)

.net detail 配置 blog rabbitmq TP 產生 tails 分區 1、產生的原因 https://blog.csdn.net/zyz511919766/article/details/45198055 2、相關配置、如何規避 https://blog.

keepalived 功能 、原理、

簡介: keepalived設計之初是專為LVS負載均衡軟體設計的,用來管理和監控LVS集群系統中的各個服務節點狀態,,後來加入實現高可用的VRRP功能。通過vrrp協議實現高可用功能的 常用的功能 管理LVS負載均衡軟體 對LVS叢集節點健康檢查功能

drbd處理

split brain實際上是指在某種情況下,造成drbd的兩個節點斷開了連線,都以primary的身份來執行。當drbd某 primary節點連線對方節點準備傳送資訊的時候如果發現對方也是primary狀態,那麼會會立刻自行斷開連線,並認定 當前已經發生split brain了,這時候他會在系統日

Yarn ResourceManager進行主從切換時發生原因分析

Brain Split 事故 時間先後順序: ResourceManager同zookeeper通訊,發生異常: 2018-10-19 09:17:49,981 INFO org.apache.hadoop.yarn.server.resourcemanage

19-05、redis哨兵主備切換的資料丟失問題:非同步複製、叢集

1、兩種資料丟失的情況 主備切換的過程,可能會導致資料丟失。 (1)非同步複製導致的資料丟失 因為master -> slave的複製是非同步的,所以可能有部分資料還沒複製到slave,master就宕機了,此時這些部分資料就丟失了。 非同步複製導致的資料丟失問題.png

elasticsearch的問題

我們都遇到過這個 - 在我們開始準備一個elasticsearch叢集的時候,第一個問題就是“叢集需要有多少節點?”。我想大家都知道,這個問題的答案取決於很多因素,例如期望的負載,資料大小,硬體等。這篇博文不會深入解釋如何調整叢集大小的細節,而是去關注另一個同樣重要的事情 - 如何避免腦裂問題。

Elasticsearch分片//優化

Elasticsearch分片 預設是randomize across shards 隨機選取,表示隨機的從分片中取資料 _local:指查詢操作會優先在本地節點有的分片中查詢,沒有的話再在其它節點查

什麼是高可用HA(High Availability)“"

在涉及到高可用性時,經常會聽到”腦裂“,到底啥是”腦裂“? 一句話:當兩(多)個節點同時認為自已是唯一處於活動狀態的伺服器從而出現爭用資源的情況,這種爭用資源的場景即是所謂的“腦裂”(split-b

Zookeeper異常ConnectionLossException解決

exists 發出 create zookeeper keep exc loss 之間 log 項目中要求做一個將配置文件讀取到zookeeper節點上的工具: 開發代碼如下: 但是當連接到遠端的Zookeeper服務之後,出現了下面異常: Exception i

keepalived工作原理及

keepalived   裂腦1. keepalived服務的工作原理(重點)ükeepalived高可用對之間是通過VRRP協議通信的,因此,我們從VRRP協議介紹:üvrrp協議,全稱virtual router redundancy protocol ,中文名名為虛擬路由冗余協議,VRRP

zookeeper集群查看狀態時報錯Error contacting service. It is probably not running的一些坑以及解決辦法

暫時 關機重啟 ron emc img 坑爹 .com 輸出日誌 off 最近在搭建mq集群時候需要用到,zookeeper,可是啟動的時候顯示成功了,查看狀態的時候卻報錯了: 碰到這個問題也是研究好好半天才解決,這裏就總結出一個快速解決辦法! 首先,必須看日誌: 報錯

ZooKeeper應用——解決分布式系統單點故障

什麽是 src 模式 code 就會 避免 分享圖片 進程 方式 1.單點故障問題 什麽是分布式系統中的單點故障:通常分布式系統采用主從模式,就是一個主控機連接多個處理節點。主節點負責分發任務,從節點負責處理任務,當我們的主節點發生故障時,那麽整個系統就都癱瘓了,那麽我們