当我在这种情况下采用Raft的“从未通过计算复制品的先前条款提交日志条目”规则时,这是否会导致真正的问题?

问题描述 投票:0回答:1

我目前正在实施Raft一致性算法,我遇到了以下问题。考虑有4个节点(A,B,C和D),因此可以提交超过2票的日志条目。现在我们启动集群并使用term = 0选举领导者A.然后发生以下事情:

  1. 从动件B / D断开。
  2. 领导者A创造LogEntry X.
  3. 领导者尝试复制到所有节点并最终失败,因为只有2个节点(A和C)。
  4. 节点B重新连接并超时,它开始用新的term = 1选举。
  5. 节点A失去了领导地位,因为它收到了Node B的RequestVote RPC。
  6. 节点B无法赢得选举,因为它没有LogEntry X.因此集群中没有领导者。
  7. 节点超时并再次被选为领导者。
  8. 领导者A成功地将LogEntry X复制到B.
  9. 现在节点A / B / C具有完全相同的LogEntry X,即(index = 0, term = 0)。然而,根据筏纸,领导者A不能提交X,尽管它是由自己生成的,并且大多数人同意X. Raft从不通过计算副本来提交以前术语的日志条目。通过计算副本,只提供领导者当前术语的日志条目;
  10. 假设客户端没有更多的LogEntrys要复制,所以LogEntry X仍未提交。

我的问题是:

  1. 这是一个真正的问题吗?
  2. 有一些解决方案吗?事实上,已经有一些关于SoF的帖子强调了这条规则的重要性。在这个post中,似乎我们可以创建X的副本Y,并复制Y.它是否有效或者是否存在共同的解决方案?
distributed-system consensus raft
1个回答
2
投票
  1. 没有
  2. 是。在筏纸上,第13页,您有以下内容:

领导者完整性属性保证领导者拥有所有已提交的条目,但在其任期开始时,它可能不知道这些是什么。要找出答案,需要从其术语中提交一个条目。 Raft通过让每个领导者在其术语开始时向日志中提交空白的无操作条目来处理此问题

在你的情况下,在第7步之后,A将创建一个NoOp日志条目,它将成功复制它,提交它,因此所有以前的条目都将被提交。

© www.soinside.com 2019 - 2024. All rights reserved.