我啥时候使用像 Paxos 这样的共识算法而不是使用像 Vector Clock 这样的东西?

Posted

技术标签:

【中文标题】我啥时候使用像 Paxos 这样的共识算法而不是使用像 Vector Clock 这样的东西?【英文标题】:When do I use a consensus algorithm like Paxos vs using a something like a Vector Clock?我什么时候使用像 Paxos 这样的共识算法而不是使用像 Vector Clock 这样的东西? 【发布时间】:2017-09-19 03:10:44 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

最后,让我们逐字逐句回答你的问题:

我会在什么样的系统中使用矢量时钟之类的东西?

您可能希望将版本向量用于无领导分布式存储。您也可以使用矢量时钟(尽管它是 a worse fit;文章还建议您将其用于一致的快照,用于在一般分布式系统中实现 causal ordering 等)。

哪个系统最适合使用 Paxos 之类的东西?

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

这两者是互斥的吗?

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

【讨论】:

> 通过共识协议协商一个值需要时间。称其为“谈判”是否合适?领导者只是将价值观推给追随者。还值得指出的是,虚线版本向量是跟踪值修订之间依赖关系的“更正确”的工具。 @Alexey 我的意思是“谈判领导”,谢谢你的纠正。如果您仍然不同意,请告诉我,或随时编辑答案。 您提到了“多主分布式存储”,如果我的理解是正确的,那么在网络分区的情况下会发生这种情况。是否存在多个领导者存在于同一网络中的情况? Paxos 是否有助于决定多个领导者? 非常好的答案。如果你能给出一些版本向量如何工作的真实例子,那就太好了

以上是关于我啥时候使用像 Paxos 这样的共识算法而不是使用像 Vector Clock 这样的东西?的主要内容,如果未能解决你的问题,请参考以下文章

分布式环境RAFT一致性共识算法解读

分布式系统之Raft共识算法

共识机制演绎: paxos, 从入门到raft

类Paxos共识算法研究进展

雷火UX数据挖掘初识分布式共识算法Basic Paxos

paxos算法理解