时序压缩 (TSCS)
将SSTable按固定时间窗口分组,最近的窗口照常压缩,已关闭的窗口每个窗口冻结为一个, 超过保留期的窗口不进行压缩直接整体删除的压缩策略。
与分层存储无关
TSCS 是一种压缩策略,而分层存储是一种 表扩展。可以只启用其中一个,先启用 TSCS 更为稳妥。
配置
ALTER TABLE pp.tm_tag_point WITH compaction = {
'class': 'TimeSeriesCompactionStrategy',
'window_size': '1d',
'freeze_after': '2d',
'retention': '3650d'
};
| 选项 | 默认值 | 说明 |
|---|---|---|
window_size | 1h | 单个窗口的宽度。SSTable 根据最大时间戳分配到窗口 |
freeze_after | 2h | 窗口关闭后经过这段时间即可冻结。为迟到数据留出的缓冲 |
retention | 无 | 早于该时间的窗口整体删除。不设置则不会过期任何数据 |
max_future_window | 1d | 早于该时间的未来窗口将从所有自动路径中排除 |
timestamp_resolution | MICROSECONDS | 单元格时间戳单位。几乎不需要更改 |
window_size 应匹配查询模式如果仪表盘按天查看,则 1d 更为自然。窗口过小只会增加 SSTable 数量和
窗口管理开销——如果保留10年且窗口为 1h,则会创建 87,600 个窗口。
窗口的生命周期
[현재 창] [닫힘, freeze_after 이내] [동결됨] [만료]
────────────────┼───────────────────────────┼─────────────────┼──────────────
UCS 에 위임 여전히 UCS 창당 1 SSTable 통째로 삭제
(평소 컴팩션) (지각 데이터 흡수) 이후 손대지 않음 (컴팩션 없음)
当前窗口和刚关闭的窗口会委派给内部的 UnifiedCompactionStrategy ——对于写入活跃的
区域,其行为与上游 UCS 相同。
🔴 过期由 retention 负责——并非 TTL
如果未设置 retention,则不会过期任何数据。 即使已配置行级 TTL,TSCS 的窗口删除
也是另一回事。
窗口级删除的优势在于无需压缩,直接删除文件。若通过 TTL 过期,则需创建 墓碑并通过压缩清除,对于像时序数据这样「旧数据整体丢弃」的场景, 这种成本是浪费的。
迟到数据隔离
即使断连的边缘设备一次性上传多天数据,刷新和流式处理也会在窗口边界处分离。 因此,迟到数据会落入其所属的过去窗口,而不会影响最近的窗口,也不会触发 重新压缩。跨窗口的旧 SSTable 会被自动拆分。
停驻窗口——无法推进的窗口
窗口无法进入冻结状态而停滞的情况称为「停驻」。原因只有一个—— 路由缓冲区溢出。诊断及值调整参见运维文档。
验证
-- 지금 이 테이블에 걸린 컴팩션 설정
SELECT compaction FROM system_schema.tables
WHERE keyspace_name = 'pp' AND table_name = 'tm_tag_point';