设计目的

  • IoTDB的版本从0.9.x更新到0.10.x,系统元数据文件,数据文件tsfile及其组织结构均发生了比较大的变化,当用户在使用0.9.x一段时间后,希望能够使用0.10.x的最新功能,此时可能希望对于旧文件进行升级。

    因此提供从0.9.x升级到0.10.x的在线升级工具

0.10.x相较于0.9.x的文件变化

  • 系统元数据文件
    • data/system/schema/system.properties * 增加 tsfilestoragefs * 增加 storagegrouptimerange * 增加 iotdbversion
    • data/system/schema/mlog.txt
      • 在创建时间序列的日志记录里增加alias和offset信息
    • tsfile文件结构改动
      • 重构 ChunkHeader Statistics
      • 重构 ChunkMetadata
      • 移除 TsFileMetadata中的 Schema
      • 增加 TimeseriesMetadata
      • 移除 TsDegist
      • 增加 TsFileMetadata 中的索引结构
    • 增加按时间分区组织数据

文件在线升级过程

注意:在进行升级之前,用户需要停止数据写入,打开cli,输入flush,将文件封口关闭,然后再关闭0.9.x iotdb进程。将0.9.x的data目录放进0.10.x,启动0.10.x。

系统元数据文件升级过程

IoTDB.java的主函数自动执行checkConfig,checkConfig会检查system.properties文件和system.properties.tmp文件

  • 如果只存在system.properties.tmp文件,说明上次升级已经成功,只需要把system.properties.tmp重命名为system.properties,升级即可完成;

  • 如果同时存在,需要删除system.properties.tmp文件,该文件为之前升级失败后留下的错误文件,需要继续进行升级过程;

  • 如果存在system.properties文件且该文件中不包含iotdb_version信息,则可以判断现有数据文件为旧版本数据文件,需要执行升级过程。

    升级system.properties

    • 使用tsfilestoragefs,storagegrouptimerange和iotdbversion的默认值设置到properties,与从旧文件中获得的信息一起写入到一个system.properties.tmp文件中。
    • 如果写入成功,删除旧的system.properties后将system.properties.tmp重命名为system.properties;
    • 如果写入失败,会留下写入失败的system.properties.tmp和旧system.properties,此时我们需要重启iotdb重新进行升级

在检查旧system.properties文件的过程中,如果发现不包含iotdb_version信息,此时会执行mlog升级,过程中与system.properties类似.

  • 检查mlog.txt文件和mlog.txt.tmp文件

    • 如果只存在mlog.txt.tmp文件,说明上次升级已经成功,只需要把mlog.txt.tmp重命名为mlog.txt,升级mlog完成;

      • 如果同时存在,删除mlog.txt.tmp文件,该文件为之前升级失败后留下的错误文件,需要继续进行升级过程;
  • 检查旧mlog.txt,在create timeseries的记录尾部中补充空的缺失信息,即",,,",同时写入到mlog.txt.tmp文件中;

  • 如果写入成功,删除旧的mlog.txt后将mlog.txt.tmp重命名为mlog.txt.tmp,升级完成;

  • 如果写入失败,会留下写入失败的system.properties.tmp和旧system.properties,此时我们需要重启iotdb重新进行升级

tsfile文件升级过程

由于0.10.x采用了按照时间分区组织文件结构,因此如果一个旧版本tsfile中的数据跨越了不同时间分区,在升级过程中我们需要把这个tsfile分成多个小的tsfile并放入不同的时间分区中。

  • 扫描各个存储组的数据目录

    • 第一步:(仅针对在0.9的数据上第一次启动0.10)如果存储组下没有分区目录,则将所有文件移动到存储组的 upgrade 目录下(当做一个特殊分区号)

    • 第二步:加载各个分区 resource,并且检查是否存在 upgrade 目录,将 upgrade 目录中的 TsFile 单独存到一份待升级的 resource 列表(顺序和乱序分开)

  • 遍历每个需要 upgrade 的文件,读取tsfile尾部的chunkGroupMetadata

    • 遍历每个chunkGroup的数据,根据chunkGroupMetadata判断该chunkGroup是否应在同一时间分区

      • 如果在同一分区,通过一个与分区号对应的TsFileIOWriter将该chunkGroup写入新文件中,升级工具会将旧文件结构转换为新结构
      • 如果不在同一分区,需要将chunkGroup中的数据解码到每一个点,每遇到新的分区就按照分区号开一个新的 TsFileIOWriter,将每个点写入对应的新文件中
    • 遍历完该TsFile的所有chunkGroup之后,关闭所有新生成的每一个新文件,并生成对应的resource

  • 升级完成后,删除旧tsfile和resource,将新生成的文件移动到对应分区目录中,加载其resource

  • No labels