我什么时候使用像Paxos这样的共识算法vs使用类似矢量时钟的东西?

时间:2017-04-22 01:13:31

标签: distributed-computing distributed theory

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

我会使用什么样的系统来使用像矢量时钟这样的东西?哪个系统适合使用像Paxos这样的东西?两者是相互排斥的吗?

1 个答案:

答案 0 :(得分:9)

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

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

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

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

最后,让我们从字面上解决你的问题:

  

我会使用什么样的系统来使用像矢量时钟这样的东西?

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

  

哪种系统适合使用像Paxos这样的东西?

单领导或多领导分布式存储。一个很少更新的数据(思考配置),群集参与信息的数据库 - 如果这个信息很关键,那么八卦会更好地扩展。分布式锁。

  

两者是否相互排斥?

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