什么是raft协议中的lastApplied和matchIndex,用于服务器中的易失性状态?

时间:2017-09-23 05:14:57

标签: algorithm distributed-system consensus raft

我使用以下pdf作为参考。enter image description here

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

领导者的matchIndex也是关注者的commitIndex吗?如果没有什么区别?

3 个答案:

答案 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)

  1. commit并不意味着已经应用,它们之间存在时间差异。但最终应用将赶上提交索引。
  2. 保存在头标中的
  3. matchIndex [i]等于follower_i的commitIndex,并且他们试图赶上nextIndex