在paxos算法的第二阶段,如果接受者先前已经选择了一个值,则提议者发出一个接受请求,其数量为n
,而接收者得到的值为v
。我的问题是提议者这样做的原因?因为一旦选择了一个值它就是永久性的并且不能被改变,所以在这种情况下,提议者只是学习所选择的值,该值是在准备请求的响应中发送的。为什么要求接受已经接受的值?
答案 0 :(得分:2)
所选择的值必须与最后一位领导者提出的值一致,否则所选择的值可能会丢失。一个有用的思考方式是新提议者选择与旧提议者合作。如果它没有协作,那么就会发生矛盾,我们可能会在分布式系统中产生不一致。
示例:强>
考虑代表多个paxos的所有角色的节点A,B和C.节点A是领导者并提出V1。想象一下,网络出现故障,只有节点A和B能够进行通信,并且只有最少数量的消息才能通过,以便节点A知道选择了V1。
当节点A从节点B听到时,它知道选择V1,因为它具有多数(节点A和B)。它向节点B和C发送消息以表示选择该值,但是如该示例中所述,没有其他消息从节点A获得。节点A执行诸如从金额V1的银行账户支付的钱之类的业务动作。然后节点A崩溃。
节点C现在变成了领导者,并且不知道正确的银行账户余额,也没有关于甚至建议付款的事实。节点B知道在V1中建议付款,但不知道它是否被选中,因为它从未听过节点A的结果。因此节点B也不知道正确的银行账户余额。
您描述的机制正是Node C在选择值V1时如何与死节点A协作。如果没有其他消息丢失,则B和C将进入一致状态,在该状态下,他们同意从银行账户中支付的金额。
显然,如果Node C没有通过Node B发现值V1并且想要提出一些新值,那么我们就会产生矛盾。银行帐户将被损坏,因为付款V1不会反映在每个节点B和C的帐户余额中。
<强>讨论强>
有关您在我的博客文章中询问的机制的详细讨论,其中描述了the leader takeover phase。
我在上面描述的事件中假设了一些标准的实现细节。例如,有人可能会说“不要在没有更多消息的情况下从银行账户转移资金以确认所有节点都知道选择了价值”。然而,Paxos被证明只需要最少数量的消息是安全的,崩溃应该是罕见的。这意味着在实施Paxos时,通常最佳的方法是在正常运行期间使用最少数量的消息,并依靠算法在故障情况下恢复整个系统的一致状态。
有趣的是,可以选择一个值,但没有生命节点知道它。在上面的示例中,节点A运行的时间足以查看来自节点B的消息并在银行帐户之间转移资金。然而,在听到节点A之前它可能已经崩溃了。除了节点B之外,它还会接受V1,但是没有Node知道在节点C发现V1并选择它之前已经选择了该值。
有趣的是,系统的客户,观察银行账户的东西,或从银行账户接收付款的其他系统,也是分布式系统的一部分。如果在这个例子中没有从银行账户付款,那么失去V1就不会有问题。然而,选择价值观会产生副作用是相当正常的。观察系统的第三方系统或用户Web浏览器实际上是分布式系统的一部分。