1.目录结构

  • 所有数据都存在data文件夹下
  • 一个时间序列数据到达时,先根据顺乱序分到sequence或unsequence文件夹下
  • 再根据其逻辑存储组确定物理隔离的文件夹(即图中的逻辑存储组)
  • 再根据设备的hash值区确定不同的虚拟存储组号(即图中的虚拟存储组)
  • 再根据数据所属的时间分区确定时间分区号(即图中的时间分区)
  • 最终写入当前活跃的memtable中,经刷盘写入最终的数据文件(即图中的数据文件)

2.类图结构

  • 一个InsertPlan先到达StorageEngine,此前其已经在MManager中取到相应的元数据,现在开始进行数据写入
  • StorageEngine根据InsertPlan中的逻辑存储组名找到对应的StorageGroupManager(注意:我们每一种InsertPlan都仅写入一个存储组的数据)
  • StorageGroupManager根据InsertPlan中的设备名进行hash,确定其虚拟存储组号,找到对应的VirtualStorageGroupProcessor(注意:我们每一种InsertPlan都仅写入一个设备的数据)
  • VirtualStorageGroupProcessor根据时间分区切分InsertPlan,将其转发给响应分区的TsfileProcessor
  • TsfileProcessor将数据写入内存缓冲区,当内存控制触发后,写入其对应的tsfile文件

3. Virtual Storage Group Processor中和时间有关的map的说明

(1)latestTimeForEachDevice

作用:记录每一个时间分区的每一个设备的最后写入时间,用以在刷盘时更新partitionLatestFlushedTimeForEachDevice

更新方式:每一次insert成功后,更新为相应设备的最大写入时间戳

键值关系:时间分区 → 设备名称 → 最后写入时间


(2)partitionLatestFlushedTimeForEachDevice

作用:记录每一个时间分区的每一个设备的最后刷盘时间,以此确定该设备的新数据点是顺序还是乱序数据

更新方式:在每一次Flush操作后,通过updateLatestFlushTimeCallback这个回调函数,更新为相应设备刷盘之后的最大写入时间戳

键值关系:时间分区 → 设备名称 → 最后刷盘时间


(3)globalLatestFlushedTimeForEachDevice

作用:记录每个设备全局(跨时间分区)的最后刷盘时间,用来在更新last cache的时候确定新写入的数据是否为last数据

更新方式:在每一次Flush操作后,通过updateLatestFlushTimeCallback这个回调函数,更新为相应设备刷盘之后的最大写入时间戳

键值关系:设备名称 → 最后刷盘时间


(4)newlyFlushedPartitionLatestFlushedTimeForEachDevice

作用:在文件升级时记录升级成功文件的每一个时间分区的刷盘时间,用于最终更新partitionLatestFlushedTimeForEachDevice,单独设定一个变量的原因是,升级与写入是异步操作,如果直接更改partitionLatestFlushedTimeForEachDevice的话有可能会有并发冲突,所以只更新这个临时变量,最终拿写锁再将这两个map合并

更新方式:在每一个文件升级成功后,通过upgradeTsFileResourceCallBack这个回调函数,更新为相应设备的最大时间戳

键值关系:时间分区 → 设备名称 → 最后升级时间




  • No labels