Paxos算法(http://research.microsoft.com/en-us/um/people/lamport/pubs/paxos-simple.pdf)中有一点我不明白。这是关于如何处理差距,本文描述了两种方式:
领导者以及学习领导者知道的所有命令的任何其他服务器现在可以执行命令1-135。然而,它也不能执行它也知道的命令138-140,因为还没有选择命令136和137。 T 他的领导者可以将客户请求的下两个命令作为命令136和137。相反,我们通过提出一个特殊的“no-op”命令,让命令136和137立即填补空白。状态不变。 (它通过执行一致性算法的实例136和137的阶段2来实现。)一旦选择了这些无操作命令,就可以执行命令138-140。
第二个选项已被提及Why is it legit to use no-op to fill gaps between paxos events。
我的问题是关于第一个问题。在我看来,接下来的两个命令会违反一致性,因为稍后发生的实例可能会有一个较小的序列号。那为什么它仍然合法?
答案 0 :(得分:1)
由于所有客户都看到相同的一致结果,因此不会违反一致性。所以没有违反算法不变量。
如果您考虑所有命令来自单个客户端的情况,那么与客户端发送值的顺序相比,它将是重新排序。如果单个客户端是多线程的,并且如果它流式传输多个并发请求,则重新排序可能是无害的(或不是,取决于应用程序语义)。如果您认为领导者使用noops,那么它实际上只会丢弃一些消息,这些消息可能对客户端无害,这取决于它流式传输的值的排序。这取决于应用程序。
如果您考虑所有值来自不同客户的情况,那么情况就更自然了。在反向条件下,会发生一些重新排序。然而,在正常运行下,这种情况不会发生重新排序它看起来像一些值“花费比正常时间更长”由领导者修复,而后来由其他客户发布的值“跑得更快”。
答案 1 :(得分:0)
第一个选项和第二个选项是相同的。
例如在这个例子中,客户端想要写4个命令,
a = 1
b = 2
c = 3
d = 4
在第一个选项中,结果可能是
a = 1
e = 5
f = 6
d = 4
在第二个选项中,结果是
a = 1
noop
noop
d = 4
所以,这两个结果都是非法的。丢失数据与违反此问题的顺序没有区别。
然后正如@ simbo1905所说,多Paxos不承诺FIFO顺序。
如果136,137和138具有顺序关系,例如它们是由一个TCP连接发送的,则客户端使用管道发送这三个命令。客户有责任按FIFO顺序执行这些操作。如果客户端有许多传出命令,并且客户端需要FIFO客户端命令,则客户端需要从第一个失败命令重试该命令。
另一种情况是它们是由不同的连接发送的。由于是通过不同的连接发送的,服务器不能承诺FIFO客户端的顺序。 136,137次操作失败,任何情况都可以接受,这两项操作可能成功或可能失败。如果客户端想知道结果,客户端应该重试该操作。
在这两种情况下,客户都有责任承诺订单,而不是服务器。
所以我认为你误解了一致性的含义,一致性与秩序无关。这是关于安全和生活