【发布时间】:2019-05-16 14:32:33
【问题描述】:
我目前正在自己实现 Raft 共识算法,我遇到了以下问题。
考虑有 4 个节点(A、B、C 和 D),因此可以提交超过 2 票的日志条目。现在我们启动集群并使用term = 0 选举Leader A。然后发生以下事情:
- 跟随 B/D 断开连接。
- 领导A创建
LogEntryX。 - Leader A 尝试复制到所有节点并最终失败,因为只有 2 个节点(A 和 C)。
- 节点 B 重新连接并超时,它使用新的
term = 1开始选举。 - 节点 A 失去了领导地位,因为它收到了节点 B 的
RequestVoteRPC。 - Node B can't win the election, because it has no
LogEntryX. So there are no Leader in the cluster. - 节点A超时,再次被选为Leader。
- Leader A 成功将
LogEntryX 复制到 B。 -
现在节点 A/B/C 有完全相同的
LogEntryX,即(index = 0, term = 0)。然而,根据 Raft 论文,Leader A 不能提交 X,尽管它是自己生成的并且多数同意 X。Raft 永远不会通过计数来提交上一期的日志条目 复制品。只有领导者当前任期的日志条目是 通过计算副本提交;
- 假设没有更多来自客户端的
LogEntrys 可以复制,所以LogEntryX 仍然未提交。
我的问题是:
- 这是一个真正的问题吗?
- 有解决办法吗? 事实上,已经有一些关于 SoF 的帖子强调了这条规则的重要性。在这个post 中,似乎说我们可以创建 X 的副本 Y,然后复制 Y。它是否有效或者是否存在通用解决方案?
【问题讨论】:
标签: distributed-system consensus raft