Zookeeper 集群中是怎样选举leader的

zookeeper集群中服务器被划分为以下四种状态:

  • LOOKING:寻找Leader状态。处于该状态的服务器会认为集群中没有Leader,需要进行Leader选举;
  • FOLLOWING:跟随着状态,说明当前服务器角色为Follower;
  • LEADING:领导者状态,表明当前服务器角色为Leader;
  • OBSERVING:观察者状态,表明当前服务器角色为Observer。

Leader选举的触发时机

  • 集群启动,这个时候需要选举出新的Leader;
  • Leader服务器宕机;

第一次启动Leader选举

假设想在的有三台机器搭建集群:

  1. 每个Server发出一个投票投给自己。当server1启动的时候,为Looking状态,对应的myid记为1,ZXID为0,他先投自己一票,此时他的投票为(1,0);然后需要把自己的选票发给集群中的其他机器。
  2. server2这个时候也启动了,也是Looking状态,也先投自己一票,也就是(2,0),然后需要把自己的选票发给集群中的其他机器。
  3. 接受来自各个服务器的投票。集群的每个服务器收到投票后,首先判断该投票是否有效,如检查是否是本轮投票、是否来自LOOKING状态的服务器;
  4. 处理投票。针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK,PK的规则如下:
  5. 优先检查ZXID。ZXID比较大的服务器优先作为Leader;
  6. 如果ZXID相同,那么就比较myid。myid较大的服务器作为Leader服务器。

对于Server1而言,它的投票是(1, 0),接收Server2的投票为(2, 0),首先会比较两者的ZXID,均为0,再比较myid,此时Server2的myid最大,于是更新自己的投票为(2, 0),然后重新投票,对于Server2而言,其无须更新自己的投票,只是再次向集群中所有机器发出上一次投票信息即可。

  1. 统计投票。每次投票后,服务器都会统计投票信息,判断是否已经过半机器接收到相同的投票信息,对于Server1、Server2而言,都统计出集群中已经有两台机器接受了(2, 0)的投票信息,此时便认为已经选出了Leader。
  2. 改变服务器状态。一旦确定了Leader,每个服务器都会更新自己的状态,如果是Follower,那么就变更为FOLLOWING,如果是Leader,就变更为LEADING。
  3. 这个时候Server3启动了, 发现集群中已经有了Leader,就建立连接并把自己的状态置为Following。

非第一次启动Leader选举

在zookeeper运行期间,即便有新服务器加入,也不会影响到Leader,新加入的服务器会将原有的Leader服务器视为Leader,进行同步。但是一旦Leader宕机了,那么整个集群就将暂停对外服务,进行新一轮Leader的选举,其过程和启动时期的Leader选举过程基本一致。假设正在运行的有Server1、Server2、Server3三台服务器,当前Leader是Server2,若某一时刻Leader挂了,此时便开始Leader选举。这里我们假设server3为原本的Leader,其余四台均为Follower,某一时刻server3和server5都宕机了,那么选举过程如下:

  1. 变更状态。Leader宕机后,余下的非Observer服务器都会将自己的服务器状态变更为LOOKING,然后开始进行Leader选举流程;
  2. 每个Server会发出一个投票。在这个过程中,需要生成投票信息(Epoch,ZXID,myid),对应的server1,server2,server4的选票信息如上图,;其中Leader选举的规则是
  3. EPOCH大的直接胜出
  4. EPOCH相同,事务大的胜出
  5. 事务ID相同,服务器ID大的胜出

之后各个Looking状态的服务器会交换信息,最终会多数选举server4,也就更改为(1,120,4)的选票信息。

  1. 接收来自各个服务器的投票。与启动时过程相同;
  2. 处理投票;
  3. 统计投票;
  4. 改变服务器的状态,此时server4成为新的Leader。
相关推荐
掘根1 小时前
【jsonRpc项目】发布/订阅模块
github
weixin_462446232 小时前
Git 本地忽略 application-dev.yml 的最佳实践:不提交 .gitignore,不影响团队协作!
git
森之鸟4 小时前
2026年AI编程工具全景图:GitHub Copilot vs Cursor vs Codeium,我如何选择?
github·copilot·ai编程
wAIxiSeu6 小时前
Github开源项目推荐
开源·github
无限进步_9 小时前
面试题 02.02. 返回倒数第 k 个节点 - 题解与详细分析
c语言·开发语言·数据结构·git·链表·github·visual studio
CoderJia程序员甲9 小时前
GitHub 热榜项目 - 日榜(2026-01-31)
ai·开源·大模型·github·ai教程
2401_859049089 小时前
git submodule update --init --recursive无法拉取解决
前端·chrome·git
AC赳赳老秦11 小时前
外文文献精读:DeepSeek翻译并解析顶会论文核心技术要点
前端·flutter·zookeeper·自动化·rabbitmq·prometheus·deepseek
飞乐鸟13 小时前
Github 16.8k Star!推荐一款开源的高性能分布式对象存储系统!
分布式·开源·github
是店小二呀13 小时前
Git 深度学习笔记:从初始化到核心操作机制解析
笔记·git