第一次启动的情况
假设zookeeper集群中有5台服务器,那么想要成为leader需要半数以上的选票(3票),每一个服务器都有一个选票,服务器会先把选票投给自己
过程1–服务器1投自己一票,此时服务器1只有一票,不够3票,选举没有完成,服务器1状态为looking
过程2–服务器2投自己一票并与服务器1交换选票信息,服务器1发现服务器2的myid比自己目前推举的(服务器1)号数更大,服务器1即更改推举服务器2.此时服务器没有票数,服务器2有2票,不够三票,服务器1与服务器2状态为looking
过程3–服务器3投自己一票并与前两台服务器交换选票信息,服务器2与服务器1发现服务器3的myid比自己目前推举的(服务器2)号数更大,服务器2即更改推举服务器3.此时服务器3达到3票,服务器1,2状态变为following,服务器3状态变为leading
一旦集群中产生了leder,选举就结束了,服务器4与服务器5启动后直接进入following状态
非第一次启动的情况
当服务器运行期间无法和leader保持连接时,开始进行leader选举
当一台服务器进行leader选举时会出现两种情况:
1.集群中本来就有一个leader
服务器尝试选举leader时,会被其他服务器告知当前服务器的leader信息,对于该机器,只需要尝试与leader连接直到连接上,并进行状态同步
2.集群确实不存在leader
SID:服务器id,用来唯一标识一台zookeeper集群中的机器,和myid一致
ZXID:事务id,用来标识依次服务器状态的变更。摩一世可,集群中的服务器的ZXID的值并不一定一致
Epoch:每个leader任期的代号。meiyouleader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票数据就会增加
假设zookeeper由5台服务器组成,SID为1,2,3,4,5,zxid分别为3,3,4,4,3,Epoch默认为1,SID为3的服务器为leader,此时,SID为3和4的服务器崩了,开始进行选举
EPOCH | ZXID | SID | |
---|---|---|---|
1 | 1 | 3 | 1 |
2 | 1 | 3 | 2 |
5 | 1 | 3 | 5 |
如果比较内容相同,就对比下一项内容
1)Epoch大的选出
2)ZXID大的胜出
3)SID大的胜出
最终,该例子由5号服务器当选