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' 连接状态 请求成功后 断开 ...
随机推荐
- AcWing 第 92 场周赛 C题 4866. 最大数量 题解
原题链接 链表 + 并查集乱搞做法: 思路 首先可以发现,想要让度数尽量大,那我们应该构造成菊花图,即下图所示: 对于每个需求,我们可以知道,如果之前他们没有连在一起,那我们一定得把他们连在一起,该过 ...
- HTTP请求时哪些请求头是默认携带的?
提起HTTP的请求头和响应头总是一头雾水,因为总是看上去一大堆,好多还不知道是什么意思. 今天我们先研究请求头,我就想,如果我们能弄清楚,在我们什么都不做的情况下,一个最简单的HTTP请求会携带哪些请 ...
- Hugging Face 的文本生成和大语言模型的开源生态
[更新于 2023 年 7 月 23 日: 添加 Llama 2.] 文本生成和对话技术已经出现多年了.早期的挑战在于通过设置参数和分辨偏差,同时控制好文本忠实性和多样性.更忠实的输出一般更缺少创造性 ...
- Web安全漏洞解决方案
1.已解密的登录请求 推理: AppScan 识别了不是通过 SSL 发送的登录请求. 测试请求和响应: 1.1.1 产生的原因 登录接口,前端传入的密码参数没有经过md5的加密就直接传给了后端 1. ...
- 《CTFshow-Web入门》03. Web 21~30
@ 目录 web21 题解 原理 web22 题解 原理 web23 题解 原理 web24 题解 原理 web25 题解 原理 web26 题解 web27 题解 web28 题解 web29 题解 ...
- redis基本数据类型 Hash
Hash 类型 Hash类型的常见命令 HSET key field value: 添加或者修改hash类型key的field的值HGET key field: 获取一个hash类型key的field ...
- os --- 多种操作系统接口¶
os.path --- 常用路径操作 源代码: Lib/posixpath.py (用于 POSIX) 和 Lib/ntpath.py (用于 Windows). 此模块实现了一些有用的路径名称相关函 ...
- 计算机三级网络技术备考复习资料zhuan
计算机三级网络技术备考复习资料 第一章 计算机基础 分析:考试形式:选择题和填空题,6个的选择题和2个填空题共10分,都是基本概念 1.计算机的四特点:有信息处理的特性,有广泛适应的特性,有 ...
- 畅捷通T+任意文件上传(CNVD-2022-60632 )漏洞复现
一.漏洞描述 022年8月29日和8月30日,畅捷通公司紧急发布安全补丁修复了畅捷通T+软件任意文件上传漏洞.未经身份认证的攻击者利用该漏洞,通过绕过系统鉴权,在特定配置环境下实现任意文件的上传,从而 ...
- 虹科干货 | 虹科Redis企业版数据库的延迟如此之小,proxy功不可没!
在Redis企业版集群的后台发生了许多事件,proxy(代理)隐藏了数据库客户端的所有活动. 大多数开发人员在构建应用程序时都会从小规模开始,使用简单的Redis开源(Redis OSS)数据库.在初 ...