zk中使用zab协议来保证数据一致性

谁说我不能喝 提交于 2019-12-05 19:18:31

1zab能够保证一个全局的变更序列被顺序应用

 

2zab协议包含两个模式:

崩溃恢复

消息广播

Zab协议必须设计这样一个选举算法:能够确保提交已经被leader提交的事务proposal,同时丢弃被跳过的事务Proposal

 

数据同步

所有运行服务器,要不成为leader,要不成为follower和leader进行同步

在zab协议的事务编号zxid,是一个64位数字,低32位是一个简单的单调递增计数器,高32位是代表leader周期epoch的编号

 

 

 

zab系统模型

进程组,状态有up状态,也有down状态,当集群中存在过半up状态组成的进行后,就可以进行正常的消息广播了

使用pi,pj分别表示进程组[]中两个不同进程,使用cij表示进程pi和pj之间的网络通信通道,满足如下两个基本条件

完整性

如何进程pj收到了来自pi的消息m,那么进程pi一定确实发送了消息m

 

前置性,

如果进程pj收到了消息m,那么存在这样的消息m`,如果m`是m的前置消息,那么pj务必先接收到消息m`,然后再接收到m,这样才能保证消息的顺序

 

主进程周期

为了保证每次广播出来的消息是一致的,必须确保zab协议只有在充分完成崩溃恢复阶段之后,新的主进程才可以开始生成新的事务消息广播。

 

事务,

各个进程都存在一个类似于transactions(v,z)这样的函数调用,来实现主进程对状态变更的广播,v表示事务内容,z表示事务标识,新旧事务id存在两种情况,不同事务周期epoch(z)<epoch(z') . 不同事务周期相同事务周期epoch(z)=epoch(z')且counter(z)<counter(z`)

 

zab协议包括两个过程,消息广播和崩溃恢复两个过程,细分成三个阶段,分别是发现,同步和广播

,将这一个循环称为一个主进程周期

1发现

leader选举过程,选举主进程,Leader F和Follower F工作流程如下:

F.1.1 Follower F将自己最后接受的事务proposal的epoch值 CEPOCH(Fp)发送给Leader L

L.1.1 接收来自过半Follower的 CEPOCH(Fp)消息后,准Leader L会生成NEWEPOCH(e')给过半Follower,

关于这个epoch值e',准leader L会从接收的所有CEPOCH(Fp)消息中选取最大的epoch值,然后进行加1操作,即为e'

 

F.1.2 Follower接收来自准Leader L的NEWEPOCH(e')消息后,如果检测到当前的CEPOCH(Fp)值小于e',将CEPOCH(Fp)赋值为e',同时向准Leader L反馈 Ack消息,反馈消息(ACK-E(Fp,hf))中,包含当前Follower的epoch CEPOCH(Fp),以及该Follower历史事务Proposal集合:hf

 

 

当leader L接收到来自过半Follower的确认ack消息后,Leader L就会从过半服务器列表中选取出一个follower F ,使其作为初始化事务集合Ie'.

 

关于这个 Follower F的选择,它对于Quorum中其他任意一个Follower F',F需要满足以下两个条件中一个:

CEPOCH(F'p)<CEPOCH(Fp)

(CEPOCH(F'p)=CEPOCH(Fp))&(F'zxid滞后于Fzxid或F'zxid=Fzixd)

上面描述了发现这一个阶段的相关事宜

 

同步阶段

Leader L 和Follower F之间的交互流程:

 

L.2.1 leader L会将e'和le'以 NEWLEADER(e',ie') 消息发送给quorum中的follower;

F.2.1 Follower 接收到来自Leader L的NEWLEADER(e',le')消息后,如果Follower 发现CEPOCH(Fp)不等于e',那么直接进入下一轮循环,follower发现自己在上一轮 ,或者更上一轮,无法参与本轮的同步

 

如果CEPOCH(Fp)=e',那么follower 会执行事务应用操作,

L.2.2当leader接收来自过半follower针对newLeader(e',ie')的反馈后,就会向所有follower发送commit消息

F.2.2 当Follower收到来自leader中Commit消息后,依次处理并提交所有在ie'中未处理的事务

第二阶段 同步完成

 

开始第三阶段处理 广播

L.3.1 Leader L接收到客户端新的事务请求后,就会生成对应的事务proposal,并根据zxid的顺序向所有follower发送提案<e',<v,z>>其中epoch(z)=e'

F.3.1 Follower根据消息接收的先后次序来处理来自leader的事务proposal,并将它们追加到hf中,再反馈给leader.

 

F.3.2 当Follower F接收来自leader的commit<e',<v,z>>消息后,就会开始提交事务Proposal<e',<v,z>>.此时Follower F 必定已经提交了事务Proposal<v',z'>

 

运行过程中会一致运行阶段三进行消息广播过程,如果出现了Leader崩溃或其他原因导致leader缺失,那么会进入阶段一,重新选举新leader

 

zab协议三个阶段描述如下

在zab协议运行过程中,每个进程都会在leading,following 和looking状态之间不断转换

 

我们将可用leader定义如下:

如果一个准leader le接收来自过半的Follower进程针对le的NEWLEADER(e,le)反馈消息,那么le就成为周期e的leader

如果在指定超时时间内leader无法从过半服务器获取心跳信息,或者tcp本身断开了连接,那么leader就会终止当前领导周期,转换到looking状态,所有的follower也会放弃当前这个leader,之后follower进入新一轮的leader选举

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!