全部笔记All notes

Cassandra 中的压缩策略

阅读 3m 37s3m 37s read

Cassandra-压缩策略详解

在 Cassandra 数据库中,压缩 (Compaction) 是一种优化存储性能和查询效率的重要机制。以下是三种主要的压缩策略及其特点的详细介绍:

1. STCS (Size-Tiered Compaction Strategy)

原理
  • STCS 是 Cassandra 的默认压缩策略,基于数据文件的大小进行合并。
  • 小数据文件会逐步合并成更大的文件,以减少文件数量。
  • 文件分层:当同一层级的数据文件数达到阈值时,这些文件会被合并为一个更大的文件。
  • 适合写密集型的工作负载。
优势
  • 适用于高写入速率的场景,因为每次合并只影响较小的一部分文件。
  • 避免过多的磁盘 I/O。
劣势
  • 查询效率较低:由于文件分布的随机性,可能需要扫描更多的文件以完成查询。
  • 高磁盘空间需求:合并过程中需要额外的磁盘空间(最多需要50%的额外空间)。
  • 容易产生数据碎片化,tombstone(删除标记)可能累积较多。
使用场景
  • 高写入密集型应用,例如日志记录或传感器数据流。

2. TWCS (Time-Window Compaction Strategy)

原理
  • TWCS 主要用于基于时间的数据(如时间序列数据)。
  • 它按固定时间窗口分组文件(例如,每小时或每天的文件)。
  • 在每个时间窗口内,文件会被合并成一个文件,但不同时间窗口之间的数据不会合并。
优势
  • 适用于时间序列数据:数据在时间窗口内被快速合并,超出时间窗口的数据不会被修改。
  • 查询性能高:读取只涉及当前时间窗口的数据文件。
  • 降低磁盘 I/O 开销:历史文件一旦生成,不再被合并。
劣势
  • 需要设置合适的时间窗口:如果窗口过小,会产生大量小文件;如果过大,则可能影响写入性能。
  • TTL过期的数据需要等到整个时间窗口都过期才能被删除,可能导致磁盘空间暂时性浪费。
使用场景
  • 时间序列数据,如物联网 (IoT) 数据、日志记录、监控指标。
  • 特别适合具有TTL(生存时间)的时间序列数据。

3. LCS (Leveled Compaction Strategy)

原理
  • LCS 将数据文件划分为多个层级,每个层级的文件大小有固定限制。
  • 每一层的文件数量达到限制时,会触发合并并将文件移动到更高层。
  • 高层级的文件范围更宽,但文件数量较少,适合高效查找。
优势
  • 查询性能极高:LCS保证了每个SSTable中的key范围不重叠,减少了查询时需要访问的文件数。
  • 读优化:非常适合随机读操作。
  • 空间效率高:相比STCS,减少了数据重复。
劣势
  • 写入成本高:需要更多的 CPU 和磁盘 I/O 来维护层级结构。
  • 高合并开销:特别是在写入密集型场景中。
  • 写放大严重:可能导致高达10倍的写放大。
使用场景
  • 随机读场景较多的应用,例如在线用户数据存储、关键值查找。

总结对比

策略优势劣势适用场景写放大读放大空间效率
STCS写入性能高、合并灵活查询效率较低、磁盘空间需求高写密集型应用,如日志记录低高差
TWCS时间序列优化、高效查询、低合并成本时间窗口配置复杂时间序列数据,如物联网数据低中中
LCS查询性能最优、读操作优化写入性能开销大、资源消耗较高随机读多的场景,如在线用户数据存储高低好

关键配置参数

STCS 配置参数

compaction:
  class: 'SizeTieredCompactionStrategy'
  min_threshold: 4          # 触发压缩的最小SSTable数量
  max_threshold: 32         # 单次压缩的最大SSTable数量
  bucket_low: 0.5          # SSTable大小分组的下限比例
  bucket_high: 1.5         # SSTable大小分组的上限比例

TWCS 配置参数

compaction:
  class: 'TimeWindowCompactionStrategy'
  compaction_window_size: 1    # 时间窗口大小
  compaction_window_unit: 'DAYS'  # 时间窗口单位:MINUTES/HOURS/DAYS

LCS 配置参数

compaction:
  class: 'LeveledCompactionStrategy'
  sstable_size_in_mb: 160      # 每个SSTable的目标大小(MB)
  fanout_size: 10              # 每层的SSTable数量倍数

相关文章

Cassandra 技术栈

大数据集成

数据库对比

性能优化

运维监控

选择压缩策略时,应根据具体的工作负载、查询模式和存储资源进行权衡和配置。