Raft
Raft是一种较为广泛使用的分布式协议。博主在学习这个算法时,在网上找到了很多不同的实现方式,但是都引用了很多第三方库,使用了RPC等工具(博主没学过),代码比较晦涩难懂,对刚接触分布式算法的朋友很不友好。本文通过java不依赖任何第三方工具,实现了Raft协议的核心选主功能。
参考资料
选主逻辑
Raft协议中所有节点都有三种状态,leader,candidate,follower。leader是一个集群的领导者,所有的节点都要和leader保持同步。leader要定时给follower发送心跳,如果follower在一定的时间内没有收到心跳则认为leader宕机了,会变为candidate,向其他节点发起竞选。
同一时刻一个集群中只能存在一个leader,当一个leader挂掉时其他节点会根据一定的算法选择出下一个leader维持集群的稳定。
Raft协议中每个节点都有机会成为leader,当一个candidate得到半数以上的follower投票时就会成为下一任leader。这样可以保证选举速度不会过慢,也可以防止同时出现复数个leader。
项目结构
知道了raft的基本逻辑,开始尝试设计java项目结构的思维导图。
最初目的是设计出一个基于raft的kvdb,但是本文着重讲解raft协议的实现。
最终的项目结构如下:
实现细节
采用状态机实现节点的三个状态,所有网络操作都封装在Network中。每一个节点可能会执行的操作都放在RaftNode里。
演示
https://www.bilibili.com/video/BV1xS4y1v7op/
Git链接
https://gitee.com/Nana7mi/raft-kvdb.git