Linux Cassandra压缩(Compaction)策略选择与调优
一、Compaction 原理与作用详解
1.1 Compaction 是什么?
Compaction 是后台任务,将多个SSTable合并成更少的更大SSTable:
- 合并数据:相同Partition的行合并,保留最新版本
- 清理墓碑:删除过期墓碑(gc_grace_seconds后)
- 优化读路径:减少SSTable数量,降低Bloom Filter/Index IO
触发条件:
- SizeTiered:相似大小SSTable达到阈值(default 4)
1.2 Compaction 的放大效应
- 空间放大:Compaction临时需额外50%空间
生产关注:Compaction落后 → 读放大 → P99延迟高
1.3 Compaction 执行流程
5.0优化:Trie SSTable + 并行合并,IO更低
二、Compaction 策略全面对比
Compaction策略在创建表/Keyspace时指定,不可在线更改(需重建表)。
CREATETABLEusers (
...
) WITH compaction = {'class': 'UnifiedCompactionStrategy', ...};
2.1 SizeTieredCompactionStrategy (STCS) —— 默认,写密集首选
- 原理:相似大小SSTable积累到min_threshold(默认4)时合并成更大一层
适合:纯写多读少、短生命周期数据、日志场景
参数:
- min_threshold / max_threshold:触发阈值(4/32)
- bucket_low / bucket_high:大小桶范围(0.5/1.5)
2.2 LeveledCompactionStrategy (LCS) —— 读密集,低延迟首选
- 原理:分层(L0-L7),每层大小×10,保证90%读只需查1个SSTable
适合:读QPS高、延迟敏感、键值查询
参数:
- sstable_size_in_mb:每SSTable目标大小(默认160MB)
2.3 TimeWindowCompactionStrategy (TWCS) —— 时间序列神器
- 原理:按时间窗(compaction_window_size)分桶,窗内STCS,窗关闭后不再合并
适合:时间序列、日志、IoT、带TTL数据
参数:
- compaction_window_unit / size:窗大小(默认'days'/1)
- timestamp_resolution:微秒/毫秒
2.4 UnifiedCompactionStrategy (UCS) —— 5.0新策略,混合负载推荐
- 原理:自适应结合STCS/LCS/TWCS,根据负载动态选择子策略
适合:大多数生产场景,尤其是负载波动大
参数:
- scale_factor、target_sstable_size 等自适应
2.5 策略选择决策表
生产建议:新集群优先UCS(5.0+),老集群根据业务迁移。
迁移方法:nodetool compact强制Major(慎用)或sstableloader重建
三、Compaction 全局参数调优(cassandra.yaml)
3.1 concurrent_compactors
concurrent_compactors:8
3.2 compaction_throughput_mb_per_sec
compaction_throughput_mb_per_sec:64
- 生产:白天64-128,夜间0(不限跑Major)
- 动态:nodetool setcompactionthroughput
3.3 compaction_large_partition_warning_threshold_mb
compaction_large_partition_warning_threshold_mb:1024
表级参数示例(WITH compaction):
- stcs: min/max_threshold, bucket_*
- lcs: fanout_size, sstable_size_in_mb
- twcs: compaction_window_size/unit
四、Compaction 监控与诊断
4.1 nodetool compactionstats
nodetool compactionstats -a
输出:Pending tasks、Active compactions、Throughput
阈值:
4.2 nodetool tablestats
nodetool tablestats keyspace.table | grep -A10 "SSTable"
关键:
- SSTables per read 直方图:平均>10 → 落后
- Pending flushes/compactions
4.3 Metrics(JMX/Prometheus)
- org.apache.cassandra.metrics.Compaction.*
- PendingTasks、Completed、BytesCompacted
4.4 日志监控
grep "Compaction" /var/log/cassandra/system.log
五、Compaction 调优实战与风暴防控
5.1 调优步骤
- 评估负载:nodetool proxyhistograms + cfstats
- 调参数:concurrent_compactors匹配硬件
5.2 风暴防控
- 分批repair:repair触发anticompaction,避免叠加
5.3 生产调优公式
- concurrent_compactors ≈ min(CPU核数, 可用磁盘数 × 2)
- throughput ≈ 日间峰值写QPS × 行大小 × 2(经验)
案例:某日志集群TWCS,Pending tasks达数百 → 调高concurrent_compactors到16 + 窗大小7天,Pending降0,空间回收率提升50%。
另一案例:读密集表LCS,P99 100ms+ → sstable_size_in_mb调小到50MB,读放大降至5,延迟<10ms。
六、常见Compaction问题排查
- Pending tasks堆积 → 磁盘IO饱和 → iostat检查,分离盘或限速
- 空间不下降 → 墓碑未过期 → 降低gc_grace_seconds(慎用)
- Compaction OOM → 大Partition → 分区键优化
- 读放大高 → SSTable多 → 强制nodetool compact(分表)