我正在学习Paxos算法(http://research.microsoft.com/en-us/um/people/lamport/pubs/paxos-simple.pdf),有一点我不明白。
我们知道事件遵循及时的顺序,并且……
这是一个多部分的答案。
的 提出无操作值是发现命令的方法 强> 尚未进入节点的人。我们不是简单地用no-op命令填充间隙中的每个槽:我们 提出 每个插槽都填充一个no-op。如果 任何 同伴已经接受了一个命令,它将返回该命令 Prepare-ack 消息和提议者将使用 那 在Accept轮次而不是no-op中执行命令。
Prepare-ack
例如,假设一个节点位于临时网络分区后面,并且无法与插槽6-9中的其他节点一起玩。它知道它在第10个插槽中学习命令时错过了。然后它建议no-ops来学习那些插槽中的决定。
实际的实现还有一个带外学习协议,可以批量学习大量的转换。
的 命令在完全命令之前不是命令 决定 ; 强> 直到那时它只是一个 建议 命令。 Paxos是关于在多个客户端的竞争命令之间进行选择。客户必须准备好拒绝他们的命令,因为选择了另一个客户端。
实际的实施都是关于选择 订购 客户端命令。他们的世界观是预写日志,他们将命令放在该日志中。如果没有选择命令,他们会在下一个插槽中重试。 (有很多方法可以减少争用; Lamport提到向领导者转发请求,例如在Multi-Paxos中完成的。)
在提出命令之前,实际系统还有一些方法可以知道命令是否无效;例如知道一组读取和一组写入。这有两个重要原因。首先,它是一个异步的多客户端系统,当客户端的命令到达服务器时,任何事情都可能发生变化。其次,如果两个并发命令不冲突,那么两者都应该能够成功。
无论如何,系统模型允许网络丢失命令(消息)。如果消息丢失,则客户端最终将重试该请求;所以放下一些它是好的。如果客户端的命令必须按客户端顺序执行,则客户端只能同步发送命令;或者命令必须在库中的更高级别进行排序,并在执行之前保存在某个客户端会话对象中。
如果您不想在更高级别实现,则ZFA协议的AFAIK保证客户端顺序。