咱们对Raft协议已经进行了原理的解析,接下去咱们从通过SOFAJRaft 框架的核心流程剖析加深对Raft协议的理解。SOFAJRaft 是一个纯 Java 的 Raft 算法实现库, 基于百度 braft 实现而来, 使用 Java 重写了所有功能, 支持:
额外扩展了一些功能:
整体项目如下:
- 领袖选举 -
整体流程如下:
使用预投票可以防止网络抖动等特殊原因引起的瞬时失联节点无故捣乱:候选者在发起投票之前,先发起预投票,如果没有得到半数以上节点的反馈,则候选者就会识趣的放弃参选,也就不会抬升全局的 Term。
投票源码:
预投票源码:
- 存储机制 -
SOFAJRaft 存储模块分为:
LogManager 调用日志存储 LogStorage 实现逻辑:
SnapshotExecutor 状态机快照和远程安装镜像实现逻辑:
- 一致性状态机 -
通过存储的设计,在引入状态机机制,就可以完成一致性状态机。SOFAJRaft状态机组成有:
SOFAJRaft Node节点利用日志复制完成数据同步,主要组成有:
- 总结 -
本文通过简单介绍了下SOFAJRaft的选举实现、存储机制、状态机和日志复制四个方面。基本上完成了Raft实现的核心实现。但SOFAJRaft还有更多核心及优化,因为篇幅原因没有进入细细剖析。如果咱们自实现Raft协议,基本上也是实现这几个主流程即可完成简版Raft了。关于Raft协议暂时先告一段路,接下去准备开写ZAB协议。
- 作者介绍 -
林淮川
毕业于西安交通大学;奈学教育《百万架构师训练营》讲师、企业级源码内源负责人,前大树金融高级架构师、技术委员会开创者、技术总监;前天阳宏业交易事业部技术主管;多年互联网金融行业(ToB)经验。