在raft协议中复制但未通信的日志会发生什么

时间:2016-01-08 08:15:06

标签: consensus raft

假设3人筏群a [master],b,c

客户端将日志发送到a,将其复制到b和c,将日志应用到状态机并响应客户端。 然后在b和c之前发生崩溃,有机会将提交状态复制到b和c。

b替换为群集领导者。 当日志响应客户端时,未提交的日志会发生什么?

它会被b再次复制还是被丢弃?

然后假设一个4人筏群a [master],b,c,d

客户端向a发送日志,将其复制到b和c(而不是d),a将日志应用到状态机并响应客户端,然后在将已提交状态复制到b和c之前崩溃d。

d替换a成为集群领导者。那么当日志响应客户端时,未提交的日志会发生什么? 它会被丢弃吗?

2 个答案:

答案 0 :(得分:3)

我认为你对“已申请”的“承诺”感到困惑。该条目被视为已提交,因为它已保存在大多数服务器中,但尚未应用。 B获得领导者是因为其日志是最新的,当它设法从其自己的术语中应用一个条目时,也将应用来自A的条目。

在你的第二个场景中,D不能成为领导者,因为它的日志不是最新的,B和C不会批准他们的投票。

答案 1 :(得分:0)

《In Search of an Understandable Consensus Algorithm (Extended Version)》中的第5.4.2节和图8讨论了更复杂的情况。

Q1。只有当提交新日志(日志的术语等于领导者的 CurrentTerm )时,才能应用任何与领导者的 CurrentTerm 不同的未提交日志。或者他们会保持不通。

Q2。 d将无法成为领导者(就像图8.e中的S5)