ZAB操作的顺序性

ZAB操作的顺序性

Content #

能保证操作顺序性的,基于主备模式的原子广播协议。

我还是以 X、Y 指令为例具体演示一下,帮助你更好理解为什么 ZAB 能实现操作的顺序性(为了演示方便,我们假设节点 A 为主节点,节点 B、C 为备份节点)。

首先,需要你注意的是,在 ZAB 中,写操作必须在主节点(比如节点 A)上执行。如果客户端访问的节点是备份节点(比如节点 B),它会将写请求转发给主节点。如图所示:

接着,当主节点接收到写请求后,它会基于写请求中的指令(也就是 X,Y),来创建一个提案(Proposal),并使用一个唯一的 ID 来标识这个提案。这里我说的唯一的 ID 就是指 事务标识符(Transaction ID,zxid)

在创建完提案之后,主节点会基于 TCP 协议,并按照顺序将提案广播到其他节点。这样就能保证先发送的消息,会先被收到,保证了消息接收的顺序性。

你看这张图,X 一定在 Y 之前到达节点 B、C。

然后,当主节点接收到指定提案的“大多数”的确认响应后,该提案将处于提交状态(Committed),主节点会通知备份节点提交该提案。

在这里,需要你注意的是,主节点提交提案是有顺序性的。主节点根据事务标识符大小,按照顺序提交提案,如果前一个提案未提交,此时主节点是不会提交后一个提案的。也就是说,指令 X 一定会在指令 Y 之前提交。

最后,主节点返回执行成功的响应给节点 B,节点 B 再转发给客户端。你看,这样我们就实现了操作的顺序性,保证了指令 X 一定在指令 Y 之前执行。

Viewpoints #

From #

15 | ZAB协议:如何实现操作的顺序性?