我正在尝试实现 Raft 共识算法。以下是我对设置服务器状态的term
和votedFor
属性的所有时间的一般理解:
- 启动时
term
为 0 并且votedFor
是null
- 在服务器的选举超时后,服务器成为候选者,将其增加
term
1,并将其设置votedFor
为自身。 - 当服务器接收到一个高于它自己的
RequestVote
RPC 时,它应该更新观察到的数量,然后如果接收服务器有一个of并且它的日志不比发送者的日志更新,则更新给发送者。term
term
votedFor
votedFor
null
- 当候选者收到一个
AppendEntries
RPC,并且发送者的term
值高于或等于它自己的,候选者应该将其更新term
为发送者,term
然后将其设置votedFor
为发送者并使其状态变为跟随者,从而确认发送者为其合法领导者。 - 在所有其他情况下,当服务器接收到任何包含
term
高于其自身的 RPC 请求或响应时,它应将其自己的设置term
为接收到的服务器term
并设置votedFor
为null
.
term
这些一起构成了 Raft 正确实现中仅有的 5 种方式votedFor
吗?这些案例是否被正确总结了?我对此感到困惑,因为该论文仅提到在某些时候节点将转换为跟随者,而没有指定是否votedFor
应该是具有较高期限的发送者的值或null
。我担心案例 4 是错误的,应该是这样:AppendEntries
如果发送者的期限更长,那么接收者应该将它们更新为发送者的期限term
,然后设置votedFor
为发送者,无论接收者是否是追随者、候选人或过时的领导者。