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

Compare with Current View Page History

Version 1 Next »


## 设计目的

- 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
			* 增加 tsfile_storage_fs
			* 增加 storage_group_time_range
			* 增加 iotdb_version
	  * 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

    * 使用tsfile_storage_fs,storage_group_time_range和iotdb_version的默认值设置到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