ZAB
最后更新于
这有帮助吗?
ZAB是Paxos的精简版,他称作 Zookeeper 原子广播协议。
原子:同时成功、同时失败
广播:分布式多节点广播,过半判定成功
最终一致性写入的流程如下:
客户端发送create命令到左侧Follower
因为是写请求,将会将请求转发给Leader处理
Leader接收到create请求后,首先创建一个事务id:Zxid
Leader紧接着对集群中的所有Follower进行广播
在每个Follower与Leader连接在Leader内部都有一个相应的发送队列,所有对Follower的请求都会放入到这个队列中,用于保证命令的顺序的、异步的执行
Leader会先向所有的Follower发送写磁盘日志的命令,而不是先向内存写入节点
如果Follower正常接受到Leader的命令并且处理正常,将会回复Leader一个ok响应
Leader判断Follower的相应是由有过半,如果过半,就判定通过
Leader紧接着推送所有Follower写请求(create ooxx
),通过放入队列的方式,Follower会慢慢消费队列中的数据,所以称zk是最终一致性的
Leader下发完所有write命令之后,Leader返回ok给目标Follower,Follower再返回给Client
特点:
不同于Paxos,Paxos的所有节点都可以写,而Zookeeper是主从模型,只有Leader可以进行写操作
图中右侧Client可能得到过时的数据,这是因为右侧的Follower还未消费完队列中的指令;客户端可以通过增加指令sync
获取实时的最新的数据
选举的条件和前提:
每一台Server都有自己的myid,标识他在集群中的唯一编号
拥有最全的数据的Server具有Leader选举权,如果Server的Zxid的值最大,说明他的数据最全
Zxid是已经通过投票过半的数据操作,是不可被怀疑的
如果多个Server之间的数据相同,论资排辈,谁的myid大谁就有优先选举权
选举场景1,第一次启动集群:
如果按照node01、node02、node04、node03的顺序启动集群
当启动数量达到3台时,才会触发选举,两台不会触发
因为是集群的第一次启动,所有Zxid都是初始值0
Zxid相同,所以会论资排辈,前三台启动的Server中,node04的myid最大,所以会选择node04作为集群中的Leader
如果在运行中node04这个Leader挂掉:
选举的流程全程都在3888端口进行
node04挂掉,node04将会与其他Server失去连接;node01、node02、node03任何一方都有可能先发现Leader宕机
假设node03先发现Leader宕机,node03会首先推选自己作为Leader。他将自己的myid以及zxid发送给其他Server。
其他Server收到node03的票后,先比较Zxid,发现Zxid比较小,将会直接淘汰node03的票,然后推选自己作为作为Leader,将自己的zxid以及myid发送给其他Server。
假设node02先推选自己,node03接收后比较zxid比自己大,获取一票;node01接受到后比较zxid相同,然后比较myid,发现myid比较自己的大,node01也会推选node02,node02获取三票。
此时node02的票数早已经过半,node02将会开启2888端口连接其他Server作为他的从节点。