首页 > 其他 > 详细

Leader选举

时间:2021-04-18 22:09:45      阅读:30      评论:0      收藏:0      [点我收藏+]

Leader的选举一般分为启动时选举跟Leader挂掉后的运行时选举

启动时选举

以5台机器为例,只有超过半数以上,即最少启动3台服务器,集群才能正常工作

  1. 服务器1启动,发起一次选举

服务器1投自己一票。此时服务器1票数一票,不够半数以上(3票),选举无法完成,服务器1状态保持为LOOKING。

  1. 服务器2启动,再发起一次选举

服务器1和2分别投自己一票,此时服务器1发现服务器2的id比自己大,更改选票投给服务器2。此时服务器1票数0票,服务器2票数2票,不够半数以上(3票),选举无法完成。服务器1,2状态保持LOOKING。

  1. 服务器3启动,发起一次选举

与上面过程一样,服务器1和2先投自己一票,然后因为服务器3id最大,两者更改选票投给为服务器3。此次投票结果:服务器1为0票,服务器2为0票,服务器3为3票。此时服务器3的票数已经超过半数(3票),服务器3当选Leader。服务器1,2更改状态为FOLLOWING,服务器3更改状态为LEADING;

  1. 服务器4启动,发起一次选举

此时服务器1、2、3已经不是LOOKING状态,不会更改选票信息,交换选票信息结果。服务器3为3票,服务器4为1票。此时服务器4服从多数,更改选票信息为服务器3,服务器4并更改状态为FOLLOWING。

  1. 服务器5启动,发起一次选举

同4一样投票给3,此时服务器3一共5票,服务器5为0票。服务器5并更改状态为FOLLOWING;

  1. 最终

Leader是服务器3,状态为LEADING。其余服务器是Follower,状态为FOLLOWING。

运行时Leader选举

运行时候如果Master节点崩溃了会走恢复模式,新Leader选出前会暂停对外服务,大致可以分为四个阶段 选举发现同步广播
选举步骤

  1. 每个Server会发出一个投票,第一次都是投自己,其中投票信息 = (myid,ZXID)
  2. 收集来自各个服务器的投票
  3. 处理投票并重新投票,处理逻辑:优先比较ZXID,然后比较myid
  4. 统计投票,只要超过半数的机器接收到同样的投票信息,就可以确定leader,注意epoch的增加跟同步。
  5. 改变服务器状态Looking变为Following或Leading。
  6. 当 Follower 链接上 Leader 之后,Leader 服务器会根据自己服务器上最后被提交的 ZXID 和 Follower 上的 ZXID 进行比对,比对结果要么回滚,要么和 Leader 同步,保证集群中各个节点的事务一致。
  7. 集群恢复到广播模式,开始接受客户端的写请求。

脑裂

脑裂问题(集群中出现不止一个master)是集群部署必须考虑的一点,比如在Hadoop跟Spark集群中。而ZAB为解决脑裂问题,要求集群内的节点数量为2N+1。当网络分裂后,始终有一个集群的节点数量过半数,而另一个节点数量小于N+1, 因为选举Leader需要过半数的节点同意,所以我们可以得出如下结论:

有了过半机制,对于一个Zookeeper集群,要么没有Leader,要没只有1个Leader,这样就避免了脑裂问题

Leader选举

原文:https://www.cnblogs.com/z-dk/p/14674394.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!