面试题:谈谈什么是Zab协议?

1,382 阅读3分钟
原创: 咖啡牧羊人 咖啡牧羊人
今天

面试官:看到你简历说熟悉zookeeper,那请你详细谈谈什么是zab协议?

小宏:我公司的dubbo用到zoopkeeper作为注册中心,zab协议不太了解。

面试官:没事,你先回家等通知吧。

小明:zab协议是zookeeper专门设计的支持崩溃恢复的原子广播协议。目的是实现分布式zoopkeeper各个节点数据一致性。

面试官:那你继续说说zab怎么实现分布式数据一致性的?

小明:zab协议约定zk节点有两种角色leader和follower,zk客户端会随机的链接到 zookeeper 集群中的一个节点,如果是读请求,就直接从当前节点中读取数据;如果是写请求,那么节点就会向 Leader 提交事务,Leader 接收到事务提交,会广播该事务,只要超过半数节点写入成功,该事务就会被提交。另外,Zookeeper是一个树形结构,具有顺序性很多操作都要先检查才能确定是否可以执行,比如P1的事务t1可能是创建节点"/a",t2可能是创建节点"/a/b",只有先创建了父节点"/a",才能创建子节点"/a/b"。

为了实现这一点,Zab协议要保证同一个Leader发起的事务要按顺序被执行,同时还要保证只有先前Leader的事务被执行之后,新选举出来的Leader才能再次发起事务

面试官:好的,非常好,刚刚你说的leader是不是只有一个。

小明:是的,只有一个,其余zk节点为follower

面试官:那这个leader节点突然宕机了,怎么办呢?

小明:如果leader宕机了会重新选举出一个新的zk节点作为leader

面试官:那选举新leader的算法是什么?

小明:那我举个例子来说明吧,假如当前有zk1,zk2,zk3,三个节点组成一个集群,现在zk3节点挂了。

1、首先zk1和zk2都会将自己作为Leader服务器来进行投票,每次投票会包含所推举的服务器的myid和ZXID,使用(myid, ZXID)来表示,假设此时ZK1的投票为(1, 1),ZK2的投票为(2, 1),然后各自将这个投票发给集群中其他机器

2、各服务器接收到投票之后会进行进行检查,如检查是否是本轮投票、是否来自LOOKING状态的服务器

3、开始处理投票,服务器都需要将别人的投票和自己的myid和zxid进行比较,规则是优先检查ZXID。ZXID比较大的服务器优先作为Leader。 如果ZXID相同,那么就比较myid。myid较大的服务器作为Leader服务器,在例子很明显zk2,会成为新的leader。

面试官:好的,那重新投票选举leader怎么保证数据不会丢失。

小明:我们都知道,zk是cp的,不一定保证可用性,在选举的过程中,不能对外提供服务。但在选举的过程中,首先选zxid(zk的事务ID)最大的为leader,zxid最大,表示数据是最新的,然后广播给folower,这样避免数据丢失。

面试官:你什么时候能来上班?

欢迎关注