Merkle 树是从单个 SSTable 生成的吗?

Are Merkle trees generated from a single SSTable?

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

那么,生成了多少 Merkle 树,一棵还是和 SSTable 一样多?

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

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

值得注意的是,一个修复可以启动多个子修复,每个子修复都有自己的验证 compaction/merkle tree/streaming 会话。