You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

一、TsFileResource及接口设计修改目标

每个数据文件 TsFile 在内存中对应一个文件索引信息 TsFileResource,供查询使用

目标:目前tsfile采用一对一的索引方式,每个tsfile都有一个索引文件TsFileResource。由于TsFileResource常驻内存中,在设备数多时会占据太多内存,导致写入性能下降很严重;当有过多设备的情况下,就会报内存。

本次针对TsFileResouce的改进总目标为可以支持更多的设备。


本次接口化目标:区分文件句柄TsFileResouce和文件索引FileIndexEntries,将TsFileResouce中的字段放入FileIndexEntries中,利用FileIndexEntries的接口完成文件索引相关功能;TsFileResouce中仅保留文件句柄的功能。

具体而言,涉及到数据结构如下:

FileIndexEntries:

private TimeIndexEntry[] indexEntries; // TimeIndexEntry 列表,记录文件中所有的设备路径、开始时间和结束时间(详见TimeIndexEntry

private String tsFilePath; // TsFile 路径

TimeIndexEntry:

private PartialPath path; // 设备路径

private long startTime; // 开始时间

private long endTime; // 结束时间


第一步接口化(本次)的修改中,可以从TsFileResource中转移走的字段:

protected long[] startTimes; //  开始时间列表

protected long[] endTimes; // 结束时间列表,未封口则为 Long.MIN_VALUE

protected Map<String, Integer> deviceToIndex; // device设备名 => 开始 / 结束时间列表index


第二步的修改(后续)涉及到封口文件句柄(SealedTsfileResource)和未封口文件句柄(UnsealedTsfileResource),因为封口文件句柄需要的字段较少,未封口文件句柄可以继承封口文件句柄;文件封口时再转化为封口文件句柄。


二、数据的插入和批量插入

总入口: public void insert(InsertRowPlan insertRowPlan) StorageEngine.java

  1. 找到对应的 StorageGroupProcessor
  2. 根据写入数据的时间以及当前设备落盘的最后时间戳,找到对应的 TsFileProcessor
  3. 需修改,使用文件索引】写入 TsFileProcessor 对应的 memtable 中:
    1)如果是乱序文件,则更新tsfileResource中的endTimeMap (deviceToIndex, endTimes)
    2)如果tsfile中没有该设备的信息,或新插入数据的时间小于已存startTime,则更新tsfileResource中的startTimeMap
  4. 记录写前日志
  5. 根据 memtable 大小,来判断是否触发异步持久化 memtable 操作。如果是顺序文件且执行了刷盘动作,则更新tsfileResource中的endTimeMap
  6. 根据当前磁盘 TsFile 的大小,判断是否触发文件关闭操作


三、数据的删除

StorageEngine.java中的入口: public void delete(String deviceId, String measurementId, long timestamp)

  1. 找到对应的 StorageGroupProcessor
  2. 保留使用文件句柄类】找到受影响的所有 working TsFileProcessor 记录写前日志
  3. 保留使用文件句柄类】找到受影响的所有 TsFileResource,在其对应的 mods 文件中记录一条记录:pathversionstartTimeendTime
    1)如果存在 working memtable:则删除内存中的数据
    2)如果存在 正在 flush memtable,记录一条记录,查询时跳过删掉的数据(注意此时文件中已经为这些 memtable 记录了 mods


四、数据访问

总入口StorageEngine: public QueryDataSource query(SingleSeriesExpression seriesExpression, QueryContext context, QueryFileManager filePathsManager)

需修改,使用文件索引找到所有包含这个时间序列的顺序和乱序的 TsFileResource 进行返回,供查询引擎使用


五、重启恢复流程

StorageGroupProcessorrecover()

  • No labels