Paxos 理解

问题描述

我已阅读论文 Paxos made simple

经过深思熟虑,我得出了这个结论:

paxos 协议始终保证大多数服务器在提案的同一轮接受相同的值,以便最终我们可以从大多数服务器中获得共识。

例如,表 1 显示有三台服务器(S1、S2、S3),N1、N2...表示提案,提案中存在许多差距,但对于每个提案,我们可以推导出多数服务器的共识

N1: S1(A)    & S2(A)    & S3(A)    => A

N2: S1(B)    & S2(null) & S3(B)    => B

N3: S1(null) & S2(C)    & S3(C)    => C

N4: S1(D)    & S2(D)    & S3(null) => D

因此我们获得了共识,如表 2 所示。

我的理解对吗?


表 1:

N1 N2 N3 N4
S1 A B D
S2 A C D
S3 A B C

表 2:

N1 N2 N3 N4
A B C D

解决方法

根据您所说的,我认为您正在了解是否通过查看增加提案中接受的值来获得对一系列值的共识。按照这个,日志是从提案编号((N1,A),(N2,B),(N3,C),(N4,B))中获得的。我认为这是因为您提到了提案序列中的差距。

如果是这样,那么我认为可能会有些混乱。

在 Paxos 中,有两件事需要担心:

  • 提案(或投票,尝试选择一个值)

  • 日志值(接受者同意的值,然后由状态机执行)

对于日志,每个值必须有容错协议。一个值只有在之前的所有值都已经被执行的情况下才能被执行,因此如果你想执行所有值,日志中必须没有间隙。不过,这是一个活性问题,与安全无关。您可以安全地了解日志中的所有值,并将它们视为“已提交”。如果是一台执行客户端发出的命令的机器,你可以告诉客户端他们的命令请求会发生,但你不能告诉他们执行他们的命令的结果,因为其他你不知道的命令会在它之前执行.

日志使用基本的Paxos协议来提供对单个值的容错协议。这就是提交值的想法很有用的地方。 Paxos Made Simple 中概述的基本 Paxos 协议只允许对单个值达成一致,并使用完全有序的提案(投票)序列来就该单个值达成一致。

这里的主要问题是,在决定将一个值放在日志中的单个索引处时,可以有多个建议。

在此之后,Paxos 中的接受者承诺或接受的提案序列可能存在差距,但这是可以的,并且是算法操作的一部分。 Paxos 算法确保如果在一个提案中就某个值达成一致,则所有编号较高的提案将看到相同的提议值并因此达成一致。请注意,这与问题的表 1 和表 2 中的示例不同。在那个例子中,如果大多数服务器(接受者)已经接受了提案 N1 中的 A,那么所有后来的提案也将接受值 N1。

这种在多个提案上达成一致但相同的能力对于容错是必要的,特别是对于活跃度。想象一下,如果提案 Nl 被大多数接受者接受,然后除了一个接受者之外的所有接受者都崩溃了,然后才能发出任何接受 Nl 的通知。已经商定了一个价值,但没有人知道。现在,为了从中恢复过来,另一个提议者应该发布一个更高编号的提议。我们将此提案称为 Nh。

提出提案有两个阶段:承诺和接受。在第一阶段,提议者必须获得大多数(或法定人数)对提议 Nh 的接受者的承诺。这样做的目的是确定某个值是否(可能)在编号较低的提案中达成一致。在这种情况下,我们将了解到一个接受者已经接受了编号较低的提案 Nl 中的值。 (响应的其他接受者将报告他们什么都没有接受。)尽管只有一个接受者报告他们接受了 Nl 中的一个值,但提议者必须(出于协议安全原因)假设它可能被选中。然后,在第二阶段,提议者将向接受者发出提议 Nh 的接受请求,并将包括先前提议 Nl 的值。如果至少大多数(法定人数)接受者接受这一点,那么提案被选中并且一切顺利,学习者将学习该值与日志中单个索引提交的值。否则,为决定日志索引处的值而发出建议的过程将再次继续。

最后,要提出的最后一点是,也没有要求提案获得多数接受,这一点很重要,因为在提案发布时可能没有多数接受者没有错误。为了激发这一点,请考虑在提案期间是否有适当的接受者或过多的接受者失败。

想象一下,如果在 Paxos 算法的一个实例中有接受者,其中一个接受提案 Na 中的值。然后,在 Na 被多数人接受之前,Na 的提议者失败,任何通过网络传输的消息都会丢失。在这种情况下,提议者需要能够提出新的提议并看到选择的值。在这种情况下,另一个提议者将开始一个更高编号的提议 Nb。它将像以前一样经历承诺阶段,并在与不接受任何东西的两个接受者交谈后确定不可能选择任何值。现在 Nb 的提议者可以提出任何值,并看到它被多数人接受并达成一致。在这里提出任何值都是安全的,因为 Na 的提议者如果重新上线,他们的值不会被大多数人接受,因为大多数接受者已经承诺并接受了更高编号的提议。

迈克尔 :)