Raft实现日志-同步RPC设计
今天来介绍一下leader用来复制日志条目,以及发送心跳的RPC如何设计
AppendEntries RPC
Arguments
- term: leader的任期
- leaderID: follower可以将客户端请求重定向到leader
- prevLogIndex: 新日志条目的上一条条目索引
- prevLogTerm: 上条日志条目的任期
- entries[]: 用于存储日志条目(通过空列表来代表这是一条心跳RPC)
- leaderCommit: leader的提交index
Results
- term: 当前任期,leader通过该参数更新自己
- success: 返回true如果follower包含的日志条目匹配了上一条日志条目的索引和上条日志条目所在任期
接收端需要的实现:
- 返回false如果请求的term < currentTerm, follower发现请求的RPC的任期小于自己的任期索引,会认为leader已经过期了。
- 返回false如果log不包含上条日志,也就是说同步日志的RPC跟follower存的log不匹配。
- 如果已经存在的日志条目与新的冲突了(索引一致但任期不一致)则删除已存在的日志
- 需要接受所有新的不包含在log里的条目
- 如果leaderCommit > commitIndex,commitIndex=min(leaderCommit, index of last new entry)
之后的更新计划
因为之前已经分析了很多种情况,都记录在其他文章里了,RPC为什么要这么实现的理由,之后会添加一下链接,方便查看