消息广播的实现原理

如果大家了解分布式事务的2pc和3pc协议的话(不了解也没关系,我们后面会讲),消息广播的过程实际上是一个简化版本的二阶段提交过程

1. leader接收到消息请求后,将消息赋予一个全局唯一的64位自增id,叫:zxid,通过zxid的大小比较既可以实现因果有序这个特征

2. leader为每个follower准备了一个FIFO队列(通过TCP协议来实现,以实现了全局有序这一个特点)将带有zxid的消息作为一个提案(proposal)分发给所有的follower

3. 当follower接收到proposal,先把proposal写到磁盘,写入成功以后再向leader回复一个ack 

4. 当leader接收到合法数量(超过半数节点)的ACK后,leader就会向这些follower发送commit命令,同时会在本地执行该消息

5. 当follower收到消息的commit命令以后,会提交该消息

ps: 和完整的2pc事务不一样的地方在于,zab协议不能终止事务,follower节点要么ACK给leader,要么抛弃leader,只需要保证过半数的节点响应这个消息并提交了即可,虽然在某一个时刻follower节点和leader节点的状态会不一致,但是也是这个特性提升了集群的整体性能。 当然这种数据不一致的问题,zab协议提供了一种恢复模式来进行数据恢复,后续讲解

这里需要注意的是:

leader的投票过程,不需要Observer的ack,也就是Observer不需要参与投票过程,但是Observer必须要同步Leader的数据从而在处理请求的时候保证数据的一致性

猜你喜欢

转载自blog.csdn.net/Leon_Jinhai_Sun/article/details/112853689
今日推荐