algorithm - 解释 Merkle 树用于最终一致性

标签 algorithm nosql cassandra amazon-dynamodb riak

Merkle Trees在几个分布式、复制的键/值存储中用作反熵机制:

毫无疑问,反熵机制是一件好事—— transient 故障在生产中经常发生。 我只是不确定我是否理解为什么 Merkle 是流行的方法。

  • 将完整的 Merkle 树发送给对等点涉及向该对等点发送本地 key 空间,以及 每个键值的哈希值,存储在树的最低层。

  • 区分来自对等方的 Merkle 树需要拥有您自己的 Merkle 树。

既然双方手头上必须已经有一个排序的键/值哈希空间,为什么不进行线性合并来检测差异呢?

我只是不相信树结构在您考虑维护成本时提供任何形式的节省,而且事实 树叶上的线性传递已经完成,只是为了通过网络对表示进行序列化

为了解决这个问题,一个稻草人的替代方案可能是让节点交换哈希摘要数组, 它们通过模数环位置进行增量更新和分桶。

我错过了什么?

最佳答案

Merkle 树限制同步时传输的数据量。一般假设是:

  1. 网络 I/O 比本地 I/O + 计算哈希更昂贵。
  2. 转移整个排序的键空间比逐步限制几个步骤的比较更昂贵。
  3. 关键空间的差异少于相似之处。

Merkle Tree 交换看起来像这样:

  1. 从树的根开始(一个哈希值的列表)。
  2. 源端发送当前级别的哈希列表。
  3. 目的地将散列列表与它自己的散列列表进行比较,然后 请求不同的子树。如果没有 差异,请求可以终止。
  4. 重复步骤 2 和 3,直到到达叶节点。
  5. 源端发送结果集中键的值。

在典型情况下,同步 key 空间的复杂度将为 log(N)。是的,在没有共同键的极端情况下,该操作相当于发送整个排序的哈希列表,O(N)。可以通过在写入进入时动态构建 Merkle 树并将序列化形式保存在磁盘上来分摊构建 Merkle 树的费用。

我不能说 Dynamo 或 Cassandra 如何使用 Merkle 树,但 Riak 停止使用它们进行集群内同步(在大多数情况下提示切换和读取修复就足够了)。我们计划稍后在一些内部架构位更改后将它们添加回来。

有关 Riak 的更多信息,我们鼓励您加入邮件列表:http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com

关于algorithm - 解释 Merkle 树用于最终一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5486304/

相关文章:

node.js - 构建我的 Mongoose 模式 : embedded array , 填充的最佳方法,子文档?

java - 如何在Jmeter beanshell处理器中生成timeuuid?

algorithm - [i, j] 范围内的第 k 阶统计量

arrays - 将数组分成 K 个部分

c++ - ICP的保证,内部指标

node.js - 如何在 Neo4j 中创建 Node (如果不存在)

mongodb - Mongo 中的分箱和制表(唯一/计数)

python - 从 Python 使用 Titan Graph 数据库

session - 什么用于 session 管理?

Python find number 步骤将值分配给列表中的元素