使用Merkle树检测数据不一致(翻译)

背景

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

原文地址:https://www.cnblogs.com/victor2302/p/12207051.html

时间: 2024-10-09 05:23:32

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

1.3.2 区块链中的密码学——Merkle 树

在计算机领域,Merkle树大多用来进行完整性验证处理.在处理完整性验证的应用场景中,特别是在分布式环境下进行这样的验证时,Merkle树会大大减少数据的传输量以及计算的复杂度. Merkle哈希树是一类基于哈希值的二叉树或多叉树,其叶子节点上的值通常为数据块的哈希值,而非叶子节点上的值是将该节点的所有子节点的组合结果的哈希值. 如下图所示为一个Merkle哈希树,节点A的值必须通过节点C.D上的值计算而得到.叶子节点C.D分别存储数据块001和002的哈希值,而非叶子节点A存储的是其子节点C.

Android 开发之开发插件使用:Eclipse 插件 SQLiteManger eclipse中查看数据内容--翻译

最近研究了一段时间Android开发后发现,google自带的ADT工具,缺失一些开发常用的东西,希望可以构建一个类似使用JAVA EE开发体系一样开发的工具包集合,包括前台开发,调试,到后台数据库的管理,到此,在网上逛了一遍发现这个一些常用的插件功能很强大,所以我决定做一系列翻译这些插件安装使用的教程,希望大家喜欢. 本文受益于这篇文章,所以决定翻译这篇文章中的一部分东西工具.19 个 Android 开发工具投递人 itwriter 发布于 2014-05-08 09:32 本文翻译:Ecl

MySQL Replication数据不一致

mha文章:http://467754239.blog.51cto.com/4878013/1695175  关于如何验证主从数据的不一致 pt-table-checksum,它可以检测master和slave上表结构和数据是否一致 如何解决主从数据不一致 pt-table-sync,它可以修复主从数据不一致 这两款工具都是由Percona公司提供的,Percona在MySQL的日常管理提供了很多类似的工具. 适用场景 pt-table-checksum是一个在线验证主从数据一致性的工具,主要用

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

在比特币网络中,不是每个节点都有能力储存完整的区块链数据,受限于存储空间的的限制,很多节点是以SPV(Simplified Payment Verification简单支付验证)钱包接入比特币网络,通过简单支付验证可以在不必存储完整区块链下对交易进行验证,本文将分析区块结构Merkle树及如何进行交易验证. 区块结构 在工作量证明中出现过一个区块信息截图: 细心的同学一定已经在里面发现了很多未讲的其他信息,如:时间戳,版本号,交易次数,二进制哈希树根(Merkle根)等. 我们来看看一个区块结构

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

区块基础-merkle树   Merkle tree中文叫做梅克尔树,这当然不是一棵真正的植物树,merkle tree是计算机数据结构中的一种树,是由计算机科学家 Ralph Merkle 提出的,并以他本人的名字来命名. Merkle tree是数据结构中的一种树结构,可以是二叉树,也可以是多叉树,他和数据结构中树的特点几乎一致,和普通树不同的是:merkle tree上的叶节点存放hash计算后的hash值,非叶节点是其对应的子节点串联的字符串的hash值.上图可知:hash0=hash0

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

Merkle 树 完整的比特币数据库(也就是区块链)需要超过 140 Gb 的磁盘空间.因为比特币的去中心化特性,网络中的每个节点必须是独立,自给自足的,也就是每个节点必须存储一个区块链的完整副本.随着越来越多的人使用比特币,这条规则变得越来越难以遵守:因为不太可能每个人都去运行一个全节点.并且,由于节点是网络中的完全参与者,它们负有相关责任:节点必须验证交易和区块.另外,要想与其他节点交互和下载新块,也有一定的网络流量需求. 在中本聪的 比特币原始论文 中,对这个问题也有一个解决方案:简易支付

演示stop暴力停止线程导致数据不一致的问题,但是有些有趣的发现 (2017-07-03 21:25)

如注释所言 /** * Created by weiwei22 on 17/7/3. * * 这里主要是为了演示stop导致的数据不一致的问题.stop会暴力的结束线程并释放锁,所以有可能在恰好写了一半数据的时候,就被stop并释放了锁. * 读线程此时获得锁就有可能读取到不一致的数据. * 但是发现几个有意思的现象: * 1.如果M<N,那么所有的Thread1线程实例都没有机会执行就被干掉了, * 因为新创建的Thread1的实例t1在执行到(1)处时,休息N毫秒,几乎同时主线程执行到(2)

MySQL MMM 数据不一致探究

MySQL MMM 数据不一致探究 slave重新指向新的master 的关键日志输出,通过这些日志输出,我们大致可以明白MMM自动failover或在线切换时的执行流程. --自动failover,slave节点 2015/02/06 01:47:09  INFO Changing active master to 'raugherdb1' 2015/02/06 01:47:09 DEBUG Executing /usr/lib/mysql-mmm//agent/set_active_mast

逻辑数据库设计 - 单纯的树(递归关系数据)(转)

逻辑数据库设计 - 单纯的树(递归关系数据) 相信有过开发经验的朋友都曾碰到过这样一个需求.假设你正在为一个新闻网站开发一个评论功能,读者可以评论原文甚至相互回复. 这个需求并不简单,相互回复会导致无限多的分支,无限多的祖先-后代关系.这是一种典型的递归关系数据. 对于这个问题,以下给出几个解决方案,各位客观可斟酌后选择. 一.邻接表:依赖父节点 邻接表的方案如下(仅仅说明问题): CREATE TABLE Comments( CommentId int PK, ParentId int, --