如何确定并发 Vector 时钟的 Last write win?

How to determine Last write win on concurrent Vector clocks?

我只想跟踪最近的数据,并借助 Vector clocks 解决问题,这样我就可以通过 L-W-W 规则轻松丢弃数据。(最后写入获胜) 假设我们有 3 个节点:

- Node1
- Node2
- Node3

然后我们将使用矢量时钟来跟踪每个 events/changes 上的因果关系和并发性。我们最初用

表示矢量时钟
{Node1:0, Node2:0, Node3:0}.

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

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

这通常没问题吧?

然后,如果 Node2 同时更新其本地并增加其时钟,结果会怎样

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

在某个时候,Node1 向 Node3 发送一个事件,传递更新并搭载其矢量时钟。因此,具有 {Node1:0, Node2:0, Node3:0} 的 VC 的 Node3 很容易合并数据和时钟,因为它还没有任何变化。

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

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

这是个好问题。你 运行 陷入这个问题是因为你在矢量时钟中使用计数器,并且你没有跨节点同步计数器。您有几个选择:

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