#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的优势:由于它的开箱即用、天生集群、自动容错、扩展性强等优势,仍是选择它来作全文检索