【发布时间】:2021-01-11 11:44:11
【问题描述】:
我已经阅读了关于 raft 的paper,我对此感到困惑
如果追随者崩溃或运行缓慢,或者网络数据包丢失, 领导者无限期地重试 AppendEntries RPC(即使它已经 响应客户端)直到所有关注者最终存储所有日志 条目。
写在5.3 Log replication部分的开头。
为了让我的困惑更清楚,我把它分成两个问题。
问题 1. 领导者是否应该在以下所有三种失败情况下重试?
- reply false if term
- 如果日志在 prevLogIndex 中不包含其术语与 prevLogTerm 匹配的条目,则回复 false(在图 2 中)
- rpc 错误或超时
问题2.如果leader在某些情况下需要重试,leader进程是否会阻塞直到所有follower都回复成功?
以下是我的尝试:
- 在第一次失败的情况下,领导者不需要重试。
- 在第二次失败的情况下,leader应该重试,并调整follower的nextIndex,直到follower回复成功。在接受下一个客户端请求之前,领导者也会被阻止。
- 在第三种失败情况下,领导者不需要重试,我们可以在下一次客户端请求时附加失败条目。
【问题讨论】: