在Paxos中,Acceptor在接受了它之后是否可以接受不同的值?

时间:2011-05-05 07:10:40

标签: distributed-computing paxos

在Multi-Paxos算法中,从接受者的角度考虑此消息流:

接收:准备(N)

回复:承诺(N,null)

收到:接受!(N,V1)

回复:接受(N,V1)

收到:接受!(N + 1,V2)

回复:?

根据协议,接受者在这种情况下应该做出什么反应?它应该以Accepted(N + 1,V2)回复,还是应该忽略第二次接受!?

我相信这种情况可能发生在Multi-Paxos中,当第二个提议者上线并认为他是(并且始终是)领导者时,因此他发送他的接受而没有准备。或者,如果他的准备工作根本没有达到接受者。如果这种情况可能不会发生,你能解释一下原因吗?

4 个答案:

答案 0 :(得分:6)

我不同意其他两个答案。

  1. 多Paxos 说领导者是唯一的提议者; 这会导致系统出现单点故障。即使在网络分区期间,系统也可能无法进行。 Multi-Paxos是一种优化,允许单个节点( Leader )跳过一些准备阶段。认为领导者已经死亡的其他节点可能会尝试代表她继续实例,但仍必须使用完整的Basic-Paxos协议。

  2. 拒绝接受消息违反了Paxos算法。 接受者应该接受所有值,除非它承诺接受它。(忽略是允许的但不建议;这只是因为允许丢弃的消息。)

  3. 还有一个优雅的解决方案。问题在于领导者的整数(问题中的N + 1)。

  4. 以下是一些假设:

    • 你有一个方案,圆形ID在所有节点上都是不相交的(无论如何都要求Paxos)。
    • 您可以通过某种方式确定哪个节点是每个Paxos实例的Leader(Multi-Paxos所需)。领导者能够从一个Paxos实例更改为下一个Paxos实例 除此之外: The Part-time Parliament 建议这是由领导者赢得之前的Paxos实例(第3.1节)完成的,并指出只要她还活着或者最富有,她就可以保持领袖(第3.3.1节) )。我有一个明确的ELECT_NEW_LEADER:< node>通过Paxos提出的价值。
    • Leader仅在每个实例的初始轮次上跳过准备阶段;并在后续轮次中使用完整的基本Paxos。

    通过这些假设,解决方案非常简单。领导者只是为它的初始接受阶段选择了一个非常低的圆形id。只要它低于所有节点的圆形ID,这个id(我称之为INITIAL_ROUND_ID)就可以是任何东西。根据您的id选择方案,-1,0或Integer.MIN_VALUE将起作用。

    它有效,因为另一个节点(我称之为斯图尔特)必须通过完整的Paxos协议提出任何建议,并且他的圆形ID总是大于INITIAL_ROUND_ID 。有两种情况需要考虑:领导者的接受消息是否到达斯图尔特准备消息的任何节点。

    当领导者的接受阶段没有到达任何节点时,Stewart将在任何Promise中都没有返回值,并且可以像普通的Basic-Paxos一样继续进行。

    并且,当领导者的接受阶段已经到达一个节点时,Stewart将获得一个承诺中的值,用于继续算法,就像在Basic-Paxos中一样。

    在任何一种情况下,由于Stewart的round id大于INITIAL_ROUND_ID,节点从Leader收到的任何慢速Accept消息都将导致Nack。

    Acceptor或Stewart都没有特殊的逻辑。 Leader上的最小特殊逻辑(即选择一个非常低的INITIAL_ROUND_ID)。


    注意,如果我们将OP的问题改为一个字符,那么OP的自我回答是正确的:Nack。

    • 收到:准备(N)
    • 回复:承诺(N,null)
    • 收到:接受!(N,V1)
    • 回复:接受(N,V1)
    • 收到:接受!( N-1 ,V2)
    • 回复: Nack(N,V1)

    但就目前而言,他的回答打破了Paxos算法;它应该是接受!

    • 收到:准备(N)
    • 回复:承诺(N,null)
    • 收到:接受!(N,V1)
    • 回复:接受(N,V1)
    • 收到:接受!( N + 1 ,V2)
    • 回复:接受!(N + 1,V2)

答案 1 :(得分:0)

Multi-Paxos的正确性取决于领导者(,提议者)在连续的Paxos实例之间没有变化的要求。从The Part-Time Parliament第3.1节(议会多议会议定书):

  

逻辑上,议会议定书[a.k.a. Multi-Paxos]使用了   完整的Synod协议的单独实例[a.k.a. Paxos]为每个法令号。然而,   一位总统[a.k.a.所有这些实例都选择了提议者/领导者,并且他执行了第一次   协议的两个步骤只需一次。
[增加了重点是我的。]

因此,Multi-Paxos假设您所描述的案例 - 当第二个提议者上线并认为他是(并且始终是)领导者时将永远不会发生。如果发生这种情况,则不应使用Multi-Paxos。关于第二种可能性 - 当第二个提议者的Prepare没有到达接受者时 - 第二个提议者已发出Accept!的事实意味着它先前发出了Prepare受法定人数为Promised。由于接受者已经承诺在第N轮上提出第一个提议者,因此第二个提议者的Prepare必须在轮次N之前发出。因此,最终Accept!(N+1,V2)的计数器必须小于 N

修改:还应注意,此版本的协议对Byzantine failure不健全:

  

[Paxon议会的议定书]不容忍任意的恶意失败,也不保证有限时间的反应。
- 兼职议会,第4.1节< /子>

答案 2 :(得分:0)

也许一个更简单的答案是观察到当准备(N + 1)命令被不包括有关受体的多数人接受时就是这种情况。

详细说明:一旦领导者知道某些多数人已经承诺(N + 1),它就会将Accept(N + 1,x)发送给所有接受者,即使一些其他大多数接受者以Accepted(N + 1)回复,也已达成共识。

这种情况不是那么罕见。

答案 3 :(得分:-2)

(回答我自己的问题。)

我目前的理解是我不应该接受N + 1中的值(即根本不回答或发送NACK),从而迫使领导者可能开始准备另一轮(如果多数未达到)已达成共识)。收到准备(N + 2)后,我将回答Promise(N + 2,V1),并照常继续。