构建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 树的一般步骤:

  1. 数据分块:将 SSTable 中的数据按照固定大小(通常是数据块的大小)进行分块(这可能导致叶子节点所覆盖的 Row Key 大小区间不一致,这种不一致性并不影响 Merkle 树的验证过程)。每个数据块都与一个叶子节点关联。
  2. 计算哈希值:对于每个数据块,使用哈希函数(如 SHA-256)计算其哈希值。哈希值是一个固定长度的二进制字符串,用于唯一标识数据块。
  3. 构建树结构:将所有叶子节点的哈希值按顺序排列,并将它们组织成树状结构。通常采用二叉树的形式,每个内部节点是其子节点的哈希值的哈希值。
  4. 计算父节点哈希值:从底部的叶子节点开始,沿着树向上逐层计算父节点的哈希值。父节点的哈希值由其两个子节点的哈希值计算得出。
  5. 根节点哈希值:最终,根节点的哈希值将成为整个 Merkle 树的校验值。根节点的哈希值可以用于验证整个 SSTable 数据的完整性。

在实际实现中,Cassandra 使用一种称为 Merkle Tree Digest 的紧凑形式来表示 Merkle 树。它使用部分哈希和位图的结构,以节省存储空间和计算开销。Cassandra 默认设置是增量修复。增量修复会保留已修复的数据,并且只会为未修复的 SSTable 构建 Merkle 树。这个更高效的过程依赖于将 SSTable 中的行标记为已修复或未修复的新元数据。

传输MerkleTree

Cassandra 在数据修复过程中会传输 Merkle 树的部分或完整结构。通常情况下,并不需要传输整个 Merkle 树,而是根据需要传输 Merkle 树的部分结构,以减少传输的数据量和开销,比如当某个节点的哈希值不一致时,再传输该节点的孩子节点。然而,在某些特定情况下,可能需要传输 Merkle 树的完整结构。以下是一些可能会传输完整 Merkle 树结构的情况:

  1. 初始数据同步:当节点加入 Cassandra 集群或者数据副本需要初始化时,可能需要传输完整的 Merkle 树结构。这样可以确保新加入的节点或者副本与其他节点的数据保持一致。
  2. 深度不一致:如果在数据修复过程中发现了深度不一致,即多个数据副本之间的数据差异非常大,此时传输完整的 Merkle 树可能是更有效的方式。这可以帮助更准确地检测和修复数据副本之间的不一致。
  3. 故障恢复:在某些故障恢复的情况下,如节点故障或数据副本损坏,传输完整的 Merkle 树可能有助于更快速地进行数据恢复和修复。

数据同步流程

当检测到数据副本之间的不一致时,需要进行数据同步以恢复一致性。以下是一般的数据同步流程:

  1. 检测不一致:通过比较数据副本之间的 Merkle 树或哈希值,发现数据副本之间存在不一致的数据块。
  2. 选择主节点:从具有最新数据的副本中选择一个作为主节点。通常,选择具有最高时间戳的副本作为主节点。
  3. 数据修复:主节点将不一致的数据块发送给其他副本,以进行数据修复。修复的方式可以根据具体情况选择,常见的方式包括:
    • 提供缺失数据:主节点将缺失的数据块发送给其他副本,使其与主节点保持一致。
    • 更新冲突数据:如果多个副本之间存在冲突的数据块,主节点可以通过某种冲突解决策略(如最新时间戳优先)选择一个正确的版本,并将其发送给其他副本进行更新。
    • 删除过时数据:如果某个副本上的数据已经过时或无效,主节点可以发送删除指令给其他副本,使其删除相应的数据块。
  4. 数据确认:副本接收到主节点发送的修复数据后,进行验证并确认修复操作。确保修复后的数据与主节点一致。

通过以上的数据同步流程,Cassandra 可以在数据副本之间实现一致性,并保证数据的完整性。数据同步的过程可以由 Cassandra 的复制策略和一致性协议(如 Quorum 一致性级别)来控制和管理。

参考资料:Cassandra官方文档

