2

我使用以下pdf作为参考。在此处输入图像描述

它说这lastApplied是应用于状态机的最高日志条目,但这与commitIndex?

领导者也matchIndex只是追随者的commitIndex吗?如果不是,有什么区别?

4

3 回答 3

2

您的观察是合理的:大多数时候,nextIndexequals matchIndex + 1,但并非总是如此。

比如一个leader发起时,matchIndex发起到0,而nextIndex发起到最后一个日志索引+1。

这里的区别是因为这两个字段用于不同的目的:matchIndex是一个准确的值,指示领导者和追随者中的所有日志条目匹配的索引。然而,nextIndex这只是一个乐观的“猜测”,表明领导者应该为下一个 AppendEntries 操作尝试哪个索引,它可能是一个很好的猜测(即它等于matchIndex + 1),在这种情况下 AppendEntries 操作将成功,但它也可能是一个不好的猜测(例如,在刚刚启动领导者的情况下)在这种情况下,AppendEntries 将失败,因此领导者将递减并重nextIndex试。

至于lastApplied,它只是另一个准确的值,指示追随者中的所有日志条目已应用于底层状态机的索引。类似于matchIndex它们都是准确的值而不是启发式的“猜测”,但它们确实意味着不同的事物并用于不同的目的。

于 2018-08-01T02:17:41.890 回答
1

...lastApplied是应用于状态机的最高日志条目,但这与commitIndex?

这些在实际系统中是不同的,因为提交日志中数据的组件通常与将其应用于复制状态机或数据库的组件分开。通常commitIndex只比lastApplied.

matchIndex领导者只是commitIndex跟随者吗?如果不是,有什么区别?

它们不一样。有一段时间数据在服务器上但尚未提交,例如在复制期间。

领导者跟踪每个节点上最新的未提交数据,并且只需要发送log[matchIndex[peer], ...]给每个节点而不是整个日志。如果对等点明显落后于领导者,这尤其有用;因为领导者可以通过一系列小调用来更新对等AppendEntries点,逐步使对等点保持最新。

于 2017-09-26T00:57:09.757 回答
0
  1. 提交并不意味着已经应用,它们之间存在时间差异。但最终应用会赶上提交索引。
  2. 保存在leader中的matchIndex[i]等于follower_i的commitIndex,并试图追赶nextIndex
于 2020-03-02T03:14:42.550 回答