V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
qianxi0410
V2EX  ›  Go 编程语言

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

  •  1
     
  •   qianxi0410 ·
    qianxi0410 · 2022-05-27 22:06:25 +08:00 · 1788 次点击
    这是一个创建于 936 天前的主题,其中的信息可能已经有所发展或是发生改变。
    个人实现 raft 的时候,ConflictTerm 的作用似乎没体现出来。因为只需要令 nextIndex 等于返回的 ConflictIndex 即可,想了很久也没明白返回 ConflictTerm 有什么意义呢?还望解答。
    5 条回复    2022-05-28 12:00:57 +08:00
    2NUT
        1
    2NUT  
       2022-05-27 22:28:26 +08:00
    感觉最近都在研究 raft 呀,why
    lessMonologue
        2
    lessMonologue  
       2022-05-28 10:30:05 +08:00
    应该是让 follow 一次返回信息里就知道冲突的 term 了吧,否则还需要进行额外的 RPC 。很长时间没看了有点遗忘,等一个大佬回答
    XiLemon
        3
    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
        4
    XiLemon  
       2022-05-28 11:07:25 +08:00
    另外吐槽一下 v 站, [任] [ 期] 这个词发不出来,全部替换成 term 了。。。
    qianxi0410
        5
    qianxi0410  
    OP
       2022-05-28 12:00:57 +08:00
    @XiLemon 豁然开朗!感谢感谢。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1053 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 19:05 · PVG 03:05 · LAX 11:05 · JFK 14:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.