Cassandra中的MerkleTree反熵机制的更多相关文章

  1. Consul的反熵

    熵 熵是衡量某个体系中事物混乱程度的一个指标,是从热力学第二定律借鉴过来的. 熵增原理 孤立系统的熵永不自动减少,熵在可逆过程中不变,在不可逆过程中增加.熵增加原理是热力学第二定律的又一种表述,它更为 ...

  2. python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题

    python爬虫---详解爬虫分类,HTTP和HTTPS的区别,证书加密,反爬机制和反反爬策略,requests模块的使用,常见的问题 一丶爬虫概述       通过编写程序'模拟浏览器'上网,然后通 ...

  3. [转帖]实时流处理系统反压机制(BackPressure)综述

    实时流处理系统反压机制(BackPressure)综述 https://blog.csdn.net/qq_21125183/article/details/80708142 2018-06-15 19 ...

  4. python干货:5种反扒机制的解决方法

    前言 反爬虫是网站为了维护自己的核心安全而采取的抑制爬虫的手段,反爬虫的手段有很多种,一般情况下除了百度等网站,反扒机制会常常更新以外.为了保持网站运行的高效,网站采取的反扒机制并不是太多,今天分享几 ...

  5. Flink中发送端反压以及Credit机制(源码分析)

    上一篇<Flink接收端反压机制>说到因为Flink每个Task的接收端和发送端是共享一个bufferPool的,形成了天然的反压机制,当Task接收数据的时候,接收端会根据积压的数据量以 ...

  6. cassandra框架模型之二——存储机制 CommitLog MemTable SSTable

    四.副本存储 Cassandra不像HBase是基于HDFS的分布式存储,它的数据是存在每个节点的本地文件系统中. Cassandra有三种副本配置策略: 1) SimpleStrategy (Rac ...

  7. Cassandra中的数据一致性

       Cassandra中数据一致性指的是数据行在各个复制节点(replicas)上的更新和同步程度.通过提供tunable consistency,Cassandra扩展了eventual cons ...

  8. ETL中的数据增量抽取机制

    ETL中的数据增量抽取机制 (     增量抽取是数据仓库ETL(extraction,transformation,loading,数据的抽取.转换和装载)实施过程中需要重点考虑的问 题.在ETL过 ...

  9. C#配合利用XML文件构建反射表机制

    在设计程序时,无论是界面或是后台代码,我们通常都想留给用户一个较为简单的接口.而我在参与封装语音卡开发函数包的时候,发现各种语音卡的底层函数的接口都是各种整形变量标记值,使用起来极为不变.于是就理解了 ...

  10. 网络协议 反扒机制 fidder 抓包工具

    协议 http 协议: client 端 server 端交互的 一种形式 请求头信息: User-Agent: 情求载体的身份标识 connection: 'close' 连接状态 请求成功后 断开 ...

随机推荐

  1. [golang]使用mTLS双向加密认证http通信

    前言 假设一个场景,服务端部署在内网,客户端需要通过暴露在公网的nginx与服务端进行通信.为了避免在公网进行 http 明文通信造成的信息泄露,nginx与客户端之间的通信应当使用 https 协议 ...

  2. markdown之mermaid

    官方文档 01 简单的流程图 TD或TB:top to bottom,从上到下的流程图 LR:从左到右 其它:RL,BT flowchart LR; A([节点A的圆矩框]) --> |AB之间 ...

  3. 【python笔记】高阶函数map、filter、reduce

    前言 map().reduce().filter()是python的三个高阶函数.所谓高阶函数,指的是将函数作为参数并返回函数作为结果的函数.下面代码的sing_ready只是一个简单高阶函数示例: ...

  4. Web通用漏洞--CSRF

    Web通用漏洞--CSRF 漏洞简介 CSRF(Cross Site Request Forgery, 跨站请求伪造/客户端请求伪造),即通过伪造访问数据包并制作成网页的形式,使受害者访问伪造网页,同 ...

  5. 【pytorch】目标检测:一文搞懂如何利用kaggle训练yolov5模型

    笔者的运行环境:python3.8+pytorch2.0.1+pycharm+kaggle.yolov5对python和pytorch版本是有要求的,python>=3.8,pytorch> ...

  6. AI绘画StableDiffusion美女实操教程:斗破苍穹-小医仙

    之前分享过StableDiffusion的入门到精通教程:AI绘画:Stable Diffusion 终极炼丹宝典:从入门到精通 但是还有人就问:安装是安装好了,可是为什么生成的图片和你生成的图片差距 ...

  7. 《小白WEB安全入门》03. 漏洞篇

    @ 目录 SQL注入和简单绕过原理 什么是SQL 什么是SQL注入 XSS漏洞原理 什么是XSS XSS分类 NOSQL注入 什么是NOSQL CSRF原理 什么是CSRF 网络摄像头入侵原理 什么是 ...

  8. Blazor前后端框架Known-V1.2.14

    V1.2.14 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Git ...

  9. 拓展kmp的应用

    Smiling & Weeping ---- 我与月亮,进行了一次深夜谈话 它与我谈论太阳,而我与它谈论你. 题目链接:P3435 [POI2006] OKR-Periods of Words ...

  10. kmp的简单应用

    Smiling & Weeping ---- 我只为你一个人写过月亮 题目链接:P4824 [USACO15FEB] Censoring S - 洛谷 | 计算机科学教育新生态 (luogu. ...