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,半数以上)的Follower的ACK时候,发送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
Leader在COMMIT消息投递到任何一台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结果。
所有角色在工作过程中有四种状态:
l LOOKING:当前Server不知道Leader是谁,正在搜寻
l LEADING:当前Server即为选举出来的Leader
l FOLLOWING:Leader已经选举出来,当前Server与之同步
l OBSERVING:Observer的行为在大多数情况下与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状态,然后开始新一轮选举。