前面的文章我们稍微讲述了一下Paxos算法的理论和应用场景,以及结合ZooKeeper是怎么玩的,文章地址:https://blog.lucfzy.com/2021/04/04/paxos/

那么今天我们来看一个Paxos模型在Zookeeper中的具体实现:ZAB协议

定义

ZAB:ZooKeeper Atomic Broadcast。翻译过来:Zookeeper原子广播协议。顾名思义。

原子性

原子性不用多说,事务当中的第一特性就是原子性。

广播性

广播特性主要体现在,当我客户端发起一个写请求,那么就会从follower身上将这个写请求转发给leader,那么广播性体现在leader会将这个请求通过写日志的方式,转发给每一个follower,注意是每一个,所以称为广播,后面具体转发之后的做了什么,后面再说。

具体实现

上述提到了ZAB协议是Paxos的具体实现,那么在Paxos当中,最著名的当属二阶段递交,那么是怎么个二阶段法,又是如何递交的,我们一起来看。

二阶段递交

首先我们将二阶段递交这个名次进行初步拆分,第一个是二阶段。这个过程发生在,当我们的客户端Client提交了增,删,改的操作时,首先客户端连接的是我们的follower,那么follower发现这个不是读请求,就会将这个请求转发给leader,leader收到这个请求,开始运作。

第一阶段

leader会向所有的follower发起一个写请求,写的内容就是客户端期望的,比方客户端想写入一个数据,key是电费,value是1元1度电。那么这个请求就会写到所有的follower身上,并且每一个follower会针对这个请求做一个第一阶段的记录。言外之意,每个客户端看到了leader发来的消息,看了一下,哦知道了,这是要新增一条电费记录呀,我先记录一下,随后follower会给leader发送一个ok都请求回复。证明,我已经记录下这个请求了,可以做后续操作啦。

第二阶段

leader拿到了follower的操作,打个比方,我们现在有三台设备zk server,一台leader,两台follower,那么当leader收到了一台follower的回复时,此时的数据票数是3/2+1等于2且满足我们约定的过半即可生效的原则。那么leader知道,已经有一半的人收到了我的这个请求,那么接下来进行二阶段操作。leader会再次想follower发起请求,请求的内容是请把上次提交的记录,定下来吧,形成法案。那么此时,follower就再次修改本地记录的事务id号,该请求正式生效。

上面就是二阶段过程。

递交

哦不对,似乎还差了点东西,二阶段是讲过了,但是leader和每个follower又是如何通信的呢?这里啊,就要涉及到队列的事情。当leader收到了客户端请求的消息,并且leader和每个follower之间维护了一个消息队列。这个消息队列满足了先进先出FIFO的原则。即,当集群中有一个leader和两个follower的时候,那么在leader的内部就会维护两个消息队列,那么消息在递交的时候,会先放到队列里面,然后再发出去。这也就是我为什么要把递交这件事情,拆分出来说。


以上就是ZAB协议重要的二阶段递交过程哦。