前面的文章我们稍微讲述了一下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协议重要的**二阶段递交**过程哦。
ZAB-ZooKeeper原子广播协议