zookeeper的选举机制

时间:2024-11-06 17:16:59

zk中有两种角色:Leader 和 Fllower

Leader是自己的集群各台电脑投票选举出来的。

事务:一通操作,要么同时成立,要么都不成立。

举例:Jack 和 Rose

Rose  给  Jack(小李子) 转钱
Rose  -100
Jack  +100
    如果中间数据有问题,直接回滚,回复到当初的样子
事务操作:新增,修改,删除等操作
非事务操作: 读数据

但凡跟数据相关的技术,都有事务。
mysql 有事务
jdbc 有事务
mybatis 有事务

zookeeper:

Leader


Zookeeper 集群工作的核心。

1、事务请求(写操作)的唯一调度和处理者,保证集群事务处理的顺序性;
举例 : 比如添加了一个节点,删除了节点,修改了数据 都是事务操作。
2、集群内部各个服务器的调度者。
3、对于 create, setData, delete 等有写操作的请求,需要统一转发给leader 处理, leader 需要决定编号、执行操作,这个过程称为一个事务。

类似于村长
Fllower



- 处理客户端非事务(读操作)请求,转发事务请求(写操作)给 Leader;
- 参与集群 Leader 选举投票 2n-1台可以做集群投票。  1 3 5 7 9 ....
- 此外,针对访问量比较大的 zookeeper 集群, 还可新增观察者角色。
类似于村民

Observer



- 观察者角色,观察 Zookeeper 集群的最新状态变化并将这些状态同步过来,其对于非事务请求可以进行独立处理,对于事务请求,则会转发给 Leader服务器进行处理。
- 不会参与任何形式的投票只提供非事务服务,通常用于在不影响集群事务处理能力的前提下提升集群的非事务处理能力。

类似于外来人员(喝汤了)

选举的关键,看这三个值

epoch > zxid > myid

先比较 epoch  谁大谁是领导  --资历
逻辑时钟  参与过的选举的次数   类似于老党员。

zxid   如果epoch 相等,就看谁的zxid大,谁就是领导
zxid   代表的是事务的次数  如果这个值很大,就表示这个机器上的数据比较的新
如果zxid 也相等,就看每台电脑上的myid了,如果myid谁大谁是领导。

如何查看epoch呢?
 

我现在的集群中,有三台zk,为什么第二台是领导?
    zk01 1
    zk02 2
    zk03 3
启动第一台,第一台开始选举,自己投自己一票,因为超过半数才有效,所以zk01不是领导,此时的状态是选举中。
启动第二台,先投自己一票,然后第一台开始投票,比较两者之间谁的myid大,谁的大,就投给谁,zk02再得一票,第二台两票,超过了半数,领导出现了zk02.
启动第三台:发现有领导了,投了吧,当fllower吧。