zookeeper的选举制度

本文介绍Zookeeper集群中首次选举Leader的过程,包括myid的作用及选举的具体步骤,并阐述非首次选举时考虑的三个关键因素:服务器ID、数据ID与逻辑时钟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首次选举

首次选举也就是整个集群服务器第一次启动的时候,怎么选举leader。
首先呢,我们需要关注一个标识字段 myid。这个字段在创建集群的时候需要给每个服都定义,相当于身份标识,并且是唯一的。
在zookeeper conf目录下的zoo.cfg配置文件中,
有一个字段dataDir, 这个dataDir表示的是,zookeeper数据快照存放地址。
需要在这个地址目录下面创建一个名称为myid的文件。并且在文件中写入id。对的没错,只需要写入一个id就行。
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just 
# example sakes.
//这个就是数据快照存放目录,需要在这个目录下面创建myid文件
dataDir=/usr/local/zkdata
# the port at which the clients will connect
clientPort=1280
server.1=192.168.187.128:1281:1282
server.2=192.168.187.129:1291:1292
server.3=192.168.187.130:1301:1302
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1

在这里插入图片描述
打开myid文件
在看到这里插入图片描述
选举流程:假设有三台服务器,A myid=1,B myid=2,C myid=3
步骤一:A服务器启动,首先会给自己投一票,然后发投票信息,由于其它机器还没有启动所以A无法接收到投票的反馈信息,因此A进入LOOKING状态这个时候服务是不可用的。
步骤二:B服务器启动,给自己投一票,这个时候集群中有2台机器,需要发起投票对比,B会与A交换投票结果,票数相同,那怎么办呢。那就对比myid,那个服务器的id字段比较大,那个就胜出。那明显B的id比较大,所以B胜出,并且A服务器将自己的那一票转投给B,根据zookeeper的选举规则,投票超过集群服务数量半数的就算胜出。那么B服务器成功晋级为leader。
那C呢,其实C启不启动不影响结果,因为选举规则超过半数就算胜出,B已经当选为leader。C启动只能是FOLLOWER,不会改变现状

下面演示一下选举过程,我准备了三台其机器;

IPmyid
192.168.187.1281
192.168.187.1292
192.168.187.1303

首先我启动128这台机器
服务 已经正常启动
服务已经正常启动,可以看到进程号,那我们查看下这台服务的状态。
在这里插入图片描述
看到了吗,是不可用的。因为配置文件中定义了集群有三台服务,目前就只启动了一台。
下面我们启动129这台
在这里插入图片描述
查看服务状态
在这里插入图片描述
129的服务正常启动,并且角色晋升为leader。
在看看128的状态:
在这里插入图片描述
可以看到呢,129没启动的时候服务是不可用的, 129启动后呢,角色变为了,follower.

下面呢,我们演示下,同时启三台服务吧。
在这里插入图片描述
allZK这个启动脚本,是我自己写的哈。不是zk自带的
服务一次启动,现在我们在看看各个服务器的角色
在这里插入图片描述

果然129晋升为leader. C的启动毫无影响,好了首次选举结束。

非首次选举

非首次选举,可以这么理解,集群运行过程中,leader宕机了。
这个时候在FOLLOWER服务器中,就得重新选举一个leader。
需要关注3个指标:
 1. 服务器ID,这是在配置集群时设置的myid参数文件,
 2. 数据ID, 可以理解为zxid,每次客户端的写请求,leader都会给本次请求分配一个全局事务ID,这个ID越大代表数据越新,在选举过程中的权重就越大。
 3. 逻辑时钟,通俗的讲可以理解为投票次数,每个服务器起始值为0,同一轮投票过程中逻辑时钟值是相同的,每投完一次票,这个数据会增加。如果某台服务器宕机,那么就不会参与本次投票,自然逻辑时钟值就比其它服务器小。

由于集群已经运行一段时间,那么服务器中就会存在运行的数据。下面讲解投票流程:
步骤1:首先统计逻辑时钟值是否相同,如果值小,那么说明某台服务器中途存在宕机,有可能数据不完整。那么这台服务器被剔除,重新投票选举。
步骤2:接下来对比数据ID,ID越大,证明执行的事务比较多,数据版本比较新,因此数据ID大的胜出。
步骤3:如果在逻辑时钟,数据ID都相同的情况下,那么还是老办法,对比myid,值大的胜出。
总结:那就是优中选优。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值