当前位置:首页>Linux>Linux Cassandra压缩(Compaction)策略选择与调优

Linux Cassandra压缩(Compaction)策略选择与调优

  • 2026-09-02 16:55:10
Linux Cassandra压缩(Compaction)策略选择与调优

Linux Cassandra压缩(Compaction)策略选择与调优

一、Compaction 原理与作用详解

1.1 Compaction 是什么?

Compaction 是后台任务,将多个SSTable合并成更少的更大SSTable:

  • 合并数据:相同Partition的行合并,保留最新版本
  • 清理墓碑:删除过期墓碑(gc_grace_seconds后)
  • 回收空间:删除已删除数据
  • 优化读路径:减少SSTable数量,降低Bloom Filter/Index IO

触发条件:

  • SizeTiered:相似大小SSTable达到阈值(default 4)
  • Leveled:L0层积累过多
  • TimeWindow:时间窗关闭
  • Unified:自适应多种触发

1.2 Compaction 的放大效应

  • 写放大:合并时重写数据,STCS最高
  • 读放大:SSTable多时,读需扫描更多文件
  • 空间放大:Compaction临时需额外50%空间

生产关注:Compaction落后 → 读放大 → P99延迟高

1.3 Compaction 执行流程

  1. 选择候选SSTable(策略决定)
  2. 合并数据流(Streaming合并,避免全内存)
  3. 写新SSTable
  4. 替换旧SSTable(原子切换)
  5. 删除旧文件

5.0优化:Trie SSTable + 并行合并,IO更低


二、Compaction 策略全面对比

Compaction策略在创建表/Keyspace时指定,不可在线更改(需重建表)。

CREATETABLEusers (
    ... 
WITH compaction = {'class''UnifiedCompactionStrategy', ...};

2.1 SizeTieredCompactionStrategy (STCS) —— 默认,写密集首选

  • 原理:相似大小SSTable积累到min_threshold(默认4)时合并成更大一层
  • 特点:
    • 写放大低(渐进合并)
    • 空间回收快
    • 读放大可能高(SSTable数易爆炸)

适合:纯写多读少、短生命周期数据、日志场景

参数:

  • min_threshold / max_threshold:触发阈值(4/32)
  • bucket_low / bucket_high:大小桶范围(0.5/1.5)

2.2 LeveledCompactionStrategy (LCS) —— 读密集,低延迟首选

  • 原理:分层(L0-L7),每层大小×10,保证90%读只需查1个SSTable
  • 特点:
    • 读放大极低(~10)
    • 写放大高(每层重写)
    • 空间占用稳定

适合:读QPS高、延迟敏感、键值查询

参数:

  • sstable_size_in_mb:每SSTable目标大小(默认160MB)

2.3 TimeWindowCompactionStrategy (TWCS) —— 时间序列神器

  • 原理:按时间窗(compaction_window_size)分桶,窗内STCS,窗关闭后不再合并
  • 特点:
    • TTL/删除数据回收极快(整窗丢弃)
    • 写放大低
    • 适合精确时间范围查询

适合:时间序列、日志、IoT、带TTL数据

参数:

  • compaction_window_unit / size:窗大小(默认'days'/1)
  • timestamp_resolution:微秒/毫秒

2.4 UnifiedCompactionStrategy (UCS) —— 5.0新策略,混合负载推荐

  • 原理:自适应结合STCS/LCS/TWCS,根据负载动态选择子策略
  • 特点:
    • 无需手动选策略
    • 自动平衡读写放大
    • 支持热分区隔离(5.0+)

适合:大多数生产场景,尤其是负载波动大

参数:

  • scale_factor、target_sstable_size 等自适应

2.5 策略选择决策表

场景
推荐策略
写放大
读放大
空间回收
适用业务
通用写密集
STCS
中高
日志、消息队列
读密集/低延迟
LCS
极低
用户数据、缓存替代
时间序列/TTL/删除频繁
TWCS
极快
监控、IoT、日志归档
混合负载/不确定
UCS
低中
大多数生产核心表(5.0+)

生产建议:新集群优先UCS(5.0+),老集群根据业务迁移。

迁移方法:nodetool compact强制Major(慎用)或sstableloader重建


三、Compaction 全局参数调优(cassandra.yaml)

3.1 concurrent_compactors

concurrent_compactors:8
  • 并行Compaction线程数
  • 推荐:SSD = CPU核数;HDD = 2-4
  • 过高 → IO风暴;过低 → 落后

3.2 compaction_throughput_mb_per_sec

compaction_throughput_mb_per_sec:64
  • 全局限速(MB/s)
  • 生产:白天64-128,夜间0(不限跑Major)
  • 动态:nodetool setcompactionthroughput

3.3 compaction_large_partition_warning_threshold_mb

compaction_large_partition_warning_threshold_mb:1024
  • 大Partition警告阈值

表级参数示例(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

阈值:

  • Pending >50:落后严重
  • Active长时间卡住:大Partition

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 调优步骤

  1. 评估负载:nodetool proxyhistograms + cfstats
  2. 选策略:根据表特性
  3. 调参数:concurrent_compactors匹配硬件
  4. 限速:避免影响生产
  5. 监控:Pending任务趋势

5.2 风暴防控

  • 分批repair:repair触发anticompaction,避免叠加
  • 夜间Major:临时设throughput=0
  • 大表拆分:避免单Partition过大

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问题排查

  1. Pending tasks堆积 → 磁盘IO饱和 → iostat检查,分离盘或限速
  2. 空间不下降 → 墓碑未过期 → 降低gc_grace_seconds(慎用)
  3. Compaction OOM → 大Partition → 分区键优化
  4. 读放大高 → SSTable多 → 强制nodetool compact(分表)
  5. UCS不适应 → 负载极端 → 回退专用策略

最新文章

随机文章