1. 理解CompactionPri的核心作用
在存储引擎的底层机制中,Compaction(压缩合并)是一个影响性能和资源消耗的关键过程。而CompactionPri(Compaction Priority)就是这个过程中的调度策略控制器,它决定了哪些数据文件应该被优先合并。就像医院急诊室的分诊护士,需要根据病人危急程度决定救治顺序。
我曾在处理一个LSM-Tree存储系统性能问题时,发现不当的CompactionPri设置会导致写入突然卡顿。当时系统默认使用"ByCompensatedSize"策略,但实际业务中存在大量短期热点数据,最终通过调整为"ByHotness"策略解决了问题。这种实战经验让我深刻认识到优先级策略的选择需要结合业务特征。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 主流CompactionPri策略深度解析
2.1 Leveled策略的ByCompensatedSize
这是Leveled Compaction的默认策略,其核心逻辑是优先选择"补偿后尺寸最大"的SST文件。补偿尺寸的计算公式为:
code复制compensated_size = actual_size * (1 + penalty_factor)
其中penalty_factor通常根据文件所在层级设定,层级越深惩罚系数越高。这种策略的优势在于:
- 有效控制各层级数据量平衡
- 减少深层数据的重复合并次数
- 适合长期稳定写入的场景
但在突发写入场景下可能出现"合并追赶不上写入"的情况,这时就需要考虑其他策略。
2.2 Tiered策略的ByHotness
当业务存在明显的时间局部性特征时(如社交媒体的热点事件),ByHotness策略往往更有效。它通过追踪SST文件的访问频率,优先合并热数据文件。具体实现通常包含:
- 基于滑动窗口的访问计数统计
- 热度衰减算法(如指数衰减)
- 冷热数据分离阈值设定
在某个电商大促项目中,我们将CompactionPri从ByCompensatedSize改为ByHotness后,高峰期的P99延迟从1200ms降到了350ms。但要注意这种策略会带来额外的内存开销用于维护热度统计。
2.3 其他特殊场景策略
2.3.1 ByOldestLargestSeq
适用于需要严格控制数据过期
