ZooKeeper的腦裂的出現和解決方案

2021-09-22 18:55:32 字數 2571 閱讀 5557

出現:

在搭建hadoop的ha集群環境後,由於兩個namenode的狀態不一,當active的namenode由於網路等原因出現假死狀態,standby接收不到active的心跳,因此判斷active的namenode宕機,但實際上active並沒有死亡。此時standby的namenode就會切換成active的狀態,保證服務能夠正常使用。若原來的namenode復活,此時在整個集群中就出現2個active狀態的namenode,該狀態成為腦裂。腦裂現象可能導致這2個namenode爭搶資源,從節點不知道該連線哪一台namenode,導致節點的資料不統一,這在企業生產中是不可以容忍的。

解決方案:

1、新增心跳線。

原來兩個namenode之間只有一條心跳線路,此時若斷開,則接收不到心跳報告,判斷對方已經死亡。此時若有2條心跳線路,一條斷開,另一條仍然能夠接收心跳報告,能保證集群服務正常執行。2條心跳線路同時斷開的可能性比1條心跳線路斷開的小得多。再有,心跳線路之間也可以ha(高可用),這兩條心跳線路之間也可以互相檢測,若一條斷開,則另一條馬上起作用。正常情況下,則不起作用,節約資源。

2、啟用磁碟鎖。

由於兩個active會爭搶資源,導致從節點不知道該連線哪一台namenode,可以使用磁碟鎖的形式,保證集群中只能有一台namenode獲取磁碟鎖,對外提供服務,避免資料錯亂的情況發生。但是,也會存在乙個問題,若該namenode節點宕機,則不能主動釋放鎖,那麼其他的namenode就永遠獲取不了共享資源。因此,在ha上使用"智慧型鎖"就成為了必要措施。"智慧型鎖"是指active的namenode檢測到了心跳線全部斷開時才啟動磁碟鎖,正常情況下不上鎖。保證了假死狀態下,仍然只有一台namenode的節點提供服務。

3、設定仲裁機制

腦裂導致的後果最主要的原因就是從節點不知道該連線哪一台namenode,此時如果有一方來決定誰留下,誰放棄就最好了。因此出現了仲裁機制,比如提供乙個參考的ip位址,當出現腦裂現象時,雙方接收不到對方的心跳機制,但是能同時ping參考ip,如果有一方ping不通,那麼表示該節點網路已經出現問題,則該節點需要自行退出爭搶資源的行列,或者更好的方法是直接強制重啟,這樣能更好的釋放曾經占有的共享資源,將服務的提供功能讓給功能更全面的namenode節點。

以上的3種方式可以同時使用,這樣更能減少集群中腦裂情況的發生。但是還是不能保證完全不出現,如果仲裁機制中2臺機器同時宕機,那麼此時集群中沒有namenode可以使用。此時需要運維人員人工的搶修,或者提供一台新的機器作為namenode,這個時間是不可避免的。希望未來能有更好的解決辦法,能徹底杜絕這類情況的發生吧~

出現:

在搭建hadoop的ha集群環境後,由於兩個namenode的狀態不一,當active的namenode由於網路等原因出現假死狀態,standby接收不到active的心跳,因此判斷active的namenode宕機,但實際上active並沒有死亡。此時standby的namenode就會切換成active的狀態,保證服務能夠正常使用。若原來的namenode復活,此時在整個集群中就出現2個active狀態的namenode,該狀態成為腦裂。腦裂現象可能導致這2個namenode爭搶資源,從節點不知道該連線哪一台namenode,導致節點的資料不統一,這在企業生產中是不可以容忍的。

解決方案:

1、新增心跳線。

原來兩個namenode之間只有一條心跳線路,此時若斷開,則接收不到心跳報告,判斷對方已經死亡。此時若有2條心跳線路,一條斷開,另一條仍然能夠接收心跳報告,能保證集群服務正常執行。2條心跳線路同時斷開的可能性比1條心跳線路斷開的小得多。再有,心跳線路之間也可以ha(高可用),這兩條心跳線路之間也可以互相檢測,若一條斷開,則另一條馬上起作用。正常情況下,則不起作用,節約資源。

2、啟用磁碟鎖。

由於兩個active會爭搶資源,導致從節點不知道該連線哪一台namenode,可以使用磁碟鎖的形式,保證集群中只能有一台namenode獲取磁碟鎖,對外提供服務,避免資料錯亂的情況發生。但是,也會存在乙個問題,若該namenode節點宕機,則不能主動釋放鎖,那麼其他的namenode就永遠獲取不了共享資源。因此,在ha上使用"智慧型鎖"就成為了必要措施。"智慧型鎖"是指active的namenode檢測到了心跳線全部斷開時才啟動磁碟鎖,正常情況下不上鎖。保證了假死狀態下,仍然只有一台namenode的節點提供服務。

3、設定仲裁機制

腦裂導致的後果最主要的原因就是從節點不知道該連線哪一台namenode,此時如果有一方來決定誰留下,誰放棄就最好了。因此出現了仲裁機制,比如提供乙個參考的ip位址,當出現腦裂現象時,雙方接收不到對方的心跳機制,但是能同時ping參考ip,如果有一方ping不通,那麼表示該節點網路已經出現問題,則該節點需要自行退出爭搶資源的行列,或者更好的方法是直接強制重啟,這樣能更好的釋放曾經占有的共享資源,將服務的提供功能讓給功能更全面的namenode節點。

以上的3種方式可以同時使用,這樣更能減少集群中腦裂情況的發生。但是還是不能保證完全不出現,如果仲裁機制中2臺機器同時宕機,那麼此時集群中沒有namenode可以使用。此時需要運維人員人工的搶修,或者提供一台新的機器作為namenode,這個時間是不可避免的。希望未來能有更好的解決辦法,能徹底杜絕這類情況的發生吧~

簡單交接zookeeper,腦裂現象

zookeeper 1.zookeeper是乙個分布式的,開放原始碼的分布式應用程式協調服務,是google的chubby乙個開源的實現,是hadoop和hbase的重要元件。它是乙個為分布式應用提供一致性服務的軟體,提供的功能包括 配置維護 網域名稱服務 分布式同步 組服務等。2.zookeepe...

mysql腦裂 如何防止HA集群的腦裂

luozhaode 博主這篇有關腦裂的文章是我看到過的理解的最透徹的。真是學習了,不過在實際工作中還是對腦裂存在著疑惑,懇請博主釋疑一下。謝謝!我們熟知的腦裂問題一般表現形式是 在mysql主備上安裝集群軟體,比如keepalive管理vip的飄逸 heartbeat管理包括vip在內的共享資源的轉...

Elasticsearch集群的腦裂問題和解決方案

什麼是腦裂?如果發生網路中斷或者伺服器宕機,那麼集群會有可能被劃分為兩個部分,各自有自己的master來管理,那麼這就是腦裂。es集群有可能會出現腦裂問題,原因主要有兩個 如果集群中節點不在同乙個網段有可能是網路延遲造成的 如果集群中的節點在同乙個網段,有可能是主節點負載太大造成的 解決方案主要有兩...