Merkle tree算法

Merkle Tree是一种用于数据一致性校验的算法,常用于Dynamo等分布式系统中。通过比较Merkle Tree的根节点,可以高效地发现大数据集的差异。在文件同步、BT下载等领域有广泛应用,能有效减少网络传输开销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Merkle Tree原理

Merkle Tree是Dynamo中用来在多个节点之间同步数据集合一致性的算法,Merkle Tree是基于数据Hash构建的一个树。它具有以下几个特点:

(1)数据结构是一个树,可以是二叉树,也可以是多叉树。

(2)Merkle  Tree的叶子节点的值是自己制定的,可以是数据集合的单元数据或者单元数据的hash。

(3)Merkle  Tree非叶子节点的值是其所有子节点值的hash值。


为了更好的理解,我们假设有A和B两台机器,A与B相同目录下有8个文件,分别是f1,f2,f3...f8。这时候我们可以通过Merkle Tree来快速比较。假设在文件创建的时候每个机器都构建了一个Merkle Tree。

由上图可得知,叶子节点node7的value = hash(f1),是f1文件的hash,而父亲节点node3的value = hash(v7,v8),也就是其子节点node7和node8的值的hash。就是这样表示一个层级运算关系。root节点的value是所有叶子节点的value的唯一特征。


假设A上的文件5与B上的不一样。通过两个机器的Merkle Tree信息找到不相同的文件,这个比较检索过程如下:

(1)首先比较v0是否相同,如果不同,检索其孩子node1和node2

(2)v1相同,v2不同。检索node2的孩子node5,node6

(3)v5相同,v6不同,检索比较node5的孩子node11和node12

(4)v11不同,v12相同。node11为叶子节点,获取其目录信息。

(5)检索比较完毕。

以上过程的理论复杂度是log(N).实际过程是大于这个复杂度的,因为不同value的节点需要每个子节点进行比较,过程描述图如下:


从上图可以得知这个过程可以很快的找到对应的不相同的文件。

如果A机器的目录下增加了一个文件f9。整个Merkle Tree就会变成:


其中红色字体是需要进行运算的步骤。整个过程是从叶子节点发起的,直接回溯到root节点为止。


假如目录下的f1被删除。整树的运算变化图如下:


红色字体是需要进行的运算。


从上可以得知,Merkle tree在大数据集合校验可以提高校验效率。从Dynamo论文中可以看出,大量使用Merkle Tree来同步分布式节点的文件和写操作,尤其是在服务节点异常后的情况。

这样,在比较的时候,两个节点首先比较最顶层的tree node,如果相等,那么就不用继续比较了,否则,分别比较左右两个子树。这种模式下,在数据量差异很小的情况下,Merkle Tree可以减少网络传输开销,但是两个参与节点都需要遍历所有数据项以计算Merkle Tree,这是很大的计算开销。


2.Merkle Tree应用

(1)BT下载,少BitTorrent文件的大小

详细可参照:http://blog.youkuaiyun.com/xtu_xiaoxin/article/details/8147956

(2)Amazon Dynamo副本同步
(3)在Git中的使用


参考:
http://blog.youkuaiyun.com/yuanrxdu/article/details/22474697
http://www.douban.com/group/topic/18136435/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值