这个博客挺好的贴出来 ZAB协议 - 技术-刘腾飞 - 博客园
介绍:
ZAB算法,原子广播协议,zk用于解决分布式系统数据一致性问题。
ZAB协议中主要有两种模式,第一是消息广播模式;第二是崩溃恢复模式
消息广播:
角色:1 zk客户端(client) 2 (从) Follower 3 (主) leader
写入操作
1 客户端写操作发给从
2 从把写操作发给主
3 主给这个操作zid :例如是8
4 主给从发log 写入日志(持久化),zk的目录树是在内存中,从写入log是写到硬盘中,发送给从的请求都是有序的(队列)
5 从回复主 只要过半回复(过半同意,主也算一票)
6 主 发送 写消息 给从,通知写入ok
7 从回复主OK
读取操作
1 客户端请求从节点进行读取
2 从节点进行sync操作,想主节点获取客户端需要读的最新数据
3 从节点返回客户端
注:sync可选,如果不sync同步读取主操作,从节点数据可能不是最新的
崩溃恢复:
选举关键数据
1 先看zxid 事务id 最高的
2 myid 服务器自己的id
选举过程
1 集群启动的情况
启动的过程中超过3台的时候选 myid最大的(最后一个启动的)为主
2 崩溃恢复选主
1 主挂了
2 从节点心跳发现主挂了
3 发现挂的从节点会 给其他人 通过链接 发起投票(发送当前节点的事务id和myid)
4 收到投票的从节点会判断,如果自己的事务id高,把自己的(事务id和myid)广播回去 给自己投票。
5 然后第一个从节点没拿到过半投票
6 第二个从节点发起投票后,大家都把票投给了他,第二个从节点获得投票
场景理解:任意个从节点A发起投票,广播自己的事务id和myid,其他从节点收到后,对比自己的事务id和myid,如果不如A节点大就头他,如果比A大就自己发起投票广播,最后拿到过半票的肯定是事务id和myid最大的那个。