如何确定并发Vector时钟上的最后一次写入胜利



我只想跟踪最近的数据,并在解决问题时使用矢量时钟的帮助,这样我就可以通过L-W-W规则轻松丢弃数据。(最后一次写入获胜)假设我们有3个节点:

- Node1
- Node2
- Node3

然后,我们将使用矢量时钟来跟踪每个事件/更改的因果关系和并发性。我们最初用表示矢量时钟

{Node1:0, Node2:0, Node3:0}.

例如,Node1得到5个本地更改,这意味着我们将其时钟增加5个增量,这将导致

{Node1: 5, Node2:0, Node3:0}.

这通常是可以的,对吧?

那么,如果Node2同时更新其本地并增加其时钟,从而进入呢

{Node1:0, Node2:1, Node3:0}.

在某个时刻,Node1向Node3发送一个事件,传递更新并搭载其vectorlock。因此,VC为{Node1:0, Node2:0, Node3:0}的Node3可以很容易地将数据和时钟合并,因为它还没有变化。

我正在考虑如何处理的问题是,如果Node2向Node3发送一个事件来更新,并通过它自己的VC和更新,会发生什么。数据和时钟会发生什么。当从Node1写入Node3的第一个写入基本上会显示为后一个写入时,我如何在这里应用Last Write获胜,因为它在自己的时钟上有更大的VC值。Node3合并前的时钟:{Node1: 5, Node2: 0 , Node3: 1}Node3收到的Node2的消息VC:{Node1:0, Node2:1, Node3:0}

如何处理在并发VC上解析数据?

这是个好问题。遇到此问题是因为您在矢量时钟中使用计数器,并且没有在节点之间同步计数器。你有几个选择:

  1. 通过一个主服务器提交所有写入。主服务器可以对所有写入应用总顺序,然后将它们发送到要存储的各个节点。了解一下你的系统背景会很有帮助。例如,为什么有三个独立的节点?它们的存在是为了提供复制和可用性吗?如果是这样的话,这种主服务器方法会很好地工作
  2. 如谷歌的Spanner论文所述,保持服务器的时间同步。然后,您可以使用基于服务器时间的时间戳,而不是为矢量时钟中的每个节点使用单调递增的计数器。同样,了解你的系统背景会很有帮助。如果您的系统仅由提交写入的人工用户组成,那么您可能能够在不违反LWW不变量的情况下使用NTP保持服务器的时间松散同步

相关内容

最新更新