Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

跨文件空间合并(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开始逐层向上寻找可合并的层级,合并一层后返回

...