背景

Cassandra的逆熵功能使用Merkle树来检测副本之间的数据不一致。

定义

Merkle树是一种哈希树,其中的叶子包含各个数据块的哈希值,父节点包含其各自的子节点的哈希值。它提供了一种有效的方法来查找副本上存储的数据块中的差异,并减少了传输以比较数据块的数据量。

Cassandra的Merkle树(org.apache.cassandra.utils.MerkleTree)的实现使用完美的二叉树,其中每个叶子都包含行值的哈希,每个父节点都包含其左右子节点的哈希。在一棵完美的二叉树中,所有叶子都处于同一水平或相同深度。深度为h的完美二叉树包含2 ^ h树叶。换句话说,如果范围包含n个标记,则表示该范围的Merkle树包含log(n)级别。

执行nodetool repair命令时,在命令中用-h选项指定的目标节点会协调每个键空间中每个列系列的修复。修复协调器节点从每个副本请求Merkle树以获取特定的令牌范围,以对其进行比较。每个副本通过扫描在请求的令牌范围内本地存储的数据来构建Merkle树。修复协调器节点比较Merkle树,找到所有副本之间不同的子令牌范围,并修复这些范围内的数据。

复制节点为每个列族构建一个Merkle树,以表示给定令牌范围内的行的哈希。使用RandomPartitioner时,令牌范围最多可以包含2 ^ 127个令牌。需要深度为127的Merkle树,其中包含2 ^ 127个叶子。Cassandra构建了深度为15的Merkle树的紧凑版本,以减少用于存储树的内存使用量,并最小化将Merkle树传输到另一个节点所需的数据量。它将扩展树,直到将给定的令牌范围划分为32768个子范围。在树的紧凑版本中,每个叶子表示其各自子范围中所有行的哈希。无论其大小和拆分程度如何,如果两棵Merkle树具有相同的哈希深度,就可以对其进行比较。

例如,令牌范围(0,256]包含256个子范围(0,1],(1,2] ...(255,256],每个包含单个令牌。深度为8的完美二叉树需要在叶子上存储所有256个子范围散列。深度为3的同一版本的树的紧凑版本仅包含8个代表子范围(0,32],(32,64] ...(224,256]子集散列的叶子包含32个令牌。在此紧凑型树中,每个叶哈希是深度为8的理想二叉树中其下所有节点的计算哈希。

构建Merkle树(递归)

RandomPartitioner均匀地分配key,因此通过将给定标记范围分成两个相等的子范围,直到达到最大子范围数,从而递归构造Merkle树。将根节点添加给定的令牌范围(左,右),并在令牌的范围内将其分为两半,令牌位于范围的中点。左侧的子节点添加范围(左,中点)和在右边的子节点上添加范围覆盖(中点,右边),重复此过程,直到将所需数量的叶子(子范围)添加到树上为止。

将下一行哈希按排序顺序添加到Merkle树中。通过计算行值的MD5摘要来计算每行的哈希值,该值包括行的列数,列名和列值,但不包括行键和行大小。删除的行(逻辑删除)哈希也会添加到树中,其中包括删除时间戳。行哈希基于其令牌添加到Merkle树叶。如果叶子的子范围包含多行,则使用XOR操作通过组合其范围所覆盖的所有行的哈希来计算其哈希。非叶节点哈希值是通过对各自子节点的哈希值执行XOR计算得出的。

比较默Merkle树(递归)

如果两棵Merkle树都覆盖相同的令牌范围,则无论它们的大小如何,都将对其进行比较。从根哈希开始递归比较树。如果两个树中的根哈希都匹配,则树的令牌范围中的所有数据块在副本之间都是一致的。如果根哈希不一致,则比较左子哈希,然后再比较右子哈希。进行比较,直到计算出两棵树之间的所有令牌范围都不同为止。

Q&A

Q:如何保证节点保存的token范围都是一致的??
A:因为Cassandra的复制节点是顺时针进行制定的,复制的数量由复制因子决定,而比较就发生这些节点之间

小结

Merkle树不仅可以快速比较 多个文件是否完全相同,而且如果不同可以快速定位到不相同的文件

参考

http://distributeddatastore.blogspot.com/2013/07/cassandra-using-merkle-trees-to-detect.html

