关于Paxos实施的问题

时间:2011-05-01 18:40:34

标签: implementation paxos

我正在使用Wikipedia中提供的文档在集群模拟器应用程序中实现Paxos。不幸的是,它留下了几个可以解释的门,并没有提供关于关键实施问题的大量信息。它不清楚且不完整。

  • 假设一个簇分为3个区域,每个区域包含3个节点(总共= 9个节点)。如果地区之间的沟通中断,会发生什么?任何领导者都无法达到法定人数(即5)。

Paxos不会进入无限循环吗?我想如果一个人不能与至少一个法定数量的节点通信,就不应该发起Paxos。

  • 在阶段1b:'如果提案编号N大于之前的任何提案,则每个Acceptor承诺不接受小于N的提案,并发送上次接受的值 此实例至投标人'。

'接受的最后一个价值'是什么?来自提议者的任何先前提案编号是什么? 在这种情况下,'实例'究竟是指什么?

  • 在阶段1a:是否包含与准备消息达成一致的值,或者是否延迟到接受!信息?或者它确实重要?

  • 在阶段2a:'如果任何接受者已经接受了值,则领导者必须选择值且最大提案号为'。

这里有什么价值?是提案编号吗?我不相信,但这句话不清楚。

  • 在阶段2a:'否则,投标人可以自由选择任何价值'。这是什么意思?什么价值?对于提案号码?

  • Paxos似乎依赖于增加的N(提案号)值来运作?这是对的吗?

  • 维基百科条目不讨论节点在开始参与Paxos之前应该设置的初始值。这些是什么?

P.S。:我没有足够的声誉来创建'Paxos'标签(任何志愿者?)

3 个答案:

答案 0 :(得分:18)

  

什么是实例?

Paxos的命名法有点不直观。

  • 实例是选择一个值的算法。
  • 回合是指提议者对第1阶段+第2阶段的单次尝试。一个节点可以在实例中有多个回合 Paxos的/ em>所有节点上的每个实例的圆形id是全局唯一的。这有时称为提案编号
  • 节点可能承担多个角色;最值得注意的是Proposer和Acceptor。在我的回答中,我假设每个节点都扮演两个角色。
  • 第1阶段也称为准备阶段。
    • 在阶段1a中,投标人向受理人发送准备!(roundId)消息
    • 在阶段1b中,接受者回复Promise!(roundId,value)或PrepareNack!()
  • 阶段2也称为接受阶段。
    • 在阶段2a中,投标人向Acceptors发送Accept!(roundId,value)消息
    • 在阶段2b中,接受者以Accepted!(...)或AcceptNack回复!()
  

假设一个集群分为3个区域,每个区域包含3个节点(总共= 9个节点)。如果地区之间的沟通中断,会发生什么?任何领导者都无法达到法定人数(即5)。

Paxos要求您至少可以达到法定人数(在您的情况下为5个节点)。选择三个区域的解决方案;在这三个地区之间有两个网络分区是非常坏的消息。我还使用了一个版本的Paxos,可以将节点成员资格从一个实例更改为下一个实例。这对分区和节点故障很有用。

  

不是Paxos会进入无限循环吗?

Paxos的天真实现无法保证终止,因为多个节点可以跳跃准备阶段。有两种方法来解决这个问题。一种是在开始新的准备阶段之前进行随机退避。第二种是将所有请求路由到指定的领导者,该领导者充当提议者(领导者由Paxos实例选择。参见多篇论文)

  
    

在阶段1b:'如果提案编号N大于任何先前的提案,则每个>> Acceptor承诺不接受小于N的提案,并发送它最后接受的值>> ;这个实例是Proposer'。

  
     

它接受的最后一个值&#39 ;?是否是提议者提出的任何提议编号?

当节点收到来自Proposer 的Accept!(roundId,value)消息时,它没有承诺不接受该值(由于Prepare!(higherRoundId)消息) ,它存储值和roundId(我称之为acceptedValueacceptedRoundId)。由于后续的Accept!(...)消息,它可能会覆盖这些消息。

当节点从Proposer收到Prepare!(roundId)消息时,它将roundId存储为promiseRoundId = max(roundId, promiseRoundId)。然后它会将Promise!(acceptedRoundId, acceptedValue)发送回Proposer。注意:如果某个节点没有收到Accept!(...)消息,则会回复Promise!(null, null)

  

