Cassandra时序表出现大量Tombstone,应选择何种Compaction策略?
问题对应表结构
CREATE TABLE AccountData ( PartitionKey text, RowKey text, AccountId uuid, UnitId uuid, ContractId uuid, Id uuid, LocationId uuid, ValuesJson text, PRIMARY KEY (PartitionKey, RowKey) ) WITH CLUSTERING ORDER BY (RowKey ASC)
压缩策略选型结论
优先选择时间窗口压缩策略(Time Window Compaction Strategy, TWCS),是当前场景下的最优解。
选型依据
- 你的数据属于标准时序写入场景,RowKey由时间转换生成,分区内数据天然按时间升序排列,完全适配TWCS按时间窗口聚合SSTable的设计逻辑
- 你的PartitionKey只有10个枚举值,属于典型大分区场景,TWCS的合并逻辑不会触发大分区全量重写,IO开销远低于其他压缩策略
- TWCS会将相同时间窗口内写入的SSTable合并为独立的整体文件,当你按业务规则删除对应时间区间的过期数据时,完全过期的时间窗口对应的SSTable可以直接整体删除,不需要逐行扫描合并清理tombstone,从根源上降低了tombstone的残留比例
- 对比其他压缩策略的优势:
- 相比大小分层压缩策略(STCS):不会因为随机删除产生大量零散tombstone分散在不同SSTable中,查询时不需要跨多个SSTable扫描校验tombstone
- 相比层级压缩策略(LCS):时序场景下合并开销更低,不需要频繁跨层级合并小文件,资源占用少
配套优化配置建议
- 参考业务中最短的ContractId数据保留周期设置TWCS窗口参数,比如最短保留周期为30天,可配置如下压缩规则:
窗口越小,过期SSTable清理的粒度越精准,可根据实际业务删除频率调整ALTER TABLE AccountData WITH compaction = { 'class': 'TimeWindowCompactionStrategy', 'compaction_window_size': '1', 'compaction_window_unit': 'DAYS' }; - 调整
gc_grace_seconds参数,取值小于你最短的数据保留周期,既可以避免数据复活问题,也能加快过期tombstone的清理效率 - 可开启
unchecked_tombstone_compaction选项,允许压缩任务直接删除全量数据都是tombstone的SSTable,进一步降低tombstone残留
内容的提问来源于stack exchange,提问作者Wojtek Turowicz
相关产品推荐
相关产品推荐

