一. 设计目的
当mods文件里的删除记录到达一定数量时,势必会降低查询等相关操作的执行效率,同时由于TsFile里存储着大量被用户删除的数据,在一定程度上也浪费了存储资源。因此,我们开发了TsFile整理工具帮助你对指定的TsFile文件进行整理和重写。
二. 工具介绍
整理工具只能针对v0.12版本的IOTDB来使用,即只能针对版本为V3的tsFile进行整理,若低于此版本则必须先用在线升级工具将tsFile升级到V3版本。
tsFile整理工具分为在线整理工具和离线整理工具,两者在整理的时候都会记录日志,供下次恢复之前整理失败的文件。在执行整理的时候会先去检测日志里是否存在失败的文件,有的话则优先整理它们。
三. 离线整理工具
该工具的启动脚本settle.bat和settle.sh在编译了server后会生成至server\target\iotdb-server-{version}\tools\tsFileToolSet目录中。运行脚本时要给定至少一个参数,该参数可以是一个目录路径或者是一个具体的tsFile文件路径,不同参数间用空格分割。若参数是目录,则离线整理工具会递归寻找该目录下所有已封口的tsFile进行整理。若有多个参数,离线整理工具则会寻找指定参数下的所有tsFile文件,对他们依次进行整理。
在使用离线整理工具的时候,必须保证IOTDB server停止运行,否则会出错。
3.1 用户使用
3.1.1 运行方法
#Windows #MacOs or Linux |
---|
3.1.2 运行示例
>.\settle.bat C:\IOTDB\sourceCode\choubenson\iotdb\data\data\sequence\root.ln\0\0 ```````````````````````` |
---|
3.2 相关类
整理工具类:org.apache.iotdb.db.tools.settle.tsFileAndModSettleTool
四. 在线整理工具
当用户在IoTDB客户端输入了settle命令后,在线整理工具会在主线程启动整理服务Settle Service,该服务会去寻找指定存储组下的所有tsFile文件,依次对每个TsFile进行整理。在线整理工具在整理过程中不允许用户对该虚拟存储组下的数据有任何的删除操作,直到整理完毕。
此模块预留了整理线程的接口供后续为每个TsFile提供一个整理线程在后台执行整理操作,但目前只允许整理线程的串行执行,避免了线程的不安全。
4.1 用户使用
4.1.1 运行方法
IoTDB> Settle <存储组> |
---|
4.1.2 运行示例
IoTDB> Settle root.ln; Msg: The statement is executed successfully. |
---|
4.2 整理线程
4.2.1 工作流程
加读锁,避免在重写的过程中该tsFile被删除,而在删除该tsFile的本地mods文件前允许用户对该tsFile进行查询操作。【该步骤在StorageGroupProcessor类的settle()方法里】
往整理日志记录标记该文件的状态为1。
对旧tsFile和其mods文件进行整理并重写到新tsFile文件(此时新tsFile和对应的新.resource文件已经生成并存放在临时目录下,位置为:“旧tsFile所在目录\新tsFile时间分区目录\”)。若该旧tsFile数据都已被删除了,则会直接删除本地tsFile及其.resource文件。注意:在删除tsFile文件的前后会加写锁并释放写锁。【该步骤在tsFileAndModSettleTool类的settleOnetsFileAndMod()方法里】
往整理日志记录标记该文件的状态为2。
对旧tsFile文件加写锁,阻塞用户的查询等操作。【该步骤在StorageGroupProcessor类的settletsFileCallBack()方法里】
删除旧mods文件,然后将新tsFile和对应的新.resource文件移动到正确的目录下(即旧tsFile所在目录),此过程是先删除旧对应旧文件,再把新的移动过去。【该步骤在tsFileRewriteTool类的moveNewtsFile()方法里】
清空内存中与该tsFile的相关缓存数据,即该被重写的tsFile在内存中涉及到的相关数据都应该被及时更新:
(1) 需要clear cache (包括chunk cache和timeseriesmetadata cache),防止因为Mods被删除而读出该tsFile已被删除的数据(脏数据)
(2) 若整理后,此tsFile被删除,则要从StorageGroupProcessor的tsFileManagement里挪去该oldtsFileResource.
【该步骤在StorageGroupProcessor类的settletsFileCallBack()方法里】
对该tsFile释放写锁,允许用户对该文件进行查询操作,然后释放读锁,允许该文件被删除。
往整理日志标记该文件的状态为3,settle结束!
4.2.2 注意事项
在线整理工具在整理过程中阻塞了用户对该虚拟存储组下的数据有任何的删除操作,直到整理完毕。
4.2.3 补充说明
(1) 上一次settle重写的过程中,旧tsFile因数据都被删掉了而相关文件被删掉,还没完成settle过程就出现异常导致整理线程中断。于是下次启动后发现settle.txt日志里的该tsFile整理记录对应的本地文件不存在。
(2) 上一次settle重写过程中,重写完后在移动的过程中,旧tsFile被删除而新tsFile还未移动前该线程就意外中断了。
Settle重写NewtsFileResource的返回情况(即tsFileAndModSettleTool类的settleOnetsFileAndMod()方法的返回情况)
(1) 若旧tsFile没有封口,则不进行重写,返回null。
(2) 若旧tsFile没有mods文件,即没有删除记录,则不进行重写,返回null。
(3) 进行了重写后,旧tsFile的所有数据都被删除了,就会删除本地该tsFile文件和.resource文件,并且不会生成新的tsFile,则返回null。
4.3 相关类
整理线程类:org.apache.iotdb.db.engine.settle.SettleTask
整理日志类:org.apache.iotdb.db.engine.settle.SettleLog
整理工具类:org.apache.iotdb.db.tools.settle.tsFileAndModSettleTool
4.4 整理日志
整理共有三个状态,每个状态代表的含义如下:
(1) 状态1:代表该tsFile在整理中,还未生成新的tsFile
(2) 状态2:代表该tsFile的新tsFile已经生成,即整理线程已经把数据整理到新tsFile里了,还未移动到正确的目录下。
(3) 状态3:代表该tsFile已经整理完毕且整理成功,旧tsFile对应的.mods文件已被删除,新的tsFile和对应的.resource文件已经移动到正确的目录下。
当此次整理服务里所有的tsFile都被整理完毕且整理成功,就会删除整理日志settle.txt文件。
整理日志可用于在下次重启时恢复上次整理失败的那些tsFile文件,具体的步骤为:
1) 整理服务SettleService启动时,会先去查找settle.txt文件是否存在,若存在则读取日志中记录的那些整理失败的tsFile,把他们加入整理列表里。
2) 开始整理:
(1) 对于状态是1的文件,则会删除上次整理失败而残留的新tsFile文件,并进行重写整理写入到新tsFile,然后删除对应的旧mods文件,并把新的tsFile和.resource文件移动到正确的目录下。
(2) 对于状态是2的文件,说明其新tsFile和对应的.resource文件已经生成,则只要把它们移动到正确的目录下即可。