Amazon Dynamodb:使用 Merkle 树的反熵副本同步
Posted
技术标签:
【中文标题】Amazon Dynamodb:使用 Merkle 树的反熵副本同步【英文标题】:Amazon Dynamo: Anti-Entropy Replica Synchronisation using Merkel Trees 【发布时间】:2020-06-11 05:19:42 【问题描述】:上下文:我正在尝试实现 Amazon Dynamo 的副本同步,它使用默克尔树来检测副本之间的分歧。
如网络版论文here中所述,
Dynamo 使用 Merkle 树进行反熵,如下所示:每个节点为其托管的每个键范围(虚拟节点覆盖的键集)维护一个单独的 Merkle 树。这允许节点比较键范围内的键是否是最新的。在该方案中,两个节点交换与它们共同托管的键范围相对应的 Merkle 树的根。随后,使用上述树遍历方案,节点确定它们是否有任何差异并执行适当的同步操作。
我不明白“适当的同步操作”是什么意思。 通过使用适当的遍历,假设我们发现两个默克尔树的根节点之间存在差异——我们如何知道哪一个是正确的?我们是否总是根据其逻辑时钟时间戳获取更新较多的那个?
【问题讨论】:
【参考方案1】:您链接的 Dynamo 论文(请注意,这与今天的 DynamoDB 产品不相同,因此我删除了您在问题中添加的 dynamodb 标签),解释了两个版本之间的协调如何完成,使用矢量时钟(不像“时间戳”那么简单):
Dynamo 使用矢量时钟来捕捉同一对象的不同版本之间的因果关系。矢量时钟实际上是(节点,计数器)对的列表。一个矢量时钟与每个对象的每个版本相关联。通过检查它们的矢量时钟,可以确定一个对象的两个版本是否在并行分支上或具有因果顺序。如果第一个对象时钟上的计数器小于或等于第二个时钟中的所有节点,则第一个是第二个的祖先,可以被遗忘。否则,这两个更改被认为是冲突的,需要协调。
换句话说,通常 Dynamo 可以根据矢量时钟判断哪个值是较新的(论文详细解释了这意味着什么),但也可能存在冲突 - 假设同一个项目是由两个不同且不通信的副本同时且不同地读取和修改。在这种情况下,两个版本的数据都将保存在数据库中并返回给客户端,客户端需要使用一些特定于客户端的逻辑来协调它们。例如,在亚马逊的购物车示例中,如果一项修改是将产品 A 添加到购物车,而第二项修改是将产品 B 添加到购物车,则协调是将产品 A 和 B 添加到购物车。
【讨论】:
以上是关于Amazon Dynamodb:使用 Merkle 树的反熵副本同步的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Node 中使用 Amazon 的 Dynamodb Local?
使用“where”条件从 Amazon DynamoDB 获取项目
使用 Amazon Dynamodb 进行不区分大小写的查询
是否可以使用 Amazon Cognito 组来设置对 AW 资源(例如 Amazon DynamoDB 和 Amazon S3)的权限?
Amazon DynamoDB:警告“配置的 dynamodb 表 JobDetails 的写入吞吐量小于集群映射容量”