所谓脑裂问题(相似于精神分裂),就是同一个集群中的不一样节点,对于集群的状态有了不同的理解。node
今天,Elasticsearch集群出现了查询极端缓慢的状况,经过如下命令查看集群状态:服务器
curl -XGET 'es-1:9200/_cluster/health'网络
发现,集群的整体状态是red,原本9个节点的集群,在结果中只显示了4个;可是,将请求发向不一样的节点以后,我却发现即便是整体状态是red的,可是可用的节点数量却不一致。curl
正 常状况下,集群中的全部的节点,应该对集群中master的选择是一致的,这样得到的状态信息也应该是一致的,不一致的状态信息,说明不一样的节点对 master节点的选择出现了异常——也就是所谓的脑裂问题。这样的脑裂状态直接让节点失去了集群的正确状态,致使集群不能正常工做。url
可能致使的缘由:进程
1. 网络:因为是内网通讯,网络通讯问题形成某些节点认为master死掉,而另选master的可能性较小;进而检查Ganglia集群监控,也没有发现异常的内网流量,故此缘由能够排除。
2. 节点负载:因为master节点与data节点都是混合在一块儿的,因此当工做节点的负载较大(确实也较大)时,致使对应的ES实例中止响应,而这台服务器 若是正充当着master节点的身份,那么一部分节点就会认为这个master节点失效了,故从新选举新的节点,这时就出现了脑裂;同时因为data节点 上ES进程占用的内存较大,较大规模的内存回收操做也能形成ES进程失去响应。因此,这个缘由的可能性应该是最大的。
应对问题的办法:
内存
1. 对应于上面的分析,推测出缘由应该是因为节点负载致使了master进程中止响应,继而致使了部分节点对于master的选择出现了分歧。为此,一个直观 的解决方案即是将master节点与data节点分离。为此,咱们添加了三台服务器进入ES集群,不过它们的角色只是master节点,不担任存储和搜索 的角色,故它们是相对轻量级的进程。能够经过如下配置来限制其角色:复制代码
- node.master: true
- node.data: false
固然,其它的节点就不能再担任master了,把上面的配置反过来便可。这样就作到了将master节点与data节点分离。固然,为了使新加入的节点快速肯定master位置,能够将data节点的默认的master发现方式有multicast修改成unicast:
复制代码 2. 还有两个直观的参数能够减缓脑裂问题的出现: discovery.zen.ping_timeout(默认值是3秒):默认状况下,一个节点会认为,若是master节点在3秒以内没有应答,那么这个节点就是死掉了,而增长这个值,会增长节点等待响应的时间,从必定程度上会减小误判。 discovery.zen.minimum_master_nodes(默认是1):这个参数控制的是,一个节点须要看到的具备master节点资格的 最小数量,而后才能在集群中作操做。官方的推荐值是(N/2)+1,其中N是具备master资格的节点的数量(咱们的状况是3,所以这个参数设置为2, 但对于只有2个节点的状况,设置为2就有些问题了,一个节点DOWN掉后,你确定连不上2台服务器了,这点须要注意)。 以上的解决方法只能是减缓这种现象的发生,并不能从根本上杜绝。
- discovery.zen.ping.multicast.enabled: false
- discovery.zen.ping.unicast.hosts: ["master1", "master2", "master3"]