【问题标题】:Are Merkle trees generated from a single SSTable?Merkle 树是从单个 SSTable 生成的吗?
【发布时间】:2018-05-19 09:02:50
【问题描述】:

当 Cassandra 进行数据完整性检查时,它会进行验证压缩,但这究竟意味着什么?我的理解是它创建了一个将临时存储的 SSTable(直到修复完成),然后它从该单个创建的 SSTable 生成 Merkle 树。如果任何 Merkle 树的叶子未能通过验证,则用于创建该叶子的分区(来自在验证压缩期间创建的 SSTable)将被流式传输到另一个节点。 但是,一位朋友告诉我,Merkle 树是从每个(以前存在的)SSTable 生成的。

那么,生成了多少个 Merkle 树,一个或与 SSTables 一样多?

【问题讨论】:

    标签: cassandra merkle-tree


    【解决方案1】:

    验证压缩遍历范围内包含的所有 sstable 以构建 merkle 树。它实际上并没有编写新的 sstable,但压缩接口执行相同类型的任务(迭代数据),因此可以重用。压缩管理器还用于清理、二级索引重建、MV 构建、清理和验证过程。

    生成一个单一的默克尔树。它的每个节点代表一个令牌范围内所有数据的哈希,节点的每个子节点是其令牌范围的一半。树的深度是动态的,理想情况下,叶子每个代表 1 个分区,但如果根节点代表包含许多分区的广泛范围,它最终可能代表更多。由于 merkle 树的深度上限为 20(否则它会太大,并导致转移问题),您通常不想修复其中包含超过 2^20 或 100 万个分区的范围。在选择如何细分范围以进行子范围修复时,可以使用 getsplits 或 size_estimates 表来确定这一点。

    值得注意的是,一个修复可以启动许多子修复,每个子修复都有自己的验证压缩/merkle 树/流会话。

    【讨论】:

    • 那么如果一个叶子验证失败,节点从哪里读取它需要流式传输的数据?它会重新读取每个 SSTable 以找到用于生成该叶子的分区吗?
    • 它将获取叶子所代表范围的所有当前 sstables 并将其流式传输。由于数据的幂等性、不可变性,如果有新的 sstables 就可以了。 sstables 按令牌顺序排序,因此它可以直接跳转到范围开始的位置。
    • 干杯!最后一个问题 :) 它本身不会流式传输 SSTables,对吗?我想它会读取叶子范围的所有 SSTables,处理数据(就像它是一个常规的读取操作一样),然后将其发送过来,对吧?
    • 流会话将为每个 sstable 分配一个任务,但它只会流过该 sstable 中不同范围内的部分。
    猜你喜欢
    • 2018-08-07
    • 2018-09-19
    • 2012-12-21
    • 2020-11-18
    • 2016-02-10
    • 2018-11-09
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    相关资源
    最近更新 更多