所有事务请求必须由一个全局唯一的服务器来协调处理,这样的服务器被成为Leader服务器,而余下的服务器则成为Follower服务器.
Leader服务器负责将一个客户端请求转换成一个事务Proposal(提议),并分发给所有的Follower服务器.之后Leader服务器需要等待所有Follower服务器的反馈,一旦超过半数的Follower进行了正确反馈后,那么Leader就会向所有的Follower服务器分发commit消息,要求将前一个Proposal进行提交
整个ZAB协议主要包括消息广播和崩溃恢复两个过程,进一步可以分为三个阶段,分别是:
- 发现
Discovery
- 同步
Synchronization
- 广播
Broadcast
组成ZAB协议的每一个分布式进程,都会循环执行这三个阶段,将这样一个循环称为一个主进程周期。
整个服务框架在启动过程中
Leader服务器出现网络中断、崩溃退出与重启等异常情况
ZAB协议就会进入崩溃恢复模式,选举新的Leader服务器。当选举产生新的Leader服务器,同时集群中已有过半的机器与该Leader完成了状态同步之后,ZAB就会退出恢复模式
状态同步是指数据同步,用来保证集群有过半的机器能够和Leader服务器数据状态保持一致。
集群中有过半的Follower和Leader完成了状态同步,那么服务框架就可以进入消息广播模式。
新加入一台机器
当一台遵守ZAB协议的服务器启动后加入到集群中,如果此时集群中已经存在一个Leader服务器在负责进行消息广播,那么新加入的服务器会自觉进入数据恢复模式:
找到Leader所在的服务器,与其进行数据同步,然后一起参与到消息广播流程中。
Leader服务器
Leader在收到客户端的事务请求后,会生成对应的Proposal并发起一轮广播协议;而如果集群中其他机器接收到客户端的事务请求,那么这些非Leader服务器首先会将这个事务请求转发给Leader服务器。
消息广播 –> 崩溃恢复模式
(Leader服务器出现崩溃退出或机器重启,亦或时集群中已经不存在过半的服务器与Leader正常通信)
这种情况下,在开始新一轮的原子广播事务之前,所有进程需要使用崩溃恢复协议来让彼此达到一致的状态,于是ZAB的流程就会从消息广播模式进入到崩溃恢复模式。
选举Leader
一个进程要成为新的Leader,必须获得过半的支持。进入崩溃恢复模式后,只要集群中存在过半的机器能够彼此通信,那么就可以产生一个新的Leader,进入消息广播模式
例子:
一个由3台机器组成的ZAB服务,通常由一个Leader,2个Follower组成。某一个时刻,其中一个Follower服务器挂了,整个ZAB不会中断服务,因为Leader服务器依然能够获取过半机器(包括自己)的支持