raft协议的Java版本简单实现
原文地址:https://www.yuque.com/aidt/tq712e/bhhyno
第一期,只实现raft一致性算法的核心功能,先不实现集群成员变化、日志压缩等功能。 本文为raft实现的设计文档,对raft算法进行抽象,将关键逻辑用图形和表格梳理清楚,从而给使用Java代码进行实现提供设计文档。
核心的数据结构即为entry,多个entry组成了本地的数据模型,如下图:
体现在一个集群中,则如下图:
备注:跟随者只响应来自其他服务器的请求。如果跟随者接收不到消息,那么他就会变成候选人并发起一次选举。获得集群中大多数选票的候选人将成为领导者。在一个任期内,领导人一直都会是领导人直到自己宕机了。
从客户端submit到最终apply到状态机:
约束转换:
通过ifLeaderChannel方式通知状态转换模块,由candidate转换为leader
基于上面的server状态流转的状态机,详细描述如下:
dubbo参考:
grpc参考: