我使用以下pdf作为参考。
它说lastApplied是应用于状态机的最高日志条目,但是它与commitIndex有什么不同?
也就是…的matchIndex
... lastApplied 是应用于状态机的最高日志条目,但是它有什么不同 commitIndex ?
lastApplied
commitIndex
这些在实际系统中是不同的,因为在日志中提交数据的组件通常与将其应用于复制状态机或数据库的组件分开。该 commitIndex 通常只是纳秒或者可能比最新的几毫秒 lastApplied 。
是个 matchIndex 在领导者只是 commitIndex 关注者?如果不是有什么区别?
matchIndex
它们是不同的。有一段时间数据在服务器上并且尚未提交,例如在复制期间。
领导者会跟踪每个同行的最新未提交数据,只需要发送 log[matchIndex[peer], ...] 到每个对等体而不是整个日志。如果同伴明显落后于领导者,这尤其有用;因为领导者可以用一系列小的更新同伴 AppendEntries 呼叫,逐步使同伴更新。
log[matchIndex[peer], ...]
AppendEntries
你的观察是合理的:大多数时候, nextIndex 等于 matchIndex + 1 ,但情况并非总是如此。
nextIndex
matchIndex + 1
例如,当领导者被启动时, matchIndex 被启动到0,而 nextIndex 被启动到最后一个日志索引+ 1。
这里的区别是因为这两个字段用于不同的目的: matchIndex 是一个准确的值,表示领导者和关注者中所有日志条目匹配的索引。然而, nextIndex 只是一个乐观的“猜测”,表明领导者应该为下一个AppendEntries操作尝试哪个索引,它可以是一个很好的猜测(即它等于 matchIndex + 1 )在这种情况下,AppendEntries操作将成功,但它也可能是一个糟糕的猜测(例如,在刚刚发起领导者的情况下),在这种情况下,AppendEntries将失败,以便领导者将减少 nextIndex 然后重试。
至于 lastApplied ,它只是另一个准确的值,表示跟随者中的所有日志条目已应用于基础状态机的索引。它类似于 matchIndex 因为它们都是准确的值而不是启发式“猜测”,但它们实际上意味着不同的东西并且用于不同的目的。