ZooKeeper选举机制原理初探

30 篇文章 0 订阅

ZooKeeper的三个核心选举原则:

(1) Zookeeper集群中只有半数以上的服务器启动,集群才能正常工作(等于半数也不行,因此ZooKeeper集群的服务器最好是奇数台)

(2) 在集群正常工作之前,myid小的服务器给myid大的服务器投票,直到集群正常工作,选出Leader

(3)选出Leader之后,之前的服务器状态由Looking改变为Following,以后的服务器都是Follower

举个例子

我这里有三台服务器:centos01centos02centos03

这三台服务器上的ZooKeeper的myid分别为123

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

接下来进行演示:(注意看我用ssh命令切换到哪个服务器进行的操作)
在这里插入图片描述

接下来解释原因:

  1. 首先启动myid为1centos01上的ZooKeeper,发起一次选举,centos01先投自己一票,但是由于此时只有一台服务器启动,centos01票数为1,不够半数(这里为2票),选举无法完成;centos01的状态为looking,并且如果此时你用status命令检查centos01的zk的状态,他会返回一条信息Error contacting service. It is probably not running.
  2. 接着启动myid为2centos02上的ZooKeeper,发起一次选举,centos01centos02都先分别投自己一票,接着centos01发现centos02的myid比自己的大,于是更改自己的选票,改投给centos02;此时centos02就有了2票,达到了集群的半数要求,centos02此时直接变为leader,centos01的状态也由looking转换为了follower
  3. 接着启动myid为3centos03上的ZooKeeper,即便centos03的myid大于centos02上的myid,但是由于centos02已经确定为leader,因此不会再次举行选举,centos03直接变为follower
  4. 接下来我们停掉作为leader的centos02,由于leader消失,ZooKeeper集群会进行重新选举,存活的centos01centos03分别投给自己一票,接着centos01发现centos03的myid比自己的大,于是更改自己的选票,改投给centos03,此时centos03就有了2票,达到了集群的半数要求,centos03因此变为leader,centos01依旧为follower
  5. 此时如果再停掉followercentos01,整个集群只剩下了一台centos03,并且由于此时集群只有一台服务器存活,达不到半数要求,centos03自动失去leader地位变为looking状态,此时你用status命令检查centos03的zk的状态,他也会返回Error contacting service. It is probably not running.

如何自己指定leader

上面的例子里面,无论我们怎么启动停止随便切换,myid为1的centos01都几乎不可能成为leader,因为他的myid最小。即便当前集群的leader断掉,那么另外一个follower会成为leader,因为二次选举时他的myid值也比centos01大,centos01只得把票投给“对手”

若想要centos01成功“逆袭”当上leader,那么就需要更改他们的myid值以及zoo.cfg配置文件的server.id值

当前我的三台服务器对应如下:

服务器myid
centos011
centos022
centos033

zoo.cfg配置文件如下:

在这里插入图片描述

接下来如果我们将三台服务器的myid对调:

服务器myid
centos013
centos022
centos031

并且修改三台服务器上的zoo.cfg配置文件:

在这里插入图片描述

那么结果可想而知:centos03将几乎永远无法成为leader

此时按顺序依次启动centos01centos02centos03再查看他们的状态:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到,centos01已经变成了leader

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值