Cassandra 文档

版本

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

分层大小压缩策略 (STCS)

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

分层大小压缩策略 (STCS) 推荐用于写入密集型工作负载,并且是传统的推荐压缩策略。如果未指定其他策略,它将是默认的压缩策略。

当 Cassandra 累积了一定数量(默认值:4)的类似大小的 SSTable 时,STCS 会启动压缩。STCS 将这些 SSTable 合并成一个更大的 SSTable。随着这些更大的 SSTable 的累积,STCS 会将它们合并成更大的 SSTable。在任何给定时间,都会存在多个不同大小的 SSTable。

虽然 STCS 在压缩写入密集型工作负载方面效果很好,但它会使读取速度变慢,因为按大小合并的过程不会按行对数据进行分组。这一事实使得特定行的版本更有可能分布在多个 SSTable 中。此外,STCS 不会以可预测的方式清除已删除的数据,因为它的压缩触发器是 SSTable 大小。但是,SSTable 的增长速度可能不足以定期合并和清除旧数据。

大多数 STCS 压缩是次要压缩,它将几个 SSTable 合并成一个。相反,在使用 STCS 执行主要压缩时,在压缩期间每个数据目录将存在两个 SSTable,一个用于已修复的数据,另一个用于未修复的数据。随着最大的 SSTable 的大小增长,在 STCS 压缩期间同时用于新旧 SSTable 的磁盘空间量可能会超过节点上典型的磁盘空间量。这种现象被称为空间放大,即 SSTable 大小增长的问题,以及超出集群压缩能力的问题。不建议对 STCS 进行主要压缩。

STCS 依赖于对 SSTable 平均大小的计算来确定要合并哪些 SSTable。此过程称为分桶。以下选项用于计算将 SSTable 分组到的桶,基于该平均大小。分桶过程根据 SSTable 的大小与平均大小的差异(比平均大小大 50% 或 150%)对 SSTable 进行分组。另一种表达此计算的方法是,分桶过程对大小在 [average-size × bucket_low] 和 [average-size × bucket_high] 之间的 SSTable 进行分组。

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

STCS 选项

分层大小压缩策略 (STCS) 选项使用表选项在每个表中设置。表的 min_threshold 选项是触发次要压缩的主要值。次要压缩不涉及键空间中的所有表。

子属性 描述

enabled

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

tombstone_compaction_interval

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

tombstone_threshold

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

unchecked_tombstone_compaction

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

log_all

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

max_threshold

允许在次要压缩中使用的 SSTable 的最大数量。默认值:32

min_threshold

触发次要压缩的 SSTable 的最小数量。默认值:4

bucket_high

如果 SSTable 的大小小于该桶的平均大小的 150%,则将其添加到该桶中。例如,如果 SSTable 大小为 13 MB,而桶的平均大小为 10 MB,则 SSTable 将被添加到该桶中,并且将为该桶计算新的平均大小。默认值:1.5

bucket_low

如果 SSTable 的大小大于该桶的平均大小的 50%,则将其添加到该桶中。例如,如果 SSTable 大小为 6 MB,而桶的平均大小为 10 MB,则 SSTable 将被添加到该桶中,并且将为该桶计算新的平均大小。默认值:0.5

min_sstable_size

小于此值的 SSTable 将被分组到一个桶中,其中平均大小小于此设置。默认值:50MB

only_purge_repaired_tombstones

如果设置为 true,则允许仅从已修复的 SSTable 中清除墓碑。目的是防止数据在 gc_grace_seconds 内未运行修复的情况下复活。如果您长时间未运行修复,Cassandra 会保留所有墓碑 - 这可能会导致问题。默认值:false