JRaft–基础–02–架构
1、架构
1.1、Node
- Raft 分组中的一个节点,连接封装底层的所有服务
- 用户看到的主要服务接口,特别是 apply(task)用于向 raft group 组成的复制状态机集群提交新任务应用到业务状态机
1.2、存储
上图靠下的部分均为存储相关
1.2.1、Log 存储
记录 raft 用户提交任务的日志,将日志从 leader 复制到其他节点上。
- LogStorage 是存储实现,默认实现基于 RocksDB 存储,你也可以很容易扩展自己的日志存储实现
- LogManager 负责对底层存储的调用,对调用做缓存、批量提交、必要的检查和优化
1.2.2、Metadata 存储
元信息存储,记录 raft 实现的内部状态,比如当前 term、投票给哪个节点等信息
1.2.3、Snapshot 存储
用于存放用户的状态机 snapshot 及元信息,可选。
- SnapshotStorage 用于 snapshot 存储实现。
- SnapshotExecutor 用于 snapshot 实际存储、远程安装、复制的管理
1.3、状态机
- StateMachine:
- 用户核心逻辑的实现,核心是 onApply(Iterator)方法
- 应用通过 Node#apply(task)提交的日志到业务状态机
- FSMCaller:封装对业务 StateMachine 的状态转换的调用以及日志的写入等,一个有限状态机的实现,做必要的检查、请求合并提交和并发处理等
1.4、复制
- Replicator:用于 leader 向 followers 复制日志,也就是 raft 中的 AppendEntries 调用,包括心跳存活检查等
- ReplicatorGroup:用于单个 raft group 管理所有的 replicator,必要的权限检查和派发
1.5、RPC
RPC 模块用于节点之间的网络通讯
- RPC Server:内置于 Node 内的 RPC 服务器,接收其他节点或者客户端发过来的请求,转交给对应服务处理
- RPC Client:用于向其他节点发起请求,例如投票、复制日志、心跳等
1.6、KV Store
KV Store 是各种 Raft 实现的一个典型应用场景,JRaft 中包含了一个嵌入式的分布式 KV 存储实现(JRaft-RheaKV)。
2、JRaft Group
单个节点的 JRaft-node 是没什么实际意义的,下面是三副本的 JRaft 架构图
3、JRaft Multi Group
单个 Raft group 是无法解决大流量的读写瓶颈的,JRaft 自然也要支持 multi-raft-group