raft php 实现,raft-simple

raft Java实现的详细设计文档

概述

第一期,只实现raft一致性算法的核心功能,先不实现集群成员变化、日志压缩等功能。

本文为raft实现的设计文档,对raft算法进行抽象,将关键逻辑用图形和表格梳理清楚,从而给使用Java代码进行实现提供设计文档。

主要概念

server:服务器,可能为leader、candidate、follower中的任意一方

leader:主节点

candidate:候选节点

follower:从节点

RPC:远程过程调用,在这里指通信接口

election:选举leader的过程

client:客户端,发起请求,传输数据的使用方

entry:条目,=term + 状态机指令(数据) + logIndex(日志索引)。

term:任期号,即一个数字。如下图,多个term组成了整个生命周期的时间轴。

48e1a9c88302cb1145df8a2f269a7292.png

关键设计

领域模型

term介绍

核心的数据结构即为entry,多个entry组成了本地的数据模型,如下图:

27d564fa813176f1dca07433637d51dc.png

term:任期号

index:日志索引,从1开始递增

data:保存的数据

体现在一个集群中,则如下图:

7e946418edca512102a85c5a8f91aee1.png

整体模型

1a033c7b305b691ea6f40069802e1838.png

用例图

483e09e2bde119b8d614a026812c80cc.png

模块划分

86301d3bca1dcf26aff5a992c06a28e1.png

关键类设计

整体类图如下

eae7e913d418a80962af6c268b8f3015.png

Server状态流转类图

8cee4dd32a4cb7f465a296e5fd8f8042.png

server状态流转

28b328fc74f952fa531eefda70d06ccc.png

备注:跟随者只响应来自其他服务器的请求。如果跟随者接收不到消息,那么他就会变成候选人并发起一次选举。获得集群中大多数选票的候选人将成为领导者。在一个任期内,领导人一直都会是领导人直到自己宕机了。

Entry状态转换

从客户端submit到最终apply到状态机:

44caa222712e4e527c0d34408fb175c4.png

核心实现流程

leader选举

follower投票

6df8d701c5b6045b12362db3848dc8d1.png

约束转换:

如果term < currentTerm返回 false (5.2 节)

如果 votedFor 为空或者为 candidateId,并且候选人的日志至少和自己一样新,那么就投票给他(5.2 节,5.4 节)

如果接收到的 RPC 请求或响应中,任期号T > currentTerm,那么就令 currentTerm 等于 T,并切换状态为跟随者(5.1 节)

candidate发起投票(广播)

08542babde47b3f4f9a1ab3b0636f127.png

candidate发起投票(单个)

afa1e2a47aa44e349cbf22ca91af03d1.png

通过ifLeaderChannel方式通知状态转换模块,由candidate转换为leader

日志复制

follower接受条目

5b83076d9304e2ece64c2b99f8aa545a.png

7c292a867de97cad8c525a24c833c109.png

9cabeb98b301b4b30f7b0797f3417a6b.png

leader请求条目(广播)

37f8fb768c0783a3eb1e2de587ac8ed3.png

c07f59aab64744c2ea72908268492076.png

4cb6ac429706fefcd4d0a81fb945373c.png

leader请求条目(单个)

140487d1b5711ebe36d729cbe4037546.png

客户端submit

接收客户端submit

479dbadb127a09df06a999b60da3e2cd.png

客户端submit

326ee8f0e74cc8fdb92b4685b4ba0d9a.png

提交过程:append-commit-apply-sm

append-commit-apply-sm概述

adeced157f8e40025ed843a097e8c882.png

commit2Apply

66e407796903d5083204936503486cb4.png

状态机的一种实现(apply2sm)

a14f928f03e1fd4b1aca1f1b78da56fd.png

server角色流转的详细实现

基于上面的server状态流转的状态机,详细描述如下:

5142e051bb819465567414704d78d0c1.png

实现参考

其他

通信模块

dubbo参考:

grpc参考:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值