说明用于最终一致性的默克尔树


79

默克尔树在多个分布式,复制的键/值存储中用作反熵机制:

毫无疑问,反熵机制是一件好事-生产中会发生短暂故障。我只是不确定我是否理解为什么默克尔是流行的方法。

  • 将完整的Merkle树发送给对等方包括将本地密钥空间与每个键值的哈希值一起存储到该对等方,该哈希存储在树的最低级别中。

  • 区分从对等方发送的Merkle树需要拥有自己的Merkle树。

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

我只是不相信在考虑维护成本时,树形结构可以提供任何形式的节省,并且已经完成了在树叶上进行线性传递的事实,只是将导线上的表示序列化

为了解决这个问题,一个稻草人的选择可能是让节点交换哈希摘要的数组,这些哈希摘要通过模环位置进行增量更新和存储。

我想念什么?


2
Merkle树现在在Wikipedia上有其自己的主题:en.wikipedia.org/wiki/Merkle_tree
Trenton

Answers:


88

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

  1. 网络I / O比本地I / O +计算哈希值昂贵。
  2. 转移整个排序的键空间比逐步限制比较需要花费更多的成本。
  3. 密钥空间的差异少于相似性。

Merkle Tree交换看起来像这样:

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

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

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

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


1
啊,来回交换是我所缺少的。谢谢。
Johnny Graettinger

4
它们已在Riak 1.3的AAE实施中重新引入。
Coderoshi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.