1.什麼是Elasticsearch叢集腦裂
Elasticsearch叢集由一個主節點(可以有多個備選主節點)和多個資料節點組成。其中主節點負責建立、删除索引、配置設定分片、追蹤叢集中的節點狀态等工作,即排程節點,計算壓力較輕;資料節點負責資料存儲和具體操作,如執行搜尋、聚合等任務,計算壓力較大。
正常情況下,當主節點無法工作時,會從備選主節點中選舉一個出來變成新主節點,原主節點回歸後變成備選主節點。但有時因為網絡抖動等原因,主節點沒能及時響應,叢集誤以為主節點下線了,選舉了一個新主節點,此時一個Elasticsearch叢集中有了兩個主節點,其他節點不知道該聽誰的排程,這時就發生了"腦裂"現象,通俗點就是“精神分裂”。
es腦裂:一個大的es叢集分裂成了多個小的叢集。
比如有 a b c d 四個es
a b c d 之間選取一個master,比如master是a。
若某時刻 c d 通路不到a ,b能通路到a。
c d之間會重新選舉一個master。
這樣整個a b c d的es叢集就會分裂為a b 和 b c 兩個叢集。
2.産生的原因
(1)網絡抖動。
由于是内網通信、網絡通信等問題造成部分節點認為master node挂掉, 然後另選master node的情況可能性較小;可以通過檢查Ganglia叢集監控,沒有發現異常的内網流量, 故此原因可以排除。
而外網的網絡出現問題的可能性更大,更有可能造成“腦裂”現象。
(2)節點負載。
如果主節點同時承擔資料節點的工作,可能會因為工作負載大而導緻對應的Elasticsearch執行個體停止響應。此外,由于資料節點上的Elasticsearch程序占用的記憶體較大, 較大規模的記憶體回收操作(GC)也能造成Elasticsearch程序失去響應。是以,該原因出現“腦裂”現象的可能性更大。
(3)記憶體回收。
由于資料節點上的Elasticsearch程序占用的記憶體較大,較大規模的記憶體回收操作也能造成Elasticsearch程序失去響應。
3.解決方法
(1)不要把主節點同時設為資料節點,即
node.master
和
node.data
不要同時為
true
。
主節點配置為:
node.master: true
node.data: false
從節點配置為:
node.master: false
node.data: true
(2)将節點響應逾時
discovery.zen.ping_timeout
稍稍設定長一些(預設是3秒)。預設情況下, 一個節點會認為, 如果master節點在 3 秒之内沒有應答, 那麼這個節點就是挂掉了, 而增加這個值, 會增加節點等待響應的時間, 從一定程度上會減少誤判。
(3)
discovery.zen.minimum_master_nodes
的預設值是1,該參數表示, 一個節點需要看到的具有master節點資格的最小數量, 然後才能在叢集中做操作,即重新選舉主節點。官方的推薦值是
(N/2)+1
,其中 N 是具有 master資格的節點的數量,即隻有超過
(N/2)+1
個主節點同意,才能重新選舉主節點。
4.方案分析
實際解決辦法
最終考慮到資源有限,解決方案如下:
增加一台實體機,這樣,一共有了三台實體機。在這三台實體機上,搭建了6個ES的節點,三個data節點,三個master節點(每台實體機分别起了一個data和一個master),3個master節點,目的是達到(n/2)+1等于2的要求,這樣挂掉一台master後(不考慮data),n等于2,滿足參數,其他兩個master節點都認為master挂掉之後開始重新選舉,
master節點上
node.master = true
node.data = false
discovery.zen.minimum_master_nodes = 2
data節點上
node.master = false
node.data = true
方案分析
1.角色分離後,當叢集中某一台節點的master程序意外挂掉了,或者因負載過高停止響應,終止掉的master程序很大程度上不會影響到同一台機器上的data程序,即減小了資料丢失的可能性。
2.
discovery.zen.minimum_master_nodes
設定成了2(3/2+1)當叢集中兩台機器都挂了或者并沒有挂掉而是處于高負載的假死狀态時,僅剩一台備選master節點,小于2無法觸發選舉行為,叢集無法使用,不會造成分片混亂的情況。
而圖一,兩台節點假死,僅剩一台節點,選舉自己為master,當真正的master蘇醒後,出現了多個master,并且造成查詢不同機器,查到了結果不同的情況。
5.總結
以上的解決方法隻能是減緩這種現象的發生, 并沒有從根本上杜絕。
如果發生了腦裂, 如何解決?
是以怎麼從腦裂中恢複?