【ElasticSearch】入门-ES的选主流程

一、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请求。
    • 节点失效
      • NodesFD:再Master节点,启动NodeFaultDetection。定期探测加入集群的节点是否活跃。
      • MasterFD:非Master节点启动MasterFauleDetection。定期探测Master节点是否活跃。
        image

三、选举临时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列表
      image

2、获取Master候选者列表与选主

  • 便利所有节点
  • 执行ping操作构建两个列表
    • activeMasters:存储当前集群活跃的master列表
    • masterCandidats:存储候选master的列表
  • 选主
    • activeMasters是否为空(从已知的Mastter中选择一个作为选举结果,取列表中ID值最小的节点)
      • true: 从masterCandidates中选举
      • false: 空activeMasters中选择最合适的作为master
    • 从masterCandidates中选主(判断具备master节点的ID的值,取最小值节点作为master)
      • 判断候选者是否足够
      • 选择具体的节点作为Master
        image
posted @   此木|西贝  阅读(760)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示