图中提到 S5 不会成为领导者,因为多数
将拒绝其 RequestVotes
就像在 raft 纸中的 (e) 中一样,S5 不会成为领导者,因为 S5 的日志至少不会与多数日志 (S1,S2,S3) 保持同步
这是否意味着在收到 AppendEntries RPC 后,S5 将
根据当前使用 (2, 2) 和 (3, 4) 覆盖其条目 (2, 3)
(e) 的领导者?
是的,S5 的日志会被当前领导者的日志覆盖。引自草稿纸:
如果 follower 的 log 与 leader 的不一致,则 AppendEntries 一致性检查将在下一次 AppendEntries RPC 中失败。拒绝后,领导者减少 nextIndex 并重试 AppendEntries RPC。最终 nextIndex 将达到领导者和追随者日志匹配的点。发生这种情况时,AppendEntries 将成功,这将删除追随者日志中的所有冲突条目并附加领导者日志中的条目(如果有)。
客户端是否会收到未提交条目的确认,就像
它们已经应用于状态机了吗?
不,客户端仅在已安全复制条目时才会收到已提交条目的确认。请参阅 raft paper 的报价:
当条目被安全复制后(如下所述),领导者将条目应用到其状态机并返回该条目的结果
执行给客户端。
还有一种情况是leader已经复制了log entry,但是在响应client之前就崩溃了或者通过网络发送响应丢失了,client需要重试导致命令被执行多次。引自牛皮纸:
但是,到目前为止,Raft 可以多次执行命令:例如,如果领导者在提交日志条目后但在响应客户端之前崩溃,则客户端将重试该命令新的领导者,导致它被第二次执行。解决方案是让客户为每个命令分配唯一的序列号。然后,状态机跟踪最新的
为每个客户端处理的序列号,以及相关的响应。如果它收到一个序列号已经被执行过的命令,它会立即响应而不重新执行请求