...
跨文件空间合并(Merge):将乱序空间的乱序文件合并到顺序空间中优先级: 乱序层级合并 > 跨文件空间合并 > 顺序层级合并
目标场景
假设写入速度是稳定的
场景1:海量小文件,离线合并
场景2:10个存储组,每个存储组每天会产生10个文件,每个线程每天能合5个文件,系统最多有10个线程
合并任务(空间内和跨空间)的优先级
iotdb-engine.properties 配置参数:compaction_priority=inner_cross
目标:快速减少文件个数
compaction_priority=inner_cross
目标:消除乱序文件
compaction_priority=cross_inner
目标:平衡减少文件数和消除乱序文件
compaction_priority=balance
合并任务的并行度
iotdb-enine.properties 配置参数:concurrent_compaction_thread=50
合并文件选择Task
static long currentTaskNum=0;// 当前进行的合并任务个数
run():
如果 currentTaskNum == concurrent_compaction_thread return
for storagegroups
for partitions (倒序遍历)
如果 currentTaskNum < concurrent_compaction_thread ,通过空间内选择算法在顺序文件列表中找到目标文件大小个 TsFile, 提交顺序文件合并执行Task,如果 compaction_priority=balance:break;
如果 currentTaskNum = concurrent_compaction_thread ,return
如果 currentTaskNum < concurrent_compaction_thread ,通过空间内选择算法在乱序文件列表中找到找到目标文件大小个 TsFile, 提交乱序文件合并执行Task,如果 compaction_priority=balance:break;
如果 currentTaskNum = concurrent_compaction_thread ,return
find 跨文件空间(顺序遍历乱序文件)
如果 currentTaskNum < concurrent_compaction_thread ,通过跨空间选择算法找到目标文件大小个 TsFile, 提交跨文件空间合并执行Task,如果 compaction_priority=balance:break;
如果 currentTaskNum = concurrent_compaction_thread ,return
空间内选择算法
整体流程
合并任务的触发时机
系统启动时,每个 StorageGroupProsessor 的 recover 过程中
- (同步)恢复当前虚拟存储组
- 跨文件空间合并(同步)恢复跨文件空间合并
- (异步)恢复层级合并,当前只会有一个待恢复的任务,顺序或乱序
- 如果开启了连续合并(enable_continuous_compaction=true),则对每个分区提交异步合并任务
- 如果 COMPACTION_STRATEGY=NO_COMPACTION,则什么合并都不做,直接返回
- 如果 COMPACTION_STRATEGY=LEVEL_COMPACTION,执行系统整体合并
- 如果开启乱序合并(enable_unseq_compaction=true),且乱序空间最高层存在乱序文件,则执行跨文件空间合并
- 对此分区的顺序空间从Level-0开始逐层向上寻找可合并的层级,合并一层后返回
- 对此分区的乱序空间从Level-0开始逐层向上寻找可合并的层级,合并一层后返回
...