1

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

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

4

1 回答 1

3

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

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

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

于 2017-12-05T16:54:43.423 回答