ZAB(ZooKeeper Atomic Brocadcast)协议,ZooKeeper原子广播协议,是一个分布式一致性算法,让ZooKeeper拥有了崩溃恢复和原子广播的能力,保证集群中的数据一致性。
上一篇文章介绍了CAP理论和BASE理论,ZAB协议是BASE理论的具体实现,是Paxos算法的变种实现。基于该协议,ZooKeeper实现了Master/Slave架构下集群各节点副本数据的最终一致性。
主要通过实现两种模式:
Zab 协议的特性:
简单而言,我们设计这个算法/协议的目的,就是保证客户端连接到任意的机器(leader/follower/observer)后,进行一定的数据操作申请,数据操作进行之后,需要让集群所有的机器都同步。
在正常的消息广播模式,ZooKeeper需要采取一定策略,来保证在分布式场景下事务的一致性。
这里的全局性事务ID zxid是leader生成的,
可以表示为一对整数(epoch,count):
/**
* 版本:ZooKeeper 3.8.0
* org.apache.zookeeper.server.util
* ZxidUtils.java
* 29行
*/
public static long makeZxid(long epoch, long counter) {
return (epoch << 32L) | (counter & 0xffffffffL);
}
可以看出,其数据结构为一个long类型的数字(64位):
举个银行的例子:
客户来银行存款:
这里注意:只要有一个节点完成了commit,那么就可以告诉client事务完成。(只要有一个业务员完成登记,就可以告诉客户钱整好了)
此时需要可以思考:
如果Leader把某个Proposal广播给所有Follwer之后宕机,数据该怎么处理?
数据应该丢弃,因为该条数据并没有commit,不需要(没这个义务)进行保留。
客户端直接从Follower或Observer读取数据,如果要确保读到最新数据,应该先调用sync()进行强制同步。
在leader崩溃后,或者集群中超过半数服务器和leader无法正常通信,需要采取一定的策略进行恢复。进行选主时,选的就是能力强,数据新的服务作为leader,之前的内容写过选主的策略:ZooKeeper 5:集群模式
在选主完成后,进行数据同步,将最新的消息传播给所有的服务。