Elasticsearch作为一个分布式搜索和分析引擎需要一个master来管理集群中的节点、维护集群的元数据。与其它采用zookeeper来实现选主的分布式系统不同,Elasticsearch自己实现了自己的选举流程,下面介绍一下Elasticsearch的选主流程
Elasticsearch中的Discovery模块负责发现集群中的节点,以及选择主节点。ES支持多种不同的Discovery选择,内置的实现称为Zen Discovery,其封装了节点发现(ping)、选主等实现过程。
Elasticsearch中的节点在配置时会设置节点的功能项目,如下:
node.master:true
node.data:true
node.master为true表示这个节点能作为候选节点参加选举、fasle表示不能参加选举。
node.data:true表示这个节点可以作为数据节点存储数据,false表示不存储数据。
选举流程
Elasticsearch中的候选节点通过Bully算法来进行选举,该算法假定所有节点都有一个唯一的ID,使用该ID对节点进行排序,选择最小的节点作为Master。
具体的流程如下:
1、节点向候选节点发ping消息,候选节点返回response。
2、节点得到汇总response,得到两个集合:activeMasters和masterCandidates。activeMasters是当前活跃的master(一般只有一个),masterCandidates是当前候选的master。如果活跃的master不为空,说明当前集群有master,就选择id最小的一个加入,如果activeMasters为空,说明当前集群没有master,就从masterCandidates中选择ID最小的一个加入。
3、如果选出来的master是自己,就等待接收其它节点的join消息,在规定的时间内(默认30秒),接收到的join的数量(只计算有选举资格的节点)大于总数的一半,则说明当前master选举成功,然后更新cluserState,然后发布cluserState到其它接口;否则说明当前master选举失败,本节点停止接收join消息,重新发送ping消息,进行选举。
4、如果其它节点成为master,则不再接受其他节点的 join 请求,向 Master 发送join请求,并等待回复。超时时间默认为1分钟(可配置)。如果遇到异常,则默认重试 3 次(可配置)。这个步骤在 joinElectedMaster方法中实现。
失效检测
在选主成功以后,需要定时发送消息来检测是否有节点掉线,具体如下:
在Master节点NodesFaultDetection,定时发送ping消息到集群中的其它节点,看这些节点是否有效 。如果发现某个节点失效,则把这个节点剔除集群,同时更新、发布元数据。如果发现当前活跃的节点数小于集群节点的一半,则会放弃master身份,重新开始选举。
在非Master节点启动MasterFaultDetection,定时发送ping消息到master,看master是否有效,如果发现Master失效,该节点重新执行选举流程。
总结
选主流程在集群中启动,从无主状态到产生新主时执行,同时集群在正常运行过程中,Master 探测到节点离开,非 Master 节点探测到 Master 离开时都会执行 。