问题描述
我有一个关于 Raft 中日志复制的详细行为的问题。
图。 2 篇扩展的 Raft 论文说:
- nextIndex 被初始化为 leader last log + 1 选举后
- 如果关注者的最后一个日志索引 >= nextIndex:发送 AppendEntries RPC,日志条目从 nextIndex 开始。
因此,据我了解,可能会发生以下情况。
- S1(leader,任期:10)从客户端收到命令 X。
- S2(Follower,任期:10)开始选举并成为leader
- ...
- S1 (leader,Term:13) elected as leader (reinitialized nextIndex to leader last log + 1)
- 然后,在收到来自客户端的下一个命令之前,S1 不会将包含命令 X 的日志的 Append Entries RPC 发送给关注者。
但是,图 8 的 (d) 看起来在 S5 被选中后立即发送带有“3”的 Append Entries RPC。 Fig.8
谁能告诉我为什么会这样?还是我弄错了?
解决方法
在选举之后,Leader 直接向追随者发送心跳,以将自己确立为新的 Leader。如果没有客户端请求,Leader 不会发送任何条目,但它仍会随心跳发送其 prevLogIndex
和 prevLogTerm
。如果与追随者不匹配,则追随者的 nextIndex
会递减。我认为下一个 Heartbeat 然后包含丢失的条目,当 prevLogIndex
和 prevLogTerm
最终与关注者匹配时,丢失的条目可以应用于关注者。有些事情也依赖于实现。