Lab1 中 Raft Store 需要关注的执行流程

Raft Store 工作流程简介

鉴于许多同学对于 TinyKV 中 Raft Store 运行流程不甚了解,对进行实验造成了一定阻碍,这里对这个流程进行一些讲解,希望可以帮助到大家。

首先上图:

Raft Store 会按图中的序号处理请求(当然不同请求处理路径也不一样,这里以我们挖了空的,处理 RaftCommand 消息的流程为例),其中标红的部分是需要自己往里填充代码的部分。

数据结构

首先这个 peerMsgHandler、Peer 和 Peer storage 是层层包含的关系,它们之间的通信基本上就是直接进行函数调用,外层调用内层的函数。

然后是这个 raft,之前的理论课也讲过,我们用的raft库是来自 etcd 的,为了让它更方便地作为一个库来使用,raft 库专心做共识算法而并不处理网络、写盘等等的任务,而是通过向上层发送 Ready 信息来让上层帮助他完成,因此可以理解为是一个独立工作的部分。

流程

  1. 来自用户、网络上其他 peer 等的消息被 peerMsgHandler.HandleMsg 处理
  2. peerMsgHandler.proposeRaftCommand 调用 peer 的某个方法,向 raft 部分提出要执行一些 RaftCommand
    (Raft 运行共识算法,搜集要写盘和发送给其他 peer 的信息,打包成 Ready 结构)
  3. Raft 准备好的 ReadyHandleRaftReady 处理,其中:
    2.0. SaveReadyState 负责发送 raft message 给其他 peer,以及持久化 Ready 中要持久化的东西
    2.1. 其中需要用到 Append 函数向 raft log 中写数据
    完成这些后,HandleRaftReady 中应当调用 Advance 函数,告知 raft 部分这一份 Ready 已经处理完了,可以开始发送下一批了。
3 个赞