分层压缩策略 (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
设置时。
|
LCS 选项
子属性 | 描述 |
---|---|
enabled |
启用后台压缩。默认值:true |
tombstone_compaction_interval |
创建 SSTable 后,Cassandra 考虑对该 SSTable 进行墓碑压缩的最小秒数。如果表超过了 |
tombstone_threshold |
可回收墓碑与所有包含列的比率。如果比率超过此限制,Cassandra 将单独对该表进行压缩,以清除墓碑。默认值:0.2 |
unchecked_tombstone_compaction |
如果设置为 |
log_all |
激活整个集群的高级日志记录。默认值:false |
sstable_size_in_mb |
SSTable 的目标大小。虽然 SSTable 大小应该小于或等于 sstable_size_in_mb,但在压缩过程中,压缩可能会生成更大的 SSTable。当给定分区键的数据异常大时,就会发生这种情况。Cassandra 数据库不会将数据拆分为两个 SSTable。默认值:160 |
fanout_size |
级别的目标大小将通过此 |
single_sstable_uplevel |
??? 默认值:true |
LCS 还支持启动选项 -Dcassandra.disable_stcs_in_l0=true
,它会禁用 L0 中的 STCS。