在阶段1a:是否包含与准备消息达成一致的值,或者是否延迟到接受!信息?或者它确实重要?

无需发送。我没有。

  

在阶段2a中:'如果任何接受者已经接受了值,则领导者必须选择最大提议编号为N'的值。

     

这里有什么价值?是提案编号吗?我不相信,但这句话不清楚。

该值是算法达成共识的实际数据。我将此改为

要开始接受阶段,提议者必须根据准备阶段的结果选择要接受的值。如果任何Acceptor回复Promise(roundId,value),则Proposer必须使用与最高roundId关联的值。否则,Proposer只收到Promise(null,null),并可以选择任何值发送给接受者。

注意:这里的提案号与roundId相同。

  

在阶段2a:'否则,投标人可以自由选择任何值'。这是什么意思?什么价值?对于提案编号?

这是您希望达成共识的价值。这通常是跨分布式系统的状态更改,可能由客户端请求触发。

  

Paxos似乎依赖于增加的N(提案号)值来运作?这是对的吗?

     

维基百科条目不讨论节点在开始参与Paxos之前应该设置的初始值。这些是什么?

圆形ID(也就是提议编号)应该增加,必须在所有节点上每个实例都是唯一的。 Paxos论文假设您可以这样做,因为实现它是微不足道的。这是一种在所有节点上产生相同结果的方案:

  1. 假设有M个节点参与Paxos实例。
  2. 按字典顺序对所有节点排序。 index [node]是此排序列表中节点的索引。
  3. roundId = i*M + index[node]其中i是第i个循环,此节点正在启动(即每个paxos实例的每个节点i是唯一的,并且单调递增)。
  4. 或伪代码(显然缺少一些主要的优化):

    define runPaxos( allNodesThisPaxosInstance, myValue ) {
        allNodesThisPaxosInstance.sort()
        offset = allNodesThisPaxosInstance.indexOf( thisNode )
        for (i = 0; true; i++) {
            roundId = offset + i * allNodesThisPaxosInstance.size()
            prepareResult = doPreparePhase( roundId )
    
            if (!prepareResult.shouldContinue?)
                return
    
            if (prepareResult.hasAnyValue?)
               chosenValue = prepareResult.valueWithHighestRoundId
            else
                chosenValue = myValue
    
            acceptResult = doAcceptPhase( roundId, chosenValue )
    
            if (!acceptResult.shouldContinue?)
                return
        }
    }
    

答案 1 :(得分:2)

我发现以下document更详细地解释了Paxos。我已相应更新了维基百科条目。

我能找到的问题的答案是:

  

Paxos不会进入无限   循环?

只有至少法定数量的节点可以相互通信(在我们的例子中为5),Paxos才有效。因此,如果节点无法与至少一个法定数量的节点通信,则不应尝试Paxos。

  

'接受的最后一个价值'是什么?

这是最后接受的命题编号和相应的值。

  

在这种情况下,'实例'究竟是指什么?

指的是接受者。

  

是否包含值得商定的价值   与准备消息或是这样   推迟到接受!信息?或者它   重要吗?

该值不包含在Prepare消息中,它留给Accept Request消息。

  

这里有什么价值?是提案吗?   数?我不相信,但这句话   目前还不清楚。

     

'否则,提议者可以自由选择   选择任何价值'。这是什么   意思?什么价值?为了   提案号?

如果接受者已经接受了提议者的提议,他们可以返回相应的提案号和值,否则没有。

第二个问题出现了,因为维基百科条目具有误导性。可以为给定提案选择任意值,也可以从与之前接受的提案相对应的值中推导出该值。

  

Paxos似乎依赖于增加的N(提案号)值来运作?这是对的吗?

是。提议者需要越来越多地对其提案进行编号。

  

维基百科条目不讨论节点在开始参与Paxos之前应该设置的初始值。这些是什么?

节点应保留其最后接受的提议编号,并最终保留相应的值。他们应该坚持下去。第一次连接时,给定提议者的初始提议编号应为null(或任何等效文件)。

答案 2 :(得分:0)

Paxos seems to rely on an increasing value of N (proposal number) to work? Is this correct?

每个提议者都有稳定的存储空间。每个提议者都会记住(在稳定存储中)它尝试发布的编号最高的提案,并开始第1阶段的提案编号高于其已使用的提案编号。