使用Merkle树检测数据不一致(翻译)的更多相关文章

  1. Merkle 树——空间换时间,分而治之的hash表,通过根节点是由它的两个子节点内容的哈希值组成来校验数据完整性,定位篡改的数据位置

    Merkle 树 图 1.5.6.1 - Merkle 树示例 默克尔树(又叫哈希树)是一种二叉树,由一个根节点.一组中间节点和一组叶节点组成.最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的 ...

  2. Merkle树

    在分布式系统.P2P应用中或者是区块链中,会经常使用一种数据结构Merkle tree(默克尔树),这里我们将详细讨论一下这个常用数据结构. Merkle tree Merkle树看起来非常像二叉树, ...

  3. [区块链] 密码学——Merkle 树

    在计算机领域,Merkle树大多用来进行完整性验证处理.在处理完整性验证的应用场景中,特别是在分布式环境下进行这样的验证时,Merkle树会大大减少数据的传输量以及计算的复杂度. Merkle哈希树是 ...

  4. [转帖]Merkle树

    Merkle树 https://www.jianshu.com/p/fc439a8fd0de 所谓比特币交易就是从一个比特币钱包向另一个中转账,每笔交易都有数字签名来保证安全.一个交易一旦发生那么就是 ...

  5. 区块链学习1:Merkle树(默克尔树)和Merkle根

    ☞ ░ 前往老猿Python博文目录 ░ 一.简介 默克尔树(Merkle tree,MT)又翻译为梅克尔树,是一种哈希二叉树,树的根就是Merkle根. 关于Merkle树老猿推荐大家阅读<M ...

  6. C# TCP socket发送大数据包时,接收端和发送端数据不一致 服务端接收Receive不完全

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  7. 比特币区块结构Merkle树及简单支付验证分析

    在比特币网络中,不是每个节点都有能力储存完整的区块链数据,受限于存储空间的的限制,很多节点是以SPV(Simplified Payment Verification简单支付验证)钱包接入比特币网络,通 ...

  8. 经常在比特币中看到的merkle树是什么?

    区块基础-merkle树   Merkle tree中文叫做梅克尔树,这当然不是一棵真正的植物树,merkle tree是计算机数据结构中的一种树,是由计算机科学家 Ralph Merkle 提出的, ...

  9. cpp 区块链模拟示例(七) 补充 Merkle树

    Merkle 树 完整的比特币数据库(也就是区块链)需要超过 140 Gb 的磁盘空间.因为比特币的去中心化特性,网络中的每个节点必须是独立,自给自足的,也就是每个节点必须存储一个区块链的完整副本.随 ...

随机推荐

  1. H3C PPP协议的组成

  2. H3C HDLC概述

  3. [转]MySQL常用查询

    单表查询 ①查询所有     * mysql> select * from student; ②查询选中字段记录 mysql> select s_name from student; ③条 ...

  4. Python--day38---进程间通信--初识队列(multiprocess.Queue)之生产者,消费者模型

    1,生产者消费者模型.py import random import time from multiprocessing import Queue, Process def producer(name ...

  5. 洛谷4139 bzoj 3884 上帝与集合的正确用法

    传送门 •题意 求$2^{2^{2^{2^{2^{2^{...^{2}}}}}}}$ (无穷个2) 对p取模的值 •思路 设答案为f(p) $2^{2^{2^{2^{2^{2^{...^{2}}}}} ...

  6. Linux 内核 动态设备

    术语"热插拔"最普遍使用的意义产生于当讨论这样的事实时, 几乎所有的计算机系统现在 能够处理当系统有电时设备的出现或消失. 这非常不同于只是几年前的计算机系统, 那时 程序员知道他 ...

  7. CF1045G AI robots

    CF1045G AI robots 题目大意就不说了 这道题可以用CDQ分治做 但是,如何选择CDQ分治的维度一直是CDQ分治的难点所在 这道题我们有三种选择 1.让智商高的数智商低的 2.让看的近的 ...

  8. Luogu P4173 残缺的字符串-FFT在字符串匹配中的应用

    P4173 残缺的字符串 FFT在字符串匹配中的应用. 能解决大概这种问题: 给定长度为\(m\)的A串,长度为\(n\)的B串.问A串在B串中的匹配数 我们设一个函数(下标从\(0\)开始) \(C ...

  9. 17.python内置函数2

    python内置函数1:https://www.cnblogs.com/raitorei/p/11813694.html # max,min高级玩法 # l=[1,3,100,-1,2] # prin ...

  10. iOS @property、@synthesize和@dynamic

    @property @property的本质: @property = ivar(实例变量) + getter/setter(存取方法); 在正规的 Objective-C 编码风格中,存取方法有着严 ...