zookeeper中的ZAB协议

zookeeper中的ZAB协议

文章内容来源于以下文章

集群角色

Leader:同一时间集群总只允许有一个Leader,提供对客户端的读写功能,负责将数据同步至各个节点
Follower:提供对客户端读功能,写请求则转发给Leader处理,当Leader崩溃失联后参与Leader选举
Observer:与Follower不同的是不参与Leader选举

服务状态

LOOKING:集群中没有Leader时的状态,此状态下可以选举Leader
FOLLOWER:follower角色的状态
LEADER:leader角色的状态
OBSERVER:observer角色状态

ZAB协议

概念:ZAB(Zookeeper Atomic Broadcast),zookeeper原子广播协议,为了保证zookeeper集群的分布式一致性。
原理:ZAB协议要求Leader都要经历三个阶段:发现、同步、广播

发现:zookeeper集群选举Leader的过程,同时Leader会维护一个Follower可用客户端列表,将来客户端可以和这些Follower节点进行通信。

同步:Leader需要将本身的数据与Follower进行同步,做到多副本存储。这样也体现了CAP中的高可用和分区容错性。

广播:Leader可以接受客户端新的事物Proposal请求,然后将这些Proposal请求广播给所有的Follower。

核心:定义事务请求的处理方式

1、必须存在一个唯一的Leader服务器,用来处理所有的事务请求,其他的服务器是Follower服务器

2、Leader负责将客户端的事务请求转换成Proposal,并将Proposal分发给集群中所有的Follower服务器,也就是向所有的Follower服务器进行广播请求。

3、分发结束之后Leader需要等待所有的Follower服务器反馈,只有超过半数的Follower服务器进行了正确的反馈,Leader服务器才会向所有的Follower发送commit消息,并要求将该事务Proposal进行提交。

内容:ZAB协议包括两种基本模式,崩溃恢复和消息广播

崩溃恢复:当整个集群Leader服务器出现网络中断、或者重启异常时,ZAB协议就会进入崩溃回复阶段,选举产生新的Leader。崩溃恢复包括两部分:Leader选举和数据恢复

消息广播:新的Leader选举成功之后,居群中有过半的Follower与Leader完成了数据同步,则ZAB协议就会退出崩溃回复模式,进入消息广播模式。在消息广播模式中Leader等待Follower的ACK反馈消息是指只要半数以上的Follower成功反馈即可,不需要收到全部Follower反馈。

img

实现步骤:

消息广播具体步骤:
1、客户端发起写操作请求

​ 2、Leader服务器将客户端的写操作请求转换为事务Proposal提案,同时为每个Propsal分配一个全局的Id,即zxid

3、Leader服务器为每个Follower服务器分配一个单独的队列,然后将需要广播的Proposal一次放到队列中,并且根据FIFO策略进行消息发送

4、Follower收到Proposal后,首先将其以事务日志的方式写入本地磁盘中,写入成功后向Leader反馈一个ACK响应消息

5、Leader接受到超过半数以上的Follower的ACK消息后,即认为消息发送成功,可以发送commit消息

6、Leader向所有Follower广播commit消息,同时自身也会完成事务提交。Follower接收到commit消息后,会将上一条事务提交。

zookeeper采用ZAB协议的核心,就是只要有一台服务器提交了Proposal,就要确保所有的服务器最终都能正确提交Proposal。

Leader服务器与每个Follower服务器之间都维护了一个单独的FIFO消息队列进行收发消息,使用队列消息可以做到异步解耦。

你可能感兴趣的:(进阶学习-zk,dubbo,kafka,k8s,docker,分布式,java,zookeeper)