为了保持整个集群的内部实时通信,同事也为了确保可以控制所有follower/observer服务器, leader服务器会与每个follower/observer服务器建立一个tcp长连接,同时也会为每个follower/observer创建一个名为learnerhandler的实体.
LearnerHandler,是zk集群中learner服务器的管理器, 主要负责follower/observer服务器和leader服务器之间的一系列网络通信, 包括数据同步,请求转发和proposal提议的投票.leader服务器中保存了所有的follower/observer对应的learnerhandler.
常见的消息类型
包含REQUEST,PROPOSAL,ACK,COMMIT,INFORM,SYNC
REQUEST,
发送方:learner,接收方:leader
说明: 在zk中,所有的事务请求必须由leader服务器来处理, 当leader服务器接收到客户端事务请求后, 就会将请求以request消息的形式转发给leader服务器处理.
PROPOSAL
发送方:leader,接收方:follower
说明:该消息是zk实现ZAB算法核心所在, 即ZAB协议中的提议.在处理事务请求时,leader服务器会将事务请求以proposal消息的形式创建投票发送给集群中的所有follower服务器进行事务日志记录.
ACK
发送方: follower,接收方:leader
说明:follower服务器在接收到来自leader的proposal消息后, 会进行事务日志记录.如果完成了事务日志记录, 则就会以ACK消息的形式反馈给Leader
COMMIT
发送方:leader,接收方:follower
说明:该消息用于通知集群中所有的follower服务器,可以进行事务请求的提交了.leader服务器在接受到过半的follower服务器发送的ack消息后, 就进入事务请求的最终提交流程--生成commit消息,告知所有的follower服务器进行事务的提交.
inform
发送方:leader接收方:observer
说明:在事务提交阶段,针对follower服务器, leader仅仅只需要发送一个commit消息,follower服务器就可以完成事务请求的提交了, 因为在这之前的事务请求投票阶段, follower已经接收到了proposal消息,该消息包含了事务请求的内容,因此follower可以从之前的proposal缓存中再次获取事务请求.对于observer来说, 由于之前没有参加投票,因此并没有事务上下文,inform消息不仅能够通知observer已经可以提交事务请求, 同时还会在消息中携带事务的具体内容.
sync
发送方:leader,接收方:learner
说明:该消息用于通知learner服务器已经完成了sync操作
参考:从paxos到zookeeper分布式一致性原理