所謂腦裂問題(類似於精神分裂),就是同一個集群中的不同節點,對於集群的狀態有了不一樣的理解。
情況描述,通過以下命令查看集群狀態:
curl -XGET 'es-1:9200/_cluster/health'
發現,集群的總體狀態是red,本來9個節點的集群,在結果中只顯示了4個;但是,將請求發向不同的節點之后,卻發現即使是總體狀態是red的,但是可用的節點數量卻不一致。
es集群由多個數據節點和一個主節點(可以有多個備選主節點)組成。其中數據節點負責數據存儲和具體操作,如執行搜索、聚合等任務,計算壓力較大
。主節點負責創建、刪除索引、分配分片、追蹤集群中的節點狀態等工作,計算壓力較輕
。
正常情況下,當主節點無法工作時,會從備選主節點中選舉一個出來變成新主節點,原主節點回歸后變成備選主節點。但有時因為網絡抖動等原因,主節點沒能及時響應,集群誤以為主節點掛了,選舉了一個新主節點,此時一個es集群中有了兩個主節點,其他節點不知道該聽誰的調度,結果將是災難性的!這種類似一個人得了精神分裂症,就被稱之為“腦裂”現象。
造成es“腦裂”的因素有以下幾個:
1、網絡抖動
內網一般不會出現es集群的腦裂問題,可以監控內網流量狀態。外網的網絡出現問題的可能性大些。
2、節點負載
如果主節點同時承擔數據節點的工作,可能會因為工作負載大而導致對應的 ES 實例停止響。
3、內存回收
由於數據節點上es進程占用的內存較大,較大規模的內存回收操作也能造成es進程失去響應。
避免es“腦裂”的措施主要有以下三個:
1、不要把主節點同時設為數據節點(node.master和node.data不要同時設為true)
2、將節點響應超時(discovery.zen.ping_timeout)稍稍設置長一些(默認是3秒),避免誤判。
3、設置需要超過半數的備選節點同意,才能發生主節點重選,類似需要參議院半數以上通過,才能彈劾現任總統。(discovery.zen.minimum_master_nodes = 半數以上備選主節點數)