Elasticsearch选举流程详解

2020-05-22 00:00:00 集群 优先级 节点 列表 选举

在上文

蓝天:Elasticsearch选举原理之Bully算法zhuanlan.zhihu.com

中,笔者介绍了Bully算法原理以及Bully缺陷,随后笔者介绍了Elasticsearch如何应对脑裂,网络负载和master假死的问题,在这篇文章中,笔者详细的介绍Master的选举流程

选举时间点

Elasticsearch在满足如下时间点的时候会触发选举

  1. 集群启动初始化
  2. 集群的Master崩溃的时候
  3. 任何一个节点发现当前集群中的Master节点没有得到n/2 + 1节点认可的时候,触发选举

选举流程图

ES选举核心的是Elasticsearch的选举流程,笔者研究了Elasticsearch选举源代码,同时看了很多文章之后,梳理出了选举过程中各个流程要点,下图是elasticsearch选举的流程图

接下来笔者一一介绍elasticsearch选举的各个阶段

1. 筛选activeMasters列表

Es的master就是从activeMasters列表或者masterCandidates列表选举出来,所以选举之前es首先需要得到这两个列表。Elasticsearch节点成员首先向集群中的所有成员发送Ping请求,elasticsearch默认等待discovery.zen.ping_timeout时间,然后elasticsearch针对获取的全部response进行过滤,筛选出其中activeMasters列表,activeMaster列表是其它节点认为的当前集群的Master节点

源代码如下

List<DiscoveryNode> activeMasters = new ArrayList<>();
for (ZenPing.PingResponse pingResponse : pingResponses) {
    //不允许将自己放在activeMasters列表中
    if (pingResponse.master() != null && !localNode.equals(pingResponse.master())) {
        activeMasters.add(pingResponse.master());
    }
}

相关文章