Versions Compared

Key

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

用户升级手册

  • 停止0.11所有写入
  • 开启cli,输入 flush 对所有未关闭TsFile进行封口
  • 关闭cli,关闭0.11服务器端
  • 配置0.12,把0.11 data目录迁移到0.12 相应位置,或在配置项里将0.12的data目录指向0.11的data目录位置
  • 启动0.12,tsfile文件升级会在后台自动进行12,文件升级会在后台自动进行
  • 日志中出现"All files upgraded successfully! " 时升级完成
  • 注意当文件升级过程中,最好不要进行delete操作。如果删除某个存储组内的数据且该存储组内存在待升级文件,删除会失败。

升级目标

  • 在线升级,即后台升级 TsFile 版本到 v3
  • 0.12 可同时查询 升级的过程对查询 TsFile v3 和 TsFile v2v2无影响

升级流程

移动文件

升级第一次启动新版本需要移动文件升级第一次启动新版本IoTDB需要移动文件

  1. 检查system.properties,如果iotdb_version=0.11.x,则需要升级进行文件移动

...

  1. 检查是否存在未关闭的v2 tsfile,如果有,IoTDB会结束进程。
    1. 检查是否存在wal
    2. 检查第0层TsFile数量与resource数量是否相同
  2. 扫描各个存储组顺序与乱序的数据目录(仅针对在0.11的数据上第一次启动0.12),将所有文件移动到存储组的 upgrade

...

  1. 目录下(即将分区号0改为upgrade)
    1. 如果存在非第0层的TsFile没有对应resource文件,则删除该文件
  2. 升级system.properties

    1. 使用iotdb_version的默认值设置到properties,与从旧文件中获得的信息一起写入到一个system.properties.

...

    1. tmp文件中
    2. 如果写入成功,删除旧的system.properties后将system.properties.tmp重命名为system.properties;
    3. 如果写入失败,会留下写入失败的system.properties.tmp和旧system.properties,此时我们需要重启iotdb重新进行升级

加载resource

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

    StorageGroupProcessor
  • SeqResourceList
  • UnSeqResourceList
  • upgradeSeqResourceList
  • upgradeUnSeqResourceList

    单独存到待升级的 upgradeSeqResourceList 和upgradeUnSeqResourceList中。

升级 TsFile

...

  1. 在加载完resource后 upgrade service会对每个sg中,每个需要 upgrade 的文件提交异步升级任务
  2. 拿到resource读锁
  3. upgrade.txt 记录 (v2文件路径,1)
  4. 升级工具从前向后check v2 TsFile文件,将文件解到page级别
    1. 对于boolean、text、和Int32类型,将page解码到数据点级别,用v3版writer写成新的page

...

    1. data(原因:boolean需要生成sum的statistic,text和Int32中的int变成了varInt)
  1. 使用v3版ioWriter序列化新的chunk、pageheader结构,pagedata
  2. 当v2 TsFile存在对应mods文件时,同时生成对应升级后的mods文件
  3. 关闭所有新生成的每一个新文件,并生成对应的新resource
  4. upgrade.txt 记录 (v2文件路径,2)
  5. 释放resource读锁
  6. 拿到resource写锁

...

  1. 更新updateNewlyFlushedPartitionLatestFlushedTimeForEachDevice

  2. StorageGroupProcessor 中的 upgradeFileCount--
  3. 如果此时StorageGroupProcessor中所有tsfile升级完成,即upgradeFileCount == 0,
    1. 拿到insert写锁和TsFileManagement写锁 
    2. 将新生成的TsFile、resource和升级后的mods文件(若有)移动到对应常规分区目录中;
    3. 将所有升级后的resource加载到tsFileManagement中
    4. 删除旧tsfile、resource和mods(若有)文件
    5. 释放insert写锁和TsFileManagement写锁 
  4. 并且更新partitionLatestFlushedTimeForEachDevice
  5. upgrade.txt 记录 (v2文件路径,3)
  6. 释放resource写锁

升级恢复

当升级未完成时,重启IoTDB时,需要根据upgrade.txt记录恢复升级

  • 如果一个v2文件日志记录只有1:删除新生成的对应v3文件,之后该文件会重新升级

  • 如果一个v2文件日志记录只有1,2:将新生成的TsFile、resource和原本的mods文件(若有)移动到对应正常目录中

...

  • 如果一个v2文件日志记录只有1:删除新生成的对应v3文件,之后文件会重新升级

  • 如果一个v2文件日志记录只有1,2:升级线程在进行升级该文件时跳过写新文件文件,直接从9继续进行