ZAB协议总结

 two-phase commit protocol,简称2PC协议,即两阶段提交协议。

zookeeper atomic broadcast protocol,简称ZAB协议,即zookeeper原子广播协议。

在zk中主要就是通过ZAB协议来实现分布式事务一致性。


实现原理:

Zookeeper 客户端应用程序会随机连接到 Zookeeper 集群的一个节点,

①如果是读请求,就直接从当前节点中读取数据返回客户端;

②如果是写请求,那么节点就会向 leader 提交事务,leader 会广播事务,只要有超过半数节点写入成功,该写请求就会被提交(类 2PC 协议,因为2pc协议是全部通过才提交,而ZAB协议只需要半数通过)


Follower的消息类型:

l   PING消息:是指Learner的心跳信息;

l   REQUEST消息:是Follower发送的提议信息,包括写请求及同步请求;

l   ACK消息:是 Follower的对来自leader的提议消息(PROPOSAL消息)的回复,超过半数的Follower通过,则commit该提议;

l   REVALIDATE消息:是用来延长SESSION有效时间。


Leader的消息类型:

l   PING消息: 心跳消息;

l   PROPOSAL消息:Leader发起的提案,要求Follower投票

l   COMMIT消息:服务器端最新一次提案的信息;

l   UPTODATE消息:表明同步完成;

l   REVALIDATE消息:根据Leader的REVALIDATE结果,关闭待revalidate的session还是允许其接受消息;

l   SYNC消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新。


ZAB协议工作过程:

第一阶段:Leader给所有的Follower发送一个PROPOSAL消息,一个Follower接收到这次PROPOSAL消息,写到磁盘,发送给Leader一个ACK消息,告知已经收到。

第二阶段:当Leader收到法定人数(quorum,半数以上)的FollowerACK时候,发送commit消息执行。


PROPOSAL消息事务ID(zxid)

为了保证事务的顺序一致性,ZooKeeper采用了递增的事务id号(Zxid)来标识事务。

所有的提议(Proposal)都在被提出的时候加上 了Zxid

实现中Zxid是一个64位的数字,它高32位是epoch用来标识Leader关系是否改变,每次一个Leader被选出来,它都会有一个 新的epoch,标识当前属于那个Leader的统治时期。低32位用于递增计数。


Zab协议保证:

(1)如果Leader以T1和T2的顺序广播,那么所有的follower必须先执行T1,再执行T2。

(2)如果任意一个follower以T1、T2的顺序commit执行,其他所有的follower也必须以T1、T2的顺序执行。


问题:

(1)Never forget delivered messages

LeaderCOMMIT消息投递到任何一台Follower之前crash,只有它自己commit了。新Leader必须保证这个事务也必须commit。

(2)Let go of messages that are skipped

Leader产生某个proposal消息,但是在crash之前,没有Follower看到这个proposal消息。该leader恢复时,必须丢弃这个proposal消息


Leader主要有三个功能:

1、恢复数据;

2、维持与follower的心跳,接收follower请求并判断follower的请求消息类型;


Follower主要有四个功能:

1、向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);

2、接收Leader消息并进行处理;

3、接收Client的请求,如果为写请求,发送给Leader进行投票;

4、返回Client结果。


ZAB协议总结



所有角色在工作过程中有四种状态:

l   LOOKING:当前Server不知道Leader是谁,正在搜寻

l   LEADING:当前Server即为选举出来的Leader

l   FOLLOWING:Leader已经选举出来,当前Server与之同步

l   OBSERVINGObserver的行为在大多数情况下与Follower完全一致,但是他们不参加选举和投票,而仅仅接受(observing)选举和投票的结果。


Zab协议有两种模式,分别是恢复模式(选主)广播模式(同步)

当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server(follower+observer)完成了和 Leader的状态同步以后,恢复模式就结束了。状态同步保证了Leader和Server(follower+observer)具有相同的系统状态.


选举出Leader节点后Zab进入原子广播阶段,即广播模式,这时Leader为和自己同步的每个节点Follower创建一个操作序列,一个时期一个Follower只能和一个Leader保持同步,Leader节点与Follower节点使用心跳检测来感知对方的存在

--当Leader节点在超时时间内收到来自Follower的心跳检测,那么Follower节点会一直与该节点保持连接,

--若超时时间内Leader没有接收到来自过半Follower节点的心跳检测或TCP连接断开,那Leader会结束当前周期的领导,切换到Looking状态,所有Follower节点也会放弃该Leader节点切换到Looking状态,然后开始新一轮选举