概述:
一个正常es集群中只有一个主节点,主节点负责管理整个集群,集群的所有节点都会选择同一个节点作为主节点所以无论访问那个节点都可以查看集群的状态信息。 而脑裂问题的出现就是因为从节点在选择主节点上出现分歧导致一个集群出现多个主节点从而使集群分裂,使得集群处于异常状态。
一般es集群会在内网部署,也可能在外网部署比如阿里云。
原因:
1:网络原因
内网一般不会出现此问题,可以监控内网流量状态。外网的网络出现问题的可能性大些。
2:节点负载
主节点即负责管理集群又要存储数据,当访问量大时可能会导致es实例反应不过来而停止响应,此时其他节点在向主节点发送消息时得不到主节点的响应就会认为主节点挂了,从而重新选择主节点。
3:回收内存
大规模回收内存时也会导致es集群失去响应。
所以内网负载的可能性大,外网网络的可能性大。
预防方案:
1:角色分离
在es集群中配置2到3个主节点并且让它们只负责管理不负责存储,从节点只负责存储。另外从节点禁用自动发现机制并为其指定主节点,在elasticsearch.yml文件中。
主节点:node.master =true node.data=false
从节点:node.master =false node.data=ture
discovery.zen.ping.multicast.enabled:false
discovery.zen.ping.unicast.hosts:["host1", "host2:port"]
2:参数配置
discovery.zen.ping_timeout:3
此参数指定从节点访问主节点后如果3秒之内没有回复则默认主节点挂了,我们可以适当的把它改大,改成5到6秒这样可以减少出现脑裂的概率。
discovery.zen.minimum_master_nodes:1
该参数的意思是,当具备成为主节点的从节点的个数满足这个数字且都认为主节点挂了则会进行选举产生新的主节点。
例如:es集群有三个从节点有资格成为主节点,这时这三个节点都认为主节点挂了则会进行选举,此时如果这个参数的值是4则不会进行选举。
我们可以适当的把这个值改大,减少出现脑裂的概率,官方给出的建议是(n/2)+1,n为有资格成为主节点的节点数node.master=true。
解决方案:
1:如果有原始数据,建议重新创建索引。
2:将es集群关闭,每次只启动一个节点然后查看节点上的数据是否完整关键,找到数据最完整的那个节点先启动它,再启动其他节点,其他节点可先备份data目录后再删除data。
因为一般情况下es集群中最先启动的节点会成为主节点,而主节点会被默认为数据最全,后续启动的节点会根据主节点的分片来进行同步,所以我们找到数据最全的节点第一个启动它并以此节点为主节点尽量恢复数据。