假设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成为集群领导者。那么当日志响应客户端时,未提交的日志会发生什么? 它会被丢弃吗?
答案 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)