技术交流28群

服务热线

135-6963-3175

微信服务号

Elasticsearch之leader选举 更新时间 2022-3-8 浏览1101次

Es leader选举机制

选举时间点:

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

集群启动初始化

集群的Master崩溃的时候

任何一个节点发现当前集群中的Master节点没有得到n/2 + 1节点认可的时候,触发选举。

流程:

  1. 筛选activeMasters列表

  2. 筛选masterCandidates列表

  3. 从activeMasters列表选举Master节点

  4. 从masterCandidates列表选举Master节点

  5. 本地节点是master

  6. 本地节点不是master


 一、bully算法

  经过以下几个步骤

    1.启动节点ping协调器,获取当前集群状态(节点信息,集群名称等),如果协调器没有启动一直到ping通为止

    2.无论能ping通,都会拿到对象activeMaster现役master

    3.判断activeMaster的数量,0说明当前集群没有master,1表示当前集群已经选举完毕.

    4.如果为1,当前节点启动Bully算法逻辑结束;如果为0,进入第5步(总会停止在这里)

    5.启动时发现没有现役master,将集群中所有的master节点放到candidate的候选名单中.候选名单大于等于最小master数量,小于最小master数量.

    6.如果candidate中大于等于master最小数量,从其中选举一个id值最小的节点放到activeMaster中,暂定为master,如果小于最小master转回第一步.

 二、master宕机逻辑

    在集群中,任意节点的变化,都会导致所有人记录的candidate/activeMaster发生变化

    ○ activeMaster发生变化(1-0),主节点宕机

    重新进行选举

    ○ candidate发生变化,现役master正常,其他备选有宕机现象;

  重新判断集群的最小个数(activeMaster+candidate个数>=最小master)


1、筛选activeMasters列表

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

elasticsearch在获取activeMasters列表的时候会排除本地节点,目的是为了避免脑裂,假设这样一个场景,当前最小编号的节点P0认为自己就是master并且P0和其它节点发生网络分区,同时es允许将自己放在activeMaster中,因为P0编号最小,那么P0永远会选择自己作为master节点,那么就会出现脑裂的情况。

2、筛选masterCandidates列表

masterCandidates列表是当前集群有资格成为Master的节点,如果我们在elasticsearch.yml中配置了如下参数,那么这个节点就没有资格成为Master节点,也就不会被筛选进入masterCandidates列表。

#配置某个节点没有成为master资格
node.master:false

3、从activeMasters列表选举Master节点

activeMaster列表是其它节点认为的当前集群的Master节点列表,如果activeMasters列表不为空,elasticsearch会优先从activeMasters列表中选举,也就是对应着流程图中的蓝色框,选举的算法是Bully算法,笔者在前文中详细介绍了Bully算法,Bully算法会涉及到优先级比较,在activeMasters列表优先级比较的时候,如果节点有成为master的资格,那么优先级比较高,如果activeMaster列表有多个节点具有master资格,那么选择id最小的节点。

4. 从masterCandidates列表选举Master节点

这一节对应的是红色流程图中红色部分,如果activeMaster列表为空,那么会在masterCandidates中选举,masterCandidates选举也会涉及到优先级比较,masterCandidates选举的优先级比较和activeMasters选举的优先级比较不同。它首先会判断masterCandidates列表成员数目是否达到了最小数目discovery.zen.minimum_master_nodes。如果达到的情况下比较优先级,优先级比较的时候首先比较节点拥有的集群状态版本编号,然后再比较id,这一流程的目的是让拥有最新集群状态的节点成为master。

5. 本地节点是master

经过上述选举之后,会选举出一个准master节点, 准master节点会等待其它节点的投票,如果有discovery.zen.minimum_master_nodes-1个节点投票认为当前节点是master,那么选举就成功,准master会等待discovery.zen.master_election.wait_for_joins_timeout时间,如果超时,那么就失败。在代码实现上准master通过注册一个回调来实现,同时借助了AtomicReference和CountDownLatch等并发构建实现。

本地节点是Master的时候,Master节点会开启错误检测(NodeFaultDetection机制),它节点会定期扫描集群所有的成员,将失活的成员移除集群,同时将最新的集群状态发布到集群中,集群成员收到最新的集群状态后会进行相应的调整,比如重新选择主分片,进行数据复制等操作。

6. 本地节点不是master

当前节点判定在集群当前状态下如果自己不可能是master节点,首先会禁止其他节点加入自己,然后投票选举出准Master节点。同时监听master发布的集群状态(MasterFaultDetection机制),如果集群状态显示的master节点和当前节点认为的master节点不是同一个节点,那么当前节点就重新发起选举。


非Master节点也会监听Master节点进行错误检测,如果成员节点发现master连接不上,重新加入新的Master节点,如果发现当前集群中有很多节点都连不上master节点,那么会重新发起选举。




。。。。待总结

leader和非leader master的区别作用是什么???

集群的主节点是集群的最高统治者,控制着索引的创建和分片的移动策略等;

leader选举时候集群是否可用???数据是否会丢失??

node节点宕机分片是否会丢失???如何恢复??

选举流程7.x版本之前选举和之后的方式???


参考:

www.liritian.com/archives/1055

官方文档:www.elastic.co/guide/en/elasticsearch/reference/6.8/modules-discovery-zen.html#modules-discovery-zen