1

我想只跟踪最近的数据,并利用矢量时钟的帮助来解决问题,这样我就可以通过 LWW 规则轻松丢弃数据。(最后写入获胜)假设我们有 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 发送一个事件,传递更新并搭载其矢量时钟。因此,具有 VC 的 Node3{Node1:0, Node2:0, Node3:0}很容易合并数据和时钟,因为它还没有更改。

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

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

4

1 回答 1

1

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

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