Cassandra中的MerkleTree反熵机制
构建MerkleTree
Cassandra 是一个分布式数据库系统,它使用 Merkle 树来实现数据一致性和数据完整性的验证。
在 Cassandra 中,每个节点都维护着自己的数据副本。为了确保数据的一致性和完整性,Cassandra 使用 Merkle 树进行验证。Merkle 树是一种树状结构,由哈希值构成,用于对数据块进行校验和验证。
在 Cassandra 中,Merkle 树并不是直接建立在 LSM(Log-Structured Merge)树上。Cassandra 使用 LSM 树来组织和管理数据, LSM 树中的数据块通常与一个 Merkle 树相关联,用于验证数据块的完整性。具体地说,Cassandra 在每个 SSTable(Sorted String Table)上维护一个 Merkle 树。SSTable 是 LSM 树中的磁盘层数据结构,用于持久化存储数据。每个 SSTable 中的数据块对应一个叶子节点,计算该数据块的哈希值并存储在 Merkle 树中。以下是在 SSTable 上构建 Merkle 树的一般步骤:
- 数据分块:将 SSTable 中的数据按照固定大小(通常是数据块的大小)进行分块(这可能导致叶子节点所覆盖的 Row Key 大小区间不一致,这种不一致性并不影响 Merkle 树的验证过程)。每个数据块都与一个叶子节点关联。
- 计算哈希值:对于每个数据块,使用哈希函数(如 SHA-256)计算其哈希值。哈希值是一个固定长度的二进制字符串,用于唯一标识数据块。
- 构建树结构:将所有叶子节点的哈希值按顺序排列,并将它们组织成树状结构。通常采用二叉树的形式,每个内部节点是其子节点的哈希值的哈希值。
- 计算父节点哈希值:从底部的叶子节点开始,沿着树向上逐层计算父节点的哈希值。父节点的哈希值由其两个子节点的哈希值计算得出。
- 根节点哈希值:最终,根节点的哈希值将成为整个 Merkle 树的校验值。根节点的哈希值可以用于验证整个 SSTable 数据的完整性。
在实际实现中,Cassandra 使用一种称为 Merkle Tree Digest 的紧凑形式来表示 Merkle 树。它使用部分哈希和位图的结构,以节省存储空间和计算开销。Cassandra 默认设置是增量修复。增量修复会保留已修复的数据,并且只会为未修复的 SSTable 构建 Merkle 树。这个更高效的过程依赖于将 SSTable 中的行标记为已修复或未修复的新元数据。
传输MerkleTree
Cassandra 在数据修复过程中会传输 Merkle 树的部分或完整结构。通常情况下,并不需要传输整个 Merkle 树,而是根据需要传输 Merkle 树的部分结构,以减少传输的数据量和开销,比如当某个节点的哈希值不一致时,再传输该节点的孩子节点。然而,在某些特定情况下,可能需要传输 Merkle 树的完整结构。以下是一些可能会传输完整 Merkle 树结构的情况:
- 初始数据同步:当节点加入 Cassandra 集群或者数据副本需要初始化时,可能需要传输完整的 Merkle 树结构。这样可以确保新加入的节点或者副本与其他节点的数据保持一致。
- 深度不一致:如果在数据修复过程中发现了深度不一致,即多个数据副本之间的数据差异非常大,此时传输完整的 Merkle 树可能是更有效的方式。这可以帮助更准确地检测和修复数据副本之间的不一致。
- 故障恢复:在某些故障恢复的情况下,如节点故障或数据副本损坏,传输完整的 Merkle 树可能有助于更快速地进行数据恢复和修复。
数据同步流程
当检测到数据副本之间的不一致时,需要进行数据同步以恢复一致性。以下是一般的数据同步流程:
- 检测不一致:通过比较数据副本之间的 Merkle 树或哈希值,发现数据副本之间存在不一致的数据块。
- 选择主节点:从具有最新数据的副本中选择一个作为主节点。通常,选择具有最高时间戳的副本作为主节点。
- 数据修复:主节点将不一致的数据块发送给其他副本,以进行数据修复。修复的方式可以根据具体情况选择,常见的方式包括:
- 提供缺失数据:主节点将缺失的数据块发送给其他副本,使其与主节点保持一致。
- 更新冲突数据:如果多个副本之间存在冲突的数据块,主节点可以通过某种冲突解决策略(如最新时间戳优先)选择一个正确的版本,并将其发送给其他副本进行更新。
- 删除过时数据:如果某个副本上的数据已经过时或无效,主节点可以发送删除指令给其他副本,使其删除相应的数据块。
- 数据确认:副本接收到主节点发送的修复数据后,进行验证并确认修复操作。确保修复后的数据与主节点一致。
通过以上的数据同步流程,Cassandra 可以在数据副本之间实现一致性,并保证数据的完整性。数据同步的过程可以由 Cassandra 的复制策略和一致性协议(如 Quorum 一致性级别)来控制和管理。
参考资料:Cassandra官方文档
Cassandra中的MerkleTree反熵机制的更多相关文章
- Consul的反熵
熵 熵是衡量某个体系中事物混乱程度的一个指标,是从热力学第二定律借鉴过来的. 熵增原理 孤立系统的熵永不自动减少,熵在可逆过程中不变,在不可逆过程中增加.熵增加原理是热力学第二定律的又一种表述,它更为 ...
- python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题
python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题 一丶爬虫概述 通过编写程序'模拟浏览器'上网,然后通 ...
- [转帖]实时流处理系统反压机制(BackPressure)综述
实时流处理系统反压机制(BackPressure)综述 https://blog.csdn.net/qq_21125183/article/details/80708142 2018-06-15 19 ...
- python干货:5种反扒机制的解决方法
前言 反爬虫是网站为了维护自己的核心安全而采取的抑制爬虫的手段,反爬虫的手段有很多种,一般情况下除了百度等网站,反扒机制会常常更新以外.为了保持网站运行的高效,网站采取的反扒机制并不是太多,今天分享几 ...
- Flink中发送端反压以及Credit机制(源码分析)
上一篇<Flink接收端反压机制>说到因为Flink每个Task的接收端和发送端是共享一个bufferPool的,形成了天然的反压机制,当Task接收数据的时候,接收端会根据积压的数据量以 ...
- cassandra框架模型之二——存储机制 CommitLog MemTable SSTable
四.副本存储 Cassandra不像HBase是基于HDFS的分布式存储,它的数据是存在每个节点的本地文件系统中. Cassandra有三种副本配置策略: 1) SimpleStrategy (Rac ...
- Cassandra中的数据一致性
Cassandra中数据一致性指的是数据行在各个复制节点(replicas)上的更新和同步程度.通过提供tunable consistency,Cassandra扩展了eventual cons ...
- ETL中的数据增量抽取机制
ETL中的数据增量抽取机制 ( 增量抽取是数据仓库ETL(extraction,transformation,loading,数据的抽取.转换和装载)实施过程中需要重点考虑的问 题.在ETL过 ...
- C#配合利用XML文件构建反射表机制
在设计程序时,无论是界面或是后台代码,我们通常都想留给用户一个较为简单的接口.而我在参与封装语音卡开发函数包的时候,发现各种语音卡的底层函数的接口都是各种整形变量标记值,使用起来极为不变.于是就理解了 ...
- 网络协议 反扒机制 fidder 抓包工具
协议 http 协议: client 端 server 端交互的 一种形式 请求头信息: User-Agent: 情求载体的身份标识 connection: 'close' 连接状态 请求成功后 断开 ...
随机推荐
- jdk安装自动化
写个在linux环境安装Java的脚本(install_java.sh),只需将jdk上传至/opt目录下,执行脚本即可. #!/bin/bash #author:zhangyl #本安装使用jdk版 ...
- k8s发布应用
前言 首先以SpringBoot应用为例介绍一下k8s的发布步骤. 1.从代码仓库下载代码,比如GitLab: 2.接着是进行打包,比如使用Maven: 3.编写Dockerfile文件,把步骤2产生 ...
- 关于三维模型OSGB格式轻量化在数据存储的重要性浅析
关于三维模型OSGB格式轻量化在数据存储的重要性浅析 三维模型的OSGB格式是一种常见的数据格式,用于存储和传输地理信息系统(GIS)中的三维地图数据.随着技术的不断发展,三维模型的应用越来越广泛,包 ...
- numpy中计算相关系数的np.corrcoef
np.corrcoef的作用 计算 Pearson 乘积矩相关系数.它可以用来分析给定数据集中各个变量之间的线性相关程度,返回一个相关系数矩阵,相关系数矩阵中的值介于 -1 到 1 之间,包括 -1 ...
- ORM查询一个表中有两个字段相同时,只获取某个值最大的一条
Table表如下: 获取表中name和hex值相同时age最大的那一条 ORM写法,两次查询 ids = table.values('name', 'age').annotate(id=Max('id ...
- WPF学习 - 用鼠标移动、缩放、旋转图片(1)
1. 需求 其实我的需求很简单.就是想做一个图片查看器,可以通过鼠标来平移.缩放.旋转图片. 2. 解决思路: WPF中的UIElement提供了RenderTransform属性,用于承载各种Tra ...
- iOS交叉编译
编译objc程序 ~/toolchain4/pre/bin/arm-apple-darwin9-gcc -arch arm -lobjc -framework CoreFoundation -fram ...
- 谈谈JSF业务线程池的大小配置
1.简介 JSF业务线程池使用JDK的线程池技术,缺省情况下采用Cached模式(核心线程数20,最大线程数200).此外,还提供了Fixed固定线程大小的模式,两种模式均可设置请求队列大小. 本文旨 ...
- 全网最详细Java-JUC
Java-JUC ⓪基础 ❶进程&线程 进程:指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间. 线程:比进程更小的执行单位,一个进程可以启动多个线程,每条线程并行执行不同的任务 ...
- 「ABC 218」解集
E 倒流一下,然后把负权边置零后跑 MST 即可. #include<cstdio> #include<vector> #include<algorithm> us ...