作者已经开源了自己实现的Java版Raft算法框架raft-core项目链接:https://github.com/wujiuye/delay-scheduler/tree/main/raft/raft-项目核心代码是delay-scheduler(分布式延迟调度中间件)的一个子模块,水平有限,建议只学习使用。关于CAP原则C(consistency)A(availability)P(partitiontolerance)原则是分布式系统永远绕不开的话题。在任何分布式系统中,可用性、一致性和分区容错性这三个方面都是相互矛盾的。三者不可兼得,最多只能选择后者。AP:如果要求系统高可用(A)和分区容错(P),那么就必须放弃一致性(C);CP:如果要求数据强一致(C),同步时间会因为网络分区无限延长(P),可用性无法保证,那么必须放弃可用性(A);CA:如果没有网络分区(分区是指不同的机房/国家/地区)(P),那么可以同时满足强一致性(C)和可用性(A)。Raft共识算法介绍在Raft集群中,每个节点对应一个角色,可以是Leader(领导节点),也可以是Follower(跟随节点)。在选举出Leader之前,每个节点都可以是一个Candidate(候选节点)。Raft算法规定Raft集群只能有一个Leader节点,只有Leader节点才能处理客户端的读写请求,将写请求翻译成操作日志,Leader节点会将操作日志复制给其他Follower节点。当一条操作日志同步到大多数节点(包括自身在内的大多数节点)时,可以将该操作日志应用到状态机,状态机会执行写操作(executecommand),保证数据的最终一致性。我们可以把Binlog看成是Mysql数据库执行的写操作命令,而MyISAM存储引擎就是Binlog的状态机,就是用来执行命令的。实现Raft算法需要实现两个RPC接口:RequestVoteRpc:当前候选节点在选举时向其他节点发起拉票请求;AppendEmtriesRpc:Leader节点向其他Follower节点发送日志复制请求、心跳请求、日志提交请求。定时心跳定时器Leader节点需要定时向其他Follower节点发送心跳包,以刷新其他Follower节点上的选举超时时间。心跳定时器在节点成为Leader节点时启动,在节点成为Follower节点时停止。要求心跳超时间隔大于超时选举间隔,即HeartbeatTimeout(心跳包广播时间)
