ES 选主流程分析

4,613 阅读4分钟

今天主要学习分析了选主的流程,首先看一下整体流程图:

看完图了,可能很多朋友还是云里雾里,那么接下来我就做简单解释。

理论知识

作为一个分布式的系统,为了保证整个系统的数据一致性和以及一些治理的工作都会有一个协调者。那么对于这个协调策略,通常有两种思路:

  1. 试图避免不一致
  2. 定义发生之后如何协调他们

而ES就是使用的第一种思路,并且解决了如何应对网络故障。
常用的模型中有主从模式分布式哈希表模式(DHT)

DHT:是一种分布式存储方法,一类可由键值来唯一标示的信息按照某种约定/协议被分散地存储在多个节点上,这样也可以有效地避免“中央集权式”的服务器(比如:tracker)的单一故障而带来的整个网络瘫痪。可以支持每小时数千个节点的离开和加入,他可以在不了解底层网络拓扑的异构网络中工作,查询响应时间大约为4到10跳(中转次数)

通常ES集群的节点的数量远远小于单个节点能够维护的连接数,并且网格环境不必经常处理节点加入和离开,所以使用主从模式更加适合ES。

ES选举算法

常用的选举算法有比较简单的Bully算法和复杂而强大的Paxos算法。

Bully算法

每个节点有一个唯一ID,然后对集群中所有的节点ID进行排序,选取其中最小的ID所属的节点作为Master。
Bully算法的问题: 假设当前Master因为负载过重而假死,然后ID第二大的被选举为新的Master,这时旧的Master恢复然后又被选举为Master然后又会因为负载过重而假死......

Paxos算法

Paxos实现起来非常复杂,但非常强大,尤其在什么时机,以及如何进行选举方面的灵活性比简单的Bully算法有很大的优势,因为在现实生活中,存在比网络链接异常更多的故障模式。

ES使用的是Bully算法,并对其做了一些优化:

  1. 每个节点结算最小的ID,把它选举为临时Master,然后对该master进行投票;
  2. 每个节点收集票数,当票数大于指定的法定个数时,成为Master,然后对加入的节点进行集群信息广播。

法定个数:有Master资格的节点数: (n/2 + 1 )

流程描述

在了解了上述的相关原理后,就是详细选举描述了

  1. 服务启动后,进行ping操作,ping所有的节点,然后得到一个fullPingResponses,本节点也加入该list;
  2. 创建两个列表
    • 活动的Master列表 activeMasters:遍历刚刚的fullPingResponses然后将每个节点认为的Master存入该list,正常情况下是只有一个Master;
    • 候选Master列表 candidateMasters:遍历刚刚的fullPingResponses然后将具备Master节点资格的节点加入此list;
  3. 如果activeMasters不为空,则从activeMasters中选择,否则从candidateMasters中选择,从候选列表选择时要先判断候选者列表大小是否大于法定人数,否则失败;
  4. 在从列表进行选择时,直接对列表进行排序,然后选出最小ID的节点充当临时节点;
  5. 开始进行投票,每个节点都向自己认为的Master进行joinRequest请求,此时会有两种情况
    • 本节点是Master时:此时该节点进行统计,统计发送过来的joinRequest个数,如果在指定的时间(默认30s,可配置)内达到法定人数,发布集群信息,并回复joinRequest请求,最后完成选举,否则选举失败;
    • 本节点不是Master时:拒绝其他节点joinRequest,向其认为的Master发送joinRequest请求,并等待,如果在指定的时间(1min,可配置)未收到回复或异常重试3次都失败了则选举失败,重新尝试;如果收到的回复中没有Master信息或者Master信息不是之前选择的临时Master节点则选举失败。

节点检查

经历上述5个过程后,选举成功,这时

  • Master节点会开启NodesFaultDetection(NodesDF)检测,探测加入集群的节点是否活跃;
  • Node节点会开启MasterFaultDetection(MasterDF) 检测,探测集群的Master节点是否活跃.

NodesDF触发时,如果发现当前集群的节点数小于法定人数,则会主动放弃Master身份(防止发生脑裂现象),然后触发选举 MasterDF触发时,会重新触发选举。
通过这两种探查可以解决数据节点和Master节点异常的情况了。

最后

以上就是这次分析的全部了,如有不对地方希望各位读者朋友可以指正,不胜感激。

未完待续!!!!