目标场景

  1. 相邻文件中序列重合度较少:TsFile1包含s1-s100,TsFile2包含s101-s200
  2. 不同序列数据采集频率不同:s1 写入频率 1Hz,s2写入频率1000Hz
  3. 合并速度低于写入速度:每天需要落盘 100G TsFile,读写(合并)一次TsFile的速率是每天10G
  4. 乱序数据较少,一直未触发乱序文件关闭,无法及时触发跨文件空间合并
  5. 合并的目标Chunk大小,即合并参数难以设置,需要考虑用户查询负载(查询的时间范围)


设计原则

能够在原始写入的文件大小不一的情况下(如初始写出的 TsFile 大小为 100M,10k,20M),控制合并目标文件大小和 Chunk 大小

将 TsFileManagement 里管理 TsFileResource 的数据结构与 合并机制分离

能够做到时间分区内部合并任务的并行

能够解决以下场景:

  • 场景1:生成海量小文件
  • 场景2:合并速度小于写入速度:10个存储组,每个存储组每天会产生10个文件,每个线程每天能合5个文件,系统最多有10个线程


名词解释

顺序空间:顺序数据文件所在的空间

乱序空间:乱序数据文件所在的空间


顺序空间合并(Seq Compaction):在顺序空间内部进行文件的合并(SizeTired Compaction)

乱序空间合并(Unseq Compaction):在乱序空间内部进行文件的合并(SizeTired Compaction)

跨空间合并(Cross Compaction):将乱序空间的文件合并到顺序空间


合并的总体任务

合并调度任务(定时启动):选择合并文件候选集,并提交合并执行任务

合并执行任务:接收待合并文件列表,合并到目标文件,并删除老文件

合并恢复任务(重启时执行一次):将中断的合并执行任务继续执行

合并异常处理任务:合并过程中发生异常时会执行,根据源文件是否都存在来执行相应的操作


合并调度的参数

enable_seq_space_compaction=true

enable_unseq_space_compaction=true

enable_cross_space_compaction=true (等价之前的 enable_unseq_compaction)

inner_compaction_strategy=SIZE_TIRED_COMPACTION (空间内合并策略)

cross_compaction_strategy=REWRITE_COMPACTION(跨空间合并策略)

compaction_priority=inner_cross(优先执行空间内合并,快速减少文件数)、cross_inner(优先执行跨文件空间合并,消除乱序文件)、balance(平衡减少文件数和消除乱序文件)

compaction_concurrent_thread=50(合并执行任务的并行度)

compaction_interval=10000(合并调度任务的执行间隔,单位 ms)

compaction_candidate_file_num=100 (候选合并文件个数)

compaction_target_tsfile_size=2000000000 (合并的目标文件大小)

TsFileManager 文件管理器(每个虚拟存储组一个)

Map<Long, 双向链表<TsFileResource>>  seqList:  分区 → 顺序文件列表

Map<Long, 双向链表<TsFileResource>>  unseqList:  分区 → 乱序文件列表


双向链表功能:

  • 管理顺序文件时,按照数据时间戳递增排列
  • 管理乱序文件时,按照文件版本号由低到高排列
  • 移除某些位置的文件,并且在原位加入合并后的文件



  • No labels