1. 什么是脑裂

  Elasticsearch 在主节点上产生分歧,产生多个主节点,从而使集群分裂,使得集群处于异常状态,这个现象叫做脑裂。脑裂问题其实就是同一个集群的不同节点对于整个集群的状态有不同的理解,导致操作错乱,类似于精神分裂。

2. 脑裂产生的原因

  • 网络问题:集群间的网络延迟导致一些节点访问不到 master,认为 master 挂掉了从而选举出新的 master,并对 master 上的分片和副本标红,分配新的主分片;
  • 节点负载:主节点的角色既为 master 又为 data,访问量较大时可能会导致 Elasticsearch 停止响应造成大面积延迟,此时其他节点得不到主节点的响应认为主节点挂掉了,会重新选取主节点;
  • 内存回收:data 节点上的 Elasticsearch 进程占用的内存较大,引发 JVM 的大规模内存回收,造成 ES 进程失去响应;

3. 脑裂问题解决方案

  • 减少误判:discovery.zen.ping_timeout,节点状态的响应时间,默认为 3s,可以适当调大,如果 master 在该响应时间的范围内没有做出响应应答,判断该节点已经挂掉了。调大参数(如 6s),可适当减少误判;
  • 选举触发:discovery.zen.minimum_master_nodes:1,该参数是用于控制选举行为发生的最小集群主节点数量。当备选主节点的个数大于等于该参数的值, 且备选主节点中有该参数个节点认为主节点挂了,进行选举。官方建议为(n/2)+1,n 为主节点个数(即有资格成为主节点的节点个数);
  • 角色分离:即 master 节点与 data 节点分离,限制角色主节点配置为:node.master: truenode.data: false;从节点配置为:node.master: falsenode.data: true