为什么 paxos proposalId 需要是唯一的

ter*_*rry 3 paxos

谁能告诉我为什么提案 Id 在 Paxos 中需要是唯一的?我认为这个proposalId需要唯一的原因是我们需要使用它来拒绝旧提案并对最大投票进行排序。所以如果我们做第一阶段:acceptor 只接受大于promiseId 的提议并且是增量的,它仍然可以保证一致性。

我们假设提议者 A 向接受者提出了一个提议 (proposalId x, value y),然后他得到了多数同意的答复,另一个具有相同提议 id(x) 的提议者 B 发出提议请求,这个提议者 B 将被拒绝,对吧? 最终,我们仍然可以达到一致性,对吧?

sim*_*905 5

简短的回答是正确性的证明取决于每轮每个节点的唯一数字。

一个直观的答案如下:

如果提议编号在集群中的节点之间不唯一,您可以让两个节点为同一编号提议不同的值。在任意消息丢失的情况下,一些节点可能接受一个值,而一些则接受另一个值。潜在的新领导者将询问所有节点他们接受的最高值。然后它会得到相同数字的不同值的响应。然后它无法消除歧义并决定下一个选择哪个值以使集群保持一致性。使用唯一编号可确保每个值在每一轮中都有唯一编号。这确保了新的领导者可以正确选择最高的接受值。

人为场景:

一个五节点集群,节点A为领导者。网络失控了。节点B认为它需要领导,因为它怀疑节点A因丢失消息而死亡。节点B提出与 上次使用的相同的数字A。节点A和节点B实际上都已启动并尝试向其他节点传输不同的值。电源出现故障,所有节点都变暗,并且由于滚动电源故障导致网络中断,因此一些但并非所有消息都能通过。

接下来,电源重新打开,但节点AE保持死机。节点BC并且D可以形成法定人数。节点C提出一个新的高数,并为最高接受值取回两个不同的值。一个来自A,另一个来自B。现在它必须在它们之间做出选择。哪个值可以保证使集群达到正确的一致性?

想象一下,在幸存的仲裁中,只有一个节点具有该A值,但有两个节点具有该B值。因此,假设我们猜测Bs 值,但这可能是错误的。死节点A,并E可能具有A价值。A在电源故障之前,节点碰巧看到了对其值的大部分响应,因为它的消息碰巧通过了其他两个节点。该价值是一笔付款,当它看到大多数人的回应时,它会将钱从公司中取出。然而,幸存的仲裁决定As 值从未发生过,并使集群与Bs 值保持一致。

修复:

您需要做的就是对每个节点进行唯一编号,并将节点唯一编号编码为选票编号的最低有效位。然后每个节点使用它唯一的数字,并且可以轻松生成一个新数字,该数字仅高于集群中使用的最后一个最高数字。如果我们这样做,只有一个值将是任何一轮接受的最高值。

如果最后一个领导者得到多数响应,则任何拥有多数的新领导者将看到最后一个领导者使用的最高值。新的领导者将不会与它将合作的最后一个领导者发生冲突。新的领导者不需要知道死去的领导者是否真的看到了多数响应并采取了行动。相反,它做出了保守的选择,并假设它可能有并采取适当的行动。