我使用以下pdf作为参考。
它说lastApplied
是应用于状态机的最高日志条目,但它与commitIndex
有何不同?
领导者的matchIndex
也是关注者的commitIndex吗?如果没有什么区别?
答案 0 :(得分:1)
...
lastApplied
是应用于状态机的最高日志条目,但与commitIndex
有何不同?
这在实际系统中是不同的,因为在日志中提交数据的组件通常与将其应用于复制状态机或数据库的组件分开。 commitIndex
通常只有纳秒或者比lastApplied
更新几毫秒。
关于领导者的
matchIndex
是关注者的commitIndex
吗?如果没有什么区别?
他们是不同的。有一段时间数据在服务器上但尚未提交,例如在复制过程中。
领导者会跟踪每个对等方的最新未提交数据,只需要向每个对等方发送log[matchIndex[peer], ...]
而不是整个日志。如果同伴明显落后于领导者,这尤其有用;因为领导者可以通过一系列小AppendEntries
次呼叫更新同伴,逐步使同伴更新。
答案 1 :(得分:0)
您的观察是合理的:在大多数情况下,nextIndex
等于matchIndex + 1
,但并非总是如此。
例如,当启动领导者时,matchIndex
被初始化为0,而nextIndex
被初始化为最后一个日志索引+ 1。
此处的差异是因为这两个字段用于不同的目的:matchIndex
是一个精确值,指示领导者和关注者中的所有日志条目所匹配的索引。但是,nextIndex
只是一个乐观的“猜测”,表明领导者应为下一个AppendEntries操作尝试哪个索引,这可能是一个很好的猜测(即等于matchIndex + 1
),在这种情况下,AppendEntries操作将成功,但也可能是一个错误的猜测(例如,在刚刚启动领导者的情况下),在这种情况下,AppendEntries将失败,以便领导者将nextIndex
递减并重试。
对于lastApplied
来说,它只是另一个准确的值,它指示将跟随者中的所有日志条目应用于基础状态机的索引。与matchIndex
相似之处在于,它们都是准确的值,而不是启发式的“猜测”,但是它们的含义不同,用途不同。
答案 2 :(得分:0)