一、ES集群模式
ES使用主从模式,因为ES的典型场景中的另一个简化是集群中没有那么多节点。通常节点数量远远小于单个节点能够维护的连接数,并且网络环境并不需要经常处理节点的加入和离开。
1、选举算法
- ES中主要使用Bully算法作为选举算法(优点是易于实现)
- Bully算法:假定所有的节点都有一个唯一ID,使用该ID对节点进行排序。任何时候当前Leader都是参与集群的最高ID节点。
- 算法问题:如果最大ID的节点处于不稳定状态,会导致Master因为负载过重假死,当第二大ID节点选为新主,此时原Master恢复,会被再次选为新主节点,然后再次假死。。。
- 解决方案:ES通过推迟选举,直到当前Master失效解决此问题,只要当前主节点不挂掉,就不重新选主。
2、脑裂的解决方案(双主)
- 为了防止多主产生脑裂,ES根据discovery.zen.minimum_master_nodes参数防止脑裂。一般配置为N/2+1,N为集群中候选主节点个数。
二、选主流程
- 整体流程大体为
- 获取所有节点信息
- 选举临时Master
- 判断本节点是否Master节点
- 本节点当选Master,则等待确立Master
- 等待足够多的具备Master资格的节点加入本节点(投票达法定人数),完成选举
- 超时(默认30s)后没有满足数据的join请求,则选举失败,进行新一轮选举
- 成功后发布新的clusterState
- 其他节点当选,尝试加入集群,然后启动节点失效探测器
- 不再接受其他节点的join请求
- 向Master发送join请求,并等待回复。默认1分钟;遇到异常可以重试3词。
- 最终当选的Master会先发布集群状态,才确认客户的join请求。
- 本节点当选Master,则等待确立Master
- 节点失效
- NodesFD:再Master节点,启动NodeFaultDetection。定期探测加入集群的节点是否活跃。
- MasterFD:非Master节点启动MasterFauleDetection。定期探测Master节点是否活跃。
三、选举临时Master流程
1、获取当前集群活跃的Master列表
- 获取所有节点信息
- 遍历所有节点。如果是当前节点则跳过
- 判断
ignore_non_master_pings
是否为true
- ignore_non_master_pings:用于控制集群在选举master时的行为
- true:选主阶段将忽略不具备master资格的节点的ping请求(即
node.master:true
) - false: 默认值。代表选举过程中,所有的节点ping请求都会被考虑。直接返回节点信息
- 判断节点是否候选主节点
- false:结束
- true:返回节点信息
- 获取节点记录的Master信息,将其添加到activeMasters列表对象中
- activeMasters:存储当前集群活跃的master列表
- activeMasters:存储当前集群活跃的master列表
2、获取Master候选者列表与选主
- 便利所有节点
- 执行ping操作构建两个列表
- activeMasters:存储当前集群活跃的master列表
- masterCandidats:存储候选master的列表
- 选主
- activeMasters是否为空(从已知的Mastter中选择一个作为选举结果,取列表中ID值最小的节点)
- true: 从masterCandidates中选举
- false: 空activeMasters中选择最合适的作为master
- 从masterCandidates中选主(判断具备master节点的ID的值,取最小值节点作为master)
- 判断候选者是否足够
- 选择具体的节点作为Master
- activeMasters是否为空(从已知的Mastter中选择一个作为选举结果,取列表中ID值最小的节点)