zookeeper的ZAB算法

这个博客挺好的贴出来 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最大的那个。

        

猜你喜欢

转载自blog.csdn.net/u010191034/article/details/121376844