Cassandra 文档

版本

您正在查看预发布版本的文档。

分层压缩策略 (LCS)

统一压缩策略 (UCS) 是从 Cassandra 5.0 开始大多数工作负载推荐的压缩策略。如果您要创建新表,请使用此策略。

分层压缩策略 (LCS) 推荐用于读密集型工作负载,尽管 UCS 是目前所有工作负载的最佳推荐。它缓解了 STCS 在读取操作中的一些问题,同时提供了合理的写入操作。此策略使用一系列级别,每个级别包含一组 SSTable。当内存表中的数据被刷新时,SSTable 将写入第一级 (L0),其中 SSTable 不保证不重叠。LCS 压缩将这些第一级 SSTable 与 L1 级别的较大 SSTable 合并。默认情况下,每个级别的尺寸是前一个级别的 10 倍。一旦 SSTable 被写入 L1 或更高级别,则保证该 SSTable 与同一级别中的其他 SSTable 不重叠。如果读取操作需要访问一行,则它只需要查看每个级别的一个 SSTable。

为了完成压缩,所有重叠的 SSTable 将合并到下一级别的新的 SSTable 中。对于 L0 → L1 压缩,我们几乎总是需要包含所有 L1 SSTable,因为大多数 L0 SSTable 覆盖了整个分区范围。LCS 将 SSTable 从一个级别压缩到下一个级别,写入分区以适应定义的 SSTable 大小。此外,每个级别都有一个规定的尺寸,因此当级别达到其尺寸限制时将触发压缩。在一个级别中创建新的 SSTable 会触发下一级别的压缩,依此类推,直到所有级别都根据设置完成压缩。

如果在 L0 级别中执行了太多 SSTable 读取,则存在一个保险机制。如果 L0 中有超过 32 个 SSTable,则将在 L0 中触发 STCS 压缩。此压缩会快速将 SSTable 从 L0 合并到 L1,在那里它们将被压缩为不重叠的 SSTable。

LCS 并不像 STCS 那样占用磁盘空间,只需要大约 10% 的磁盘空间来执行,但它更占用 IO 和 CPU 资源。对于读密集型工作负载中的持续小规模压缩,压缩量是合理的。但是,它不适合写密集型工作负载,因为它会导致大量的磁盘 IO 和 CPU 使用率。不建议对 LCS 进行大规模压缩。

引导

在引导期间,SSTable 将从其他节点流式传输。由于许多 SSTable 将从新写入内存表中刷新,以及从远程节点流式传输,因此新节点将在 L0 中拥有许多 SSTable。为了避免刷新和流式传输 SSTable 发生冲突,只有 L0 中的 STCS 会在引导完成之前执行。

饥饿的 SSTable

如果分层不理想,LCS 会导致 SSTable 出现饥饿现象。高层级的 SSTable 可能被搁置而无法压缩,因为低层级的 SSTable 没有被合并和压缩。例如,这种情况会导致低层级无法删除墓碑。如果这些饥饿的 SSTable 在定义的压缩轮数内没有得到解决,它们将被包含在其他压缩中。这种情况通常发生在用户降低了 sstable_size 设置时。

SizeTieredCompactionStrategy 是默认的压缩策略。任何其他压缩策略都必须在 cassandra.yaml 文件中定义。

LCS 选项

子属性 描述

enabled

启用后台压缩。默认值:true

tombstone_compaction_interval

创建 SSTable 后,Cassandra 考虑对该 SSTable 进行墓碑压缩的最小秒数。如果表超过了 tombstone_threshold 比例,则 SSTable 有资格进行墓碑压缩。默认值:86400

tombstone_threshold

可回收墓碑与所有包含列的比率。如果比率超过此限制,Cassandra 将单独对该表进行压缩,以清除墓碑。默认值:0.2

unchecked_tombstone_compaction

如果设置为 true,则允许 Cassandra 在不预先检查哪些表有资格进行此操作的情况下运行墓碑压缩。即使没有此预先检查,Cassandra 也会检查 SSTable 以确保删除墓碑是安全的。默认值:false

log_all

激活整个集群的高级日志记录。默认值:false

sstable_size_in_mb

SSTable 的目标大小。虽然 SSTable 大小应该小于或等于 sstable_size_in_mb,但在压缩过程中,压缩可能会生成更大的 SSTable。当给定分区键的数据异常大时,就会发生这种情况。Cassandra 数据库不会将数据拆分为两个 SSTable。默认值:160

fanout_size

级别的目标大小将通过此 fanout_size 乘数增加。您可以通过调整此选项来减少空间放大。默认值:10

single_sstable_uplevel

??? 默认值:true

LCS 还支持启动选项 -Dcassandra.disable_stcs_in_l0=true,它会禁用 L0 中的 STCS。