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,则需要升级进行文件移动
  2. 检查是否存在未关闭的v2 tsfile(即是否存在wal,tsfile文件数是否等于resource文件数tsfile,如果有,IoTDB会结束进程。
    1. 检查是否存在wal
    2. 检查第0层TsFile数量与resource数量是否相同
    3. 如果存在非第0层的TsFile没有对应resource文件,则删除该文件
  3. 扫描各个存储组顺序与乱序的数据目录(仅针对在0.11的数据上第一次启动0.12),将所有文件移动到存储组的 upgrade 目录下(当做一个特殊分区号)目录下(即将分区号0改为upgrade)
  4. 升级system.properties

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

加载resource

  • StorageGroupProcessor 加载各个分区 resource,并且检查是否存在 upgrade 分区,将 upgrade 目录中的 TsFile 单独存到待升级的 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 data(原因:boolean需要生成sum的statistic,text和Int32中的int变成了varInt)
  5. 使用v3版ioWriter序列化新的chunk、pageheader结构,pagedata
  6. 当v2 TsFile存在对应mods文件时,同时生成对应升级后的mods文件
  7. 关闭所有新生成的每一个新文件,并生成对应的新resource
  8. upgrade.txt 记录 (v2文件路径,2)
  9. 释放resource读锁
  10. 拿到resource写锁
  11. 更新updateNewlyFlushedPartitionLatestFlushedTimeForEachDevice

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

升级恢复

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

...