为什么Paxos需要两个阶段(prepare/promise
+ accept/accepted
)而不是一个阶段?也就是说,仅使用prepare/promise
部分,如果提议者已经从大多数接受者那里收到回复,则选择该值。
问题是什么,它会破坏安全性或活力吗?
答案 0 :(得分:2)
它违反了完整的协议,打破了安全。
多paxos的典型实现具有稳态模式,其中稳定的领导者流传输包含新值的Accept
消息。只有当问题发生时(领导者崩溃,失速或被网络问题划分),新领导者才需要发出准备消息以确保安全。完整的描述是在write-up of how TRex开源Paxos库中实现了Paxos。
考虑TRex可以正确处理的以下崩溃场景:
A
,B
,C
A
领先V1
发送给领导者A
A
处于稳定状态,因此将accept(n, V1)
发送到节点B
和C
。网络开始出现故障,因此只有B
才能看到该消息,并且会回复accepted(n)
A
看到响应并拥有多数{A,B}
,因此它知道由于协议的安全性证明该值已修复。 A
尝试将结果广播给每个人,就像它的服务器已经死亡一样。只有发出V1
的客户端应用程序才会收到消息。想象一下V1
是客户订单,并且在得知订单被修复后,客户应用程序会对客户信用卡进行债务。 C
超时失败的领导者并试图领导。它从未见过值V1
。如果不回滚订单V1
,它就不能随意选择任何新值,但客户已被收费。 C
首先发出prepare(n+1)
,节点B
以promise(n+1, V1)
响应。 C
然后发出accept(n+1, V1)
,只要其余消息通过节点B
和C
,就会知道选择了值V1
。 直观地说,我们可以说节点C
已选择通过选择A
的值与死节点A
进行协作。如此直观地我们可以看出为什么必须有两轮。第一轮需要发现是否还有待完成的工作。第二轮用于修复正确的值,以使系统内的所有进程保持一致。
答案 1 :(得分:0)
这并不完全准确,但您可以将这两个阶段视为1)复制数据,然后2)提交数据。如果数据刚刚复制到其他服务器,那么这些服务器将不知道是否有足够的其他服务器具有可被认为可安全服务的数据。因此,第二阶段让服务器知道他们可以提交数据。
Paxos比这更复杂,它允许它在任一阶段的失败期间继续。 Paxos证明的一部分是完全执行此操作的 minimal 协议。也就是说,其他协议可以做更多工作,因为它们会增加更多功能,或者因为它们的设计很差。