我什么时候使用像 Paxos 这样的共识算法与使用像 Vector Clock 这样的算法?

When do I use a consensus algorithm like Paxos vs using a something like a Vector Clock?

我已经阅读了很多有关保证分布式系统中节点之间一致性的不同策略的文章,但我在确定何时使用哪种算法时遇到了一些麻烦。

我会在什么样的系统上使用矢量时钟之类的东西?哪个系统最适合使用类似 Paxos 的系统?两者是相互排斥的吗?

有一个存储数据的 2 个节点的分布式系统。数据被复制到两个节点,这样如果一个节点死亡,数据不会丢失(持久性)并继续提供服务(可用性)。您还希望您的 2 节点系统每秒处理两倍的请求(可扩展性)。

假设对单个键的写入可以到达任何节点。您的客户写入“1”作为某个键的值,然后 它决定写入“2”。第一次写入到节点#1。它向节点#2 发出复制请求。但是,您存储“2”的请求比复制请求更早到达节点#2(我们可以存储在任何节点上,请记住)。它存储“2”,向节点#1 发出带有“2”的复制请求,从它接收带有“1”的复制请求,将其“2”更改为“1”,而节点#1 将其“1”更改为“2”。现在您的存储节点之间的数据不一致。另外,如果 node#1 死了,你所拥有的只是 node#2 的值为“1”,而你记得很清楚你发送了“2”after“1”,并且存储系统确认保存。实际上,很多事情可能会发生 "wrong",这取决于您对存储系统的期望(读取您的写入?单调读取?等),因此您需要一种方法来实际找出真正的、好的、实际的价值关键是,甚至可以防止系统以这种方式获取"corrupting"数据。为此,存储系统需要知道在其节点之间发生了什么之前发生了什么,或者它甚至可能包括您的客户对事件顺序的看法。 Vector clocks and version vectors 是实践中用于实现这一点的一些技术,或者声称 2 个事件同时发生,您需要一些其他方法来决定它们的结果。

您决定以不同的方式解决问题以避免所有这些复杂性:对某个键的所有写入都将转到一个节点(称为 "leader"),并将这些写入复制到另一个节点。事实上,这看起来像是一个更简单的方案:在一个节点(可能是一个进程)内,您拥有快速且经过验证的并发控制技术,可以轻松地对事件进行排序,可以以相同的顺序应用复制;此外,始终有正确数据的权威来源。唯一的问题是您的 2 个存储节点需要同意哪个节点是特定密钥的领导者。如果你有 3 个节点,其中一个死了,那么其他 2 个节点将需要决定 1) 他们都认为旧的领导者死了,2) 其中一个是新的领导者。为此,存在共识协议(Paxos, 2-phase commit, Raft、Zab、三阶段提交等)。

为什么不总是选择单一领导者(因此是共识协议)而不是无领导者方案(因此是像版本向量这样的排序机制)?谈判领导需要时间(想想几秒或几十秒),在此期间您的系统在某些特殊模式下不可用或部分可用。无领导者在其他一些条件下也可以表现得更好(例如,领导者由于软件问题或网络问题而变慢:使用无领导者方法,其他节点可能会接管其职责)。随着参与者数量的增加,共识变得更加困难,因此无领导者可以更好地扩展。

最后,让我们从字面上快速浏览一下您的问题:

With what kind of system would I use something like a vector clock?

您可能希望将版本向量用于无领导的分布式存储。您可能会使用相同的矢量时钟(尽管在一般分布式系统等中它是 a worse fit; the article also suggests you use it for consistent snapshots, for implementing causal ordering)。

Which system is ideal for using something like Paxos?

单领导者或多领导者分布式存储。一个很少更新数据的数据库(想想配置),集群参与信息——如果这个信息很重要,否则八卦扩展得更好。分布式锁。

Are the two mutually exclusive?

没有。两者都可以用于解决相同的任务(例如分布式存储)。它们可以组合(用于集群参与的 paxos,然后使用该知识来确定哪些节点在最终一致(通过版本向量)系统中形成法定人数)。