我在Paxos paxos value choice上看过这篇文章 但我还不清楚。假设我们第一次运行Paxos并且Proposer发送Prepare和Acceptors回复(null,null),因为他们没有学习任何值,因此Proposer同意自己的值并将其发送给他们接受的接受者。令我困惑的是,当Proposer收到Promise-acks并需要发送Accept消息时:
如果任何接受方先前已接受任何提案,则他们会将其值发送给提案人,提案人现在必须将其提案的值设置为与接受方报告的最高提案号相关联的值。 (来自维基百科)
我不明白这一点 - 选择“与受理人报告的最高建议编号相关的价值”有什么意义?有人可以用一个例子来解释这个吗?
答案 0 :(得分:2)
在许多分布式协议和无锁/无等待算法中,演员将完成另一个演员可能没有完成的工作。 Paxos的提议者将尽可能完成其他提议者的工作。 (并不是所有关于其他提议者的问题。)如果原始提议者或某些接受者在算法过程中变得不可用,这非常重要。
例如,最初的Proposer(保罗)发出他的准备和接受,但在将接受发送给其中一个接受者之前死亡(Art)。大多数受体已经接受了值(A),因此选择了该值,但整个系统可能对此一无所知。随着另一个提议者,佩吉。她发出了自己的建议,并从亚当那里得知A值已被某人接受。注意,它可能是也可能不是多数。为了安全起见,她发回A,现在Art了解了价值。
Paul Alice Adam Art Peggy
|-propose(1)--->|---->|--->|
|<----ack(_,_)--|-----|----|
|-accept(A,1)-->|---->| X +
X |<----|<---|<---propose(2)-|
X |------ack(A,1)----->|
|-ack(_,_)----->|
|<----|<---|<--accept(A,2)-|
|-----|----|-ack---------->|
你可以看到至少发生了两件事:在准备阶段,Peggy 学会了接受的价值;在接受阶段,她将所选值传播给其余的接受者。
不一定是大多数接受者接受该值的情况,如上例所示。但佩吉只有在发出接受信息之前,才需要等待大部分准备工作。这是因为简单多数接受的答案将始终包含所选值。
(注意,如果Peggy 不发出值A,她将更改所选答案,这违反了共识不变量。)
让我们再举一个例子,其中prepare-ack返回多个值:(A,1)和(B,2)。我们可以从这种情况中做出一些推论。
更新:回答评论中的几个问题。
客户在这一切中扮演什么角色?
这取决于应用程序。我维护的Paxos应用程序由两种类型的外部事件驱动:时间和客户端写入请求。客户端请求写入数据库;服务器使用Paxos来复制并同意写入;然后将结果发送回客户端。 my 应用程序中的客户端根本不了解Paxos,也不参与协议。
在其他应用程序中,客户端可以扮演提议者的角色。
为什么Peggy在准备阶段后没有使用自己的价值?
首先,请注意Peggy只等待简单多数的接受者[ceil( N/2 )
]作出回应。这意味着佩吉不知道ceil( N/2 ) - 1
接受者的结果。该数字比简单多数少一个。
如果Peggy从准备阶段收到一个值,她必须假设其余主机也具有该值。这将超过简单多数的阈值,意味着该值可以由多数选择。如果Peggy 使用她自己的值应该(有时会)违反共识不变量一旦选择了一个值,就会始终选择相同的值。
为什么Peggy会使用与准备阶段返回的最高值相关联的值?
对此的答案就在更新之上,她考虑了准备阶段返回的多个值。基本上,她认为最高的回报值已被大多数接受者所接受;并且大多数接受者将拒绝任何具有较低round-id的值(他们将会这样做)。