Raft Store 工作流程简介
鉴于许多同学对于 TinyKV 中 Raft Store 运行流程不甚了解,对进行实验造成了一定阻碍,这里对这个流程进行一些讲解,希望可以帮助到大家。
首先上图:
Raft Store 会按图中的序号处理请求(当然不同请求处理路径也不一样,这里以我们挖了空的,处理 RaftCommand 消息的流程为例),其中标红的部分是需要自己往里填充代码的部分。
数据结构
首先这个 peerMsgHandler、Peer 和 Peer storage 是层层包含的关系,它们之间的通信基本上就是直接进行函数调用,外层调用内层的函数。
然后是这个 raft,之前的理论课也讲过,我们用的raft库是来自 etcd 的,为了让它更方便地作为一个库来使用,raft 库专心做共识算法而并不处理网络、写盘等等的任务,而是通过向上层发送 Ready 信息来让上层帮助他完成,因此可以理解为是一个独立工作的部分。
流程
- 来自用户、网络上其他 peer 等的消息被
peerMsgHandler.HandleMsg
处理 -
peerMsgHandler.proposeRaftCommand
调用 peer 的某个方法,向 raft 部分提出要执行一些 RaftCommand
(Raft 运行共识算法,搜集要写盘和发送给其他 peer 的信息,打包成 Ready 结构) - Raft 准备好的
Ready
由HandleRaftReady
处理,其中:
2.0. SaveReadyState 负责发送 raft message 给其他 peer,以及持久化 Ready 中要持久化的东西
2.1. 其中需要用到 Append 函数向 raft log 中写数据
完成这些后,HandleRaftReady
中应当调用Advance
函数,告知 raft 部分这一份 Ready 已经处理完了,可以开始发送下一批了。