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