0

背景:我正在尝试实现 Amazon Dynamo 的副本同步,它使用默克尔树来检测副本之间的分歧。

如本文的网络版本中所述,

Dynamo 使用 Merkle 树进行反熵,如下所示:每个节点为其托管的每个键范围(虚拟节点覆盖的键集)维护一个单独的 Merkle 树。这允许节点比较键范围内的键是否是最新的。在该方案中,两个节点交换与它们共同托管的键范围相对应的 Merkle 树的根。随后,使用上述树遍历方案,节点确定它们是否有任何差异并执行适当的同步操作。

我不明白“适当的同步操作”是什么意思。通过使用适当的遍历,假设我们发现两个默克尔树的根节点之间存在差异——我们如何知道哪一个是正确的?我们是否总是根据其逻辑时钟时间戳获取更新较多的那个?

4

1 回答 1

0

您链接的 Dynamo 论文(请注意,这今天的 DynamoDB 产品不同,因此我删除了您在问题中添加的 dynamodb 标签),解释了如何使用矢量时钟(不是t 像“时间戳”一样简单):

Dynamo 使用矢量时钟来捕捉同一对象的不同版本之间的因果关系。矢量时钟实际上是(节点,计数器)对的列表。一个矢量时钟与每个对象的每个版本相关联。通过检查它们的矢量时钟,可以确定一个对象的两个版本是否在并行分支上或具有因果顺序。如果第一个对象时钟上的计数器小于或等于第二个时钟中的所有节点,则第一个是第二个的祖先,可以被遗忘。否则,这两个变化被认为是冲突的,需要和解。

换句话说,通常 Dynamo 可以根据矢量时钟判断哪个值是较新的(论文详细解释了这意味着什么),但也可能存在冲突 - 假设读取和修改了同一个项目同时,并且不同地,通过两个不同且不通信的副本。在这种情况下,两个版本的数据都将保存在数据库中并返回给客户端,客户端需要使用一些特定于客户端的逻辑来协调它们。例如,在亚马逊的购物车示例中,如果一项修改是将产品 A 添加到购物车,而第二项修改是将产品 B 添加到购物车,则协调是将产品 A 和 B 添加到购物车。

于 2020-02-27T10:20:33.983 回答