raft 算法中, 返回 ConflictTerm 的作用是什么?

2022-05-27 22:06:25 +08:00
 qianxi0410
个人实现 raft 的时候,ConflictTerm 的作用似乎没体现出来。因为只需要令 nextIndex 等于返回的 ConflictIndex 即可,想了很久也没明白返回 ConflictTerm 有什么意义呢?还望解答。
1756 次点击
所在节点    Go 编程语言
5 条回复
2NUT
2022-05-27 22:28:26 +08:00
感觉最近都在研究 raft 呀,why
lessMonologue
2022-05-28 10:30:05 +08:00
应该是让 follow 一次返回信息里就知道冲突的 term 了吧,否则还需要进行额外的 RPC 。很长时间没看了有点遗忘,等一个大佬回答
XiLemon
2022-05-28 11:05:48 +08:00
看起来你是在实现 Raft 日志冲突回溯的优化,实际上是可以只用 conflictIndex 来实现优化,但加上 conflictTerm 优化效果更好。

举个例子: 假设 S1 是 leader ,S2 是 follower
idx 0 1 2 3 4 5 6 7
S1 x 4 4 4 4 4 5 5
S2 x 4 4 4 4 4 4 4

1. S1 发送心跳 prevLogIndx 为 7 ,prevLogTerm 为 5 ;
2. S2 发现日志冲突,idx 为 7 的日志,term 是 4 。那么会往前回溯到 term 4 的第一条日志,
最后返回的 conflictTerm 为 4 ,conflictIndex 为 1 ;
3. 如果没有 conflictTerm , 那么会下一次同步 prevLogIndex 为 0 ,会将 1~7 的日志全部同步。
如果有 conflictTerm ,根据 Raft 的日志匹配特性,下一次同步只需要传输 6~7 的日志,
prevLogIndex 为 term 4 最后一个 entry 的 idx ,也就是 5 。

可以参考一下 6.824 助教的指导文章:
https://thesquareplanet.com/blog/students-guide-to-raft/#an-aside-on-optimizations

最近也在刷 6.824 ,有兴趣的话一起: https://t.me/+G8GC-B6ThGZlN2Zl
XiLemon
2022-05-28 11:07:25 +08:00
另外吐槽一下 v 站, [任] [ 期] 这个词发不出来,全部替换成 term 了。。。
qianxi0410
2022-05-28 12:00:57 +08:00
@XiLemon 豁然开朗!感谢感谢。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/855757

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX