提议者如何知道其提议未被法定人数的接受者批准?

How a proposer know its propose is not approved by a quorum of acceptors?

我在 wiki 上阅读 "paxos",上面写着: "Rounds fail when multiple Proposers send conflicting Prepare messages, or when the Proposer does not receive a Quorum of responses (Promise or Accepted). In these cases, another round must be started with a higher proposal number." 但是我不明白proposer是怎么说出它的proposal没有被批准和消息传递需要更多时间的区别?

理解 Paxos 的一个棘手部分是原始论文和大多数其他论文(包括 wiki)没有描述能够 real-world 使用的完整协议。他们只关注算法的必要性。例如,他们说提议者必须选择一个比之前使用的任何数字都大的数字 "n"。但是他们没有提到如何实际去做,可能发生的失败类型,或者如果两个提议者同时尝试使用相同的提议编号(如都选择 n=2)时如何解决这种情况。这实际上完全违反了协议并会导致不正确的结果,但我不确定我是否见过特别指出的。我想应该是 "obvious".

特别是对于您的问题,没有完美的方法可以使用原始算法来区分差异。实际的实现通常通过向提议者发送 Nack 消息而不是默默地忽略它来走得更远。还有很多其他技巧可以使用,但所有这些技巧,包括 nacks,都有不同的缺点。哪种方法最好通常取决于使用 Paxos 的应用程序类型和它打算 运行 进入的环境。

如果您有兴趣,我整理了一份 much longer-winded description of Paxos,其中包括除了核心组件之外实际实施必须解决的许多问题。它涵盖了这个问题以及其他几个问题。

具体到您的问题,提议者无法区分丢失的消息、延迟的消息、崩溃的接受者或停滞的接受者。在每种情况下,您都得不到回应。通常,一个实现会在获得少于法定数量的响应时超时,并在假设消息被丢弃或接受器正在重启的情况下重新发送提案。

通常实施会添加 "nack" 消息作为否定确认,作为加速恢复的优化。提议者仅从已接受更高承诺的可达节点获得 "nack" 响应。 “nack”既可以显示最高承诺,也可以显示已知已修复的最高实例。下面将概述这有何帮助。

我写了一个名为 TRex with some of these techniques sticking as closely as possible to the description of the algorithm in the paper Paxos Made Simple. I wrote up a description of the practical considerations of timeouts and nacks on a blog post 的 Paxos 实现。

它使用的一个有趣的技术是超时节点以非常低的数量提出第一个提议。这将始终收到 "nack" 条消息。为什么?考虑一个三节点集群,其中一个网络 link 在稳定提议者和另一个节点之间中断。另一个节点将超时并发出准备。如果它发出高准备,它将从第三个节点获得承诺。这将打断稳定的领导者。然后,您将拥有对称性,其中无法相互发送消息的两个节点可以在没有前进进展的情况下与领导交换进行斗争。

为避免这种情况,超时节点可以从低准备开始。然后它可以查看 "nack" 消息以从第三个节点了解有一个正在取得进展的领导者。它会将此视为 nack 中已知固定的最高实例将大于本地值。然后超时节点不能发出高准备,而是要求第三个节点向它发送最新的固定和接受值。通过该增强,超时节点现在可以区分稳定提议者崩溃或连接失败。这种基于“nack”的技术不会影响实现的正确性,它们只是一种确保快速故障转移和转发进度的优化。