Elasticsearch腦裂問題詳細分析以及解決方案
什么是腦裂問題
腦裂問題其實就是同一個集群的不同節點對於整個集群的狀態有不同的理解,導致操作錯亂,類似於精神分裂
怎么發現集群產生腦裂問題吧
1.Elasticsearch出現查詢非常緩慢的情況
2.通過命令查看集群的狀態
3.curl -XGET ‘http://localhost:9200/_cluster/health’
4.發現集群狀態為red,且集群數量明顯錯誤,再向不同的節點查詢集群狀態的時候,總體狀態都是red,但是返回的集群數量卻不太一樣
5.正常情況下,訪問每一個節點,對集群中的狀態返回應該是一致的。不一致的信息表示集群中不同節點對master節點的選擇出現了問題。導致集群不能正常工作
產生腦裂問題的原因
1.網絡
2.由於某些節點之間的網絡通信出現問題,導致一些節點認為master節點已經掛了,所以有重新選舉了新的master節點,從而導致集群信息混亂,可以檢查Ganglia集群監控,來查看是否是網絡原因
3.節點負載過大:由於master節點與data節點都是混在一起的,有可能master節點的負載過大,導致對應的es實例停止響應,這時一部分節點會一位master節點已經掛掉從而重新選舉,導致多master節點運行。同時由於data節點上ES進程占用的內存較大,較大規模的內存回收操作也能造成ES進程失去響應。所以,這個原因的可能性應該是最大的。
如何解決腦裂問題
對於網絡問題,只能進行網絡修復,在重啟集群
對於負載的問題
一個直觀的解決方案就是將master節點與data節點分離,准備幾台機器加入集群中,這幾台機器只能充當master節點,不可擔任存儲和搜索的角色
配置信息
node.master: true node.data: false 其他節點 只能充當data不能充當master node.master: false node.data: true
還有兩個參數的修改可以減少腦裂問題的出現
1.discovery.zen.ping_timeout(默認值是3秒):默認情況下,一個節點會認為,如果master節點在3秒之內沒有應答,那么這個節點就是死掉了,而增加這個值,會增加節點等待響應的時間,從一定程度上會減少誤判。
2.discovery.zen.minimum_master_nodes(默認是1):這個參數控制的是,一個節點需要看到的具有master節點資格的最小數量,然后才能在集群中做操作。官方的推薦值是(N/2)+1,其中N是具有master資格的節點的數量
discovery.zen.minimum_master_nodes對集群的穩定性至關重要,防止腦裂的出現。
discovery.zen.minimum_master_nodes的作用是只有足夠的master候選節點時,才可以選舉出一個master。該參數必須設置為集群中master候選節點的quorum數量。
quorum的算法=master候選節點數量/2+1
舉例:
1、如果有10個節點,都是data node,也是master的候選節點。則quorum=10/2+1=6
2、如果有3個master候選節點,100個數據節點。則quorum=3/2+1=2
3、如果有2個節點,都是data node,也是master的候選節點。則quorum=2/2+1=2(有問題)
如果其中一個節點掛了,那么master的候選節點只有一個,無法滿足quorum數量。即無法選舉出master。此時只能將quorum設置成1,但是設置為1有可能出現腦裂。
總結:一般es集群的節點至少要有3個,quorum設置為2
使用例2的場景說明quorum是如何防止腦裂
假設集群中3個節點有一個節點與其他節點無法通信,
1、如果master是單獨的節點,另外2個節點是master候選節點。那么此時單獨的master節點因為沒有指定數量的候選master node在自己當前所在的集群里。因此會取消當前的master角色,嘗試重新選舉(無法選舉成功)
另外一個網絡區域內的node因為無法連接到master,就會發起重新選舉,有兩個候選節點,滿足quorum,成功選舉出一個master。
2、如果master和一個node在一個網絡區域(A),另一個node單獨在一個網絡區域(B)。
B區域只有一個node,因為連不上master,會嘗試發起選舉,但不滿足quorum,無法選舉
A區域master繼續工作,當前網絡也滿足quorum,不發起選舉。
discovery.zen.minimum_master_nodes除了在配置文件設置,也可以動態設置
PUT /_cluster/settings
{
"persistent":{
"discovery.zen.minimum_master_nodes":2
}
}
如果腦裂問題已經發生該如何解決
1…當腦裂發生后,唯一的修復辦法是解決這個問題並重啟集群。 當elasticsearch集群啟動時,會選出一個主節點(一般是啟動的第一個節點被選為主)。由於索引的兩份拷貝已經不一樣了,elasticsearch會認為選出來的主保留的分片是“主拷貝”並將這份拷貝推送給集群中的其他節點。這很嚴重。讓我們設想下你是用的是node客戶端並且一個節點保留了索引中的正確數據。但如果是另外的一個節點先啟動並被選為主,它會將一份過期的索引數據推送給另一個節點,覆蓋它,導致丟失了有效數據。
2.所以怎么從腦裂中恢復?第一個建議是給所有數據重新索引。第二,如果腦裂發生了,要十分小心的重啟你的集群。停掉所有節點並決定哪一個節點第一個啟動。 如果需要,單獨啟動每個節點並分析它保存的數據。如果不是有效的,關掉它,並刪除它數據目錄的內容(刪前先做個備份)。如果你找到了你想要保存數據的節點,啟動它並且檢查日志確保它被選為主節點。這之后你可以安全的啟動你集群里的其他節點了。
轉載:https://blog.csdn.net/ichen820/article/details/107414528、https://blog.csdn.net/zuodaoyong/article/details/104719508