这里的标题可能会产生误导。我将尽力通过一个例子来解释我的疑问。
我正在从 wiki 和其他来源阅读有关 paxos 算法的内容。
1) 想象一下客户端请求更新值的情况(X
在下面的示例中)已被处理。
经过一轮 Paxos 后,得到一个值Vb
之所以被选择,是因为接受者对提案者的回复包含他们之前接受的提案编号和相应的值。在下面的情况下,三个接受者发送(8,Va),(9,Vb),(7,Vc)
给目前拥有的提案者(10,X)
。它拾起(9,Vb)
因为它是收到的最高提案编号并广播该值(10,Vb)
给所有接受者接受。所以初始值X
这整轮 Paxos 的处理从未得到更新。那么在这种情况下更新到X的客户端事务是否失败了呢?
之后Acceptors的最终状态是什么?他们都有吗(10,Vb)
作为他们接受的最高提案数量和价值,从而保持同步?
Client Proposer Acceptor Learner
| | | | | | | --- First Request ---
X-------->| | | | | | Request
| X--------->|->|->| | | Prepare(10)
| |<---------X--X--X | | Promise(10,{(8,Va),(9,Vb),(7,Vc)}
| X--------->|->|->| | | Accept!(10,9,Vb)
| |<---------X--X--X------>|->| Accepted(10,9,Vb)
|<---------------------------------X--X Response
| | | | | | |
2)现在是一个更复杂的情况,在试图达成共识的过程中,在不同的时间点提出了两个提案。想象一下区域 A 中的客户端 C1 正在修改一些数据的情况X
当Region B的客户端C2正在修改相同的数据时,尚未达成共识X
。客户的其中一项请求是否被拒绝?请注意,C2 发生晚于 C1,但尚未达成共识。如果遵循排序,则必须完成C1请求,接受共识,然后处理C2请求。从我的理解来看这个博客 http://angus.nyc/writing/paxos-by-example/,本例中选择C1请求值。
那么C2请求是否被放弃了呢?这可能不是一个好的选择。
示例(版权所有this http://angus.nyc/writing/paxos-by-example/ blog):
在这种情况下,v=8
最终选择了,尽管要求V=5
是客户要求的最新更新。为什么会这样呢?这可能会产生严重影响
感谢您的帮助,祝新年快乐!