by shihang.mai
1. 概念
ZAB是zookeeper原子广播意思,并且它paxos协议的变种,关于paxos参考博客
https://www.cnblogs.com/syq816/p/12465991.html
2. 协议详解
2.1 leader存在
zookeeper的ZAB- Client连接follower,发送create ooxx节点
- follower转发到leader
- leader事务id递增,zxid=8
- leader维护每个follower的一个队列,通过广播方式向队列中发送一个"创建节点的log"
- follower写日志到磁盘,返回一个ok给leader。(某些follower可能存在网络波动,延迟返回ok)
- 如上图一个follower和leader已经ok(leader自身一票),过半了,那么再次通过广播方式向队列中发送一个"write",write意思是叫follower向自身内存创建节点
- follower在自身内存创建节点,返回ok给leader.(所有follower最终一直性)
- leader返回给发出请求的follower一个over-ok,follower再返回给Client ok
2.2 leader不存在
新leader选择方式依据以下原则
- zxid最大的
- 当zxid一样,选择myid最大的
2.2.1 第一次启动集群
zk集群-第一次启动选leader- 4台机器,过半就是3台
- 无论哪3台机器启动,必须等到第3台启动,建立了两两连接,它们才可以将票投出去,选leader。
- 例如启动node1,node2,node4,那么4当选leader。zxid一样,myid大当选
2.2.2 leader挂了,重启集群
zk集群-重选leader或重启集群原leader,node4挂了
- 如果每个人都发现了leader挂了,那直接亮出自己的zxid和myid即可快速选出leader
- 现在只有node3知道
- 首先节点间通过3888端口两两通讯
- node3分别向node2和node1发起投票,而node2和node1收到后,回绝并自己也发起投票.
- 最终node2成为leader
只要任何人发生投票,都会触发那个准leader发起自己的投票
网友评论