简介
正常一个集群只有一个主节点,脑裂就是从节点在选择主节点出现分歧,导致一个集群出现多个主节点导致集群分裂,使得集群处于异常状态。
发生脑裂的原因
- 网络原因:内网一般不会,外网可能性大。
- 节点负载:主节点既负责管理集群又要存储数据,当访问量大时可能会导致es实例反应不过来而停止响应,此时其他节点向主节点发送消息时得不到主节点的响应就会认为主节点挂了,从而重新选择节点。
- 回收内存:大规模内存回收时也会导致es集群失去响应。
ES主动选举机制
ES集群建立后,会选举出一个master,其他都为slave,每个节点都提供写和读的操作。
问题:节点有可能会挂掉
1.slave节点挂掉了,数据丢失问题
答:如果开启了replicate,这个数据在别的机器上有备份,别的节点上的备份分片会自动升格为这份分片数据的主分片,但是集群状态会有一段时间的yellow。
2.master节点挂了
答:会再次选举出新的master节点
我们想一个场景:假设现在有10台机器,两个机房,每个机房5台机器。当这两个机房之间一旦断了联系,每个机房的节点会自己集会,共同推举出一个主节点,这时候就有个两个主节点,当两个机房之间恢复联系之后,这时就会造成数据冲突的问题,应该怎么去预防这种情况的出现呢?
预防脑裂的方案
- 角色分离:es集群中配置多个主节点并让它们只负责管理,不负责存储,从节点只负责存储,并禁用自动发现机制并为其指定主节点。(yml文件配置)
- 参数配置:一、主节点超时时间加长
二、从节点选举数配置,官方推荐为(n/2)+1,n为有资格成为主节点的节点数。