#Elasticsearch集羣的腦裂問題 正常狀況下,集羣中的全部的節點,應該對集羣中master的選擇是一致的,這樣得到的狀態信息也應該是一致的,不一致的狀態信息,說明不一樣的節點對master節點的選擇出現了異常——也就是所謂的腦裂問題。這樣的腦裂狀態直接讓節點失去了集羣的正確狀態,致使集羣不能正常工做。node
可能致使的緣由:git
應對問題的辦法:github
node.master: true node.data: false
固然,其它的節點就不能再擔任master了,把上面的配置反過來便可。這樣就作到了將master節點與data節點分離。固然,爲了使新加入的節點快速肯定master位置,能夠將data節點的默認的master發現方式有multicast修改成unicast:api
discovery.zen.ping.multicast.enabled: false discovery.zen.ping.unicast.hosts: ["master1", "master2", "master3"]
discovery.zen.ping.multicast.enabled: false discovery.zen.ping_timeout: 120s discovery.zen.minimum_master_nodes: 2 client.transport.ping_timeout: 60s discovery.zen.ping.unicast.hosts: ["10.0.31.2", "10.0.33.2"]
真的高枕無憂了? 其實問題依然存在,ES的issue空間也在討論一個特例狀況《#2488》:即便 minimum_master_nodes 設置了一個正確的值,腦裂也有可能發生。網絡
如何識別這個問題? 在您的集羣裏面儘快識別這個問題很是重要。一個比較容易的方法是定時獲取每個節點/_nodes響應,它返回了集羣中全部節點的狀態報告,若是兩個節點返回的集羣狀態不同,就是一個腦裂狀況發生的警示信號。elasticsearch
新增解決方案 對於一個具備全功能的ES節點,必需要有一個活動的Master節點。ES1.4.0.Beta1後,新增了一項沒有Master時阻塞集羣操做設置:discovery.zen.no_master_block。code
當集羣中沒有活動的Master節點後,該設置指定了哪些操做(read、write)須要被拒絕(即阻塞執行)。有兩個設置值:all和write,默認爲wirte。進程
這項配置不會對基本api(例如集羣狀態、節點信息和狀態API)產生影響,這些節點在任何節點上執行都不會被阻塞。內存
ps: es的優勢:由於它的開箱即用、天生集羣、自動容錯、擴展性強等優勢,仍是選擇它來作全文檢索