如何用 TDengine 企业版数据重整 compact 改善存储放大并提升查询效率
【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine
在多种写入场景下,TDengine 的存储会产生数据放大或数据文件空洞,这既占用额外磁盘空间,也会拖慢查询。TDengine TSDB Enterprise 为此提供了数据重整功能(data compact):它把已存储的数据文件重新整理,删除文件空洞和被删数据、合并多个 STT 文件,从而提高存储和查询效率。该功能在 3.0.3.0 版本首次发布,此后经过多次迭代优化,建议使用最新版本。
本文覆盖两条执行路径:手动发起compact任务并跟踪进度,以及通过数据库参数配置自动 compact。
执行前的准备
- 环境为 TDengine TSDB Enterprise(compact 为企业版功能,自动 compact 参数同样仅企业版支持)。
- 版本 3.0.3.0 及以上,建议使用最新版本。
- 明确要重整的数据库名(或 vgroup 列表),以及是否需要限定时间范围。
手动发起 compact 任务
在 SQL 客户端中执行:
compact DATABASE db_name [start with 'XXXX'] [end with 'YYYY'] [META_ONLY] [FORCE]; compact [db_name.]vgroups IN (vgroup_id1, vgroup_id2, ...) [start with 'XXXX'] [end with 'YYYY'] [META_ONLY] [FORCE];第二条语句只针对指定 vgroup 列表;db_name省略时默认为当前数据库。各可选关键字的用途:
start with 'XXXX':compact 数据的起始时间。end with 'YYYY':compact 数据的终止时间。META_ONLY:只 compact 元数据。注意元数据默认情况下不会被 compact;元数据压缩会阻塞写入和查询,且被压缩的数据库应该在此期间停止写入和查询。FORCE:强制执行 compact,即使自上次 compact 以来没有新数据写入。
compact命令会返回 compact 任务的 ID,任务随后在后台异步执行。
跟踪任务进度并判断完成
用show compacts查看 compact 任务列表,用show compact compact_id查看指定任务在各vgroup/dnode上的明细进度:
show compacts; show compact compact_id;show compact的明细字段包括:compact_id、vgroup_id、dnode_id、number_fileset、finished、start_time、progress(%)、remain_time(s)(各 vgroup/dnode 上的进度、完成情况与剩余时间)。当任务完成后,对应条目不再出现在进行中的任务列表里;更完整的字段定义见 元数据视图 中的INS_COMPACTS和INS_COMPACT_DETAILS。
任务完成后,compact 的实际效果是:
- 删除被删除的数据以及被删除的表的数据;
- 合并多个 STT 文件;
- 整理后指定 DB(或指定 vgroup)中 vnode 的所有数据文件。
磁盘层面的变化可以用SHOW DISK_INFO查看数据库的磁盘占用信息(WAL、多级存储、缓存与元数据等),命令语法见 SHOW 命令。
需要终止任务时
kill compact compact_id;带force的变体是高风险操作,不要作为常规手段:
kill compact compact_id force;kill compact compact_id force会绕过 mnode 对 compact 任务的正常清理流程,强制从 SDB 中删除 compact 记录,允许在某个 dnode 离线时立即终止任务。但 compact 执行过程中正在修改的数据文件可能处于中间状态,强制删除记录不会触发离线节点侧的清理,可能导致数据文件损坏。文档建议仅在节点彻底损坏、无法恢复的极端情况下使用;若节点尚能正常启动,应优先将其拉起,再使用不带force的kill compact终止任务。
配置自动 compact(可选分支)
手动执行之外,可以借助数据库级参数让 compact 周期性自动触发(仅企业版支持,参数说明见数据库文档):
| 参数 | 取值范围 | 默认值 | 说明 |
|---|---|---|---|
COMPACT_INTERVAL | 0或[10m, keep2],单位为 m/h/d | 0 | 自动 compact 触发周期(从 1970-01-01T00:00:00Z 开始切分的时间周期)。0表示不触发自动 compact |
COMPACT_TIME_RANGE | [-keep2, -duration],单位为 m/h/d | [0, 0] | 每次自动 compact 整理的时间范围,值必须为负数(表示待 compact 的数据位于过去) |
COMPACT_TIME_OFFSET | [0, 23],单位 h | 0 | 自动 compact 触发时间相对本地时间的偏移 |
几个需要注意的行为:
COMPACT_TIME_RANGE取默认值[0, 0]时,只要COMPACT_INTERVAL大于 0,会按[-keep2, -duration]下发自动 compact。- 例如
-300,-200表示每次自动 compact 时整理距今 300 天到 200 天之间的数据。如果数据库的DURATION仍为默认值10d,-300,-5会报错,因为第二个值(距今 5 天)比-DURATION(距今 10 天)更靠近当前时间。 - 如果数据库中有未完成的 compact 任务,不会重复下发新的 compact 任务。
- 以
COMPACT_INTERVAL = 1d为例:COMPACT_TIME_OFFSET = 0时在每天 0 点下发自动 compact,偏移为 2 时在每天 2 点下发。 - 要关闭自动 compact 功能,需要将
COMPACT_INTERVAL设置为0。
限制与注意事项
- compact 是异步的,执行命令后立即返回,不会等待任务结束;如果上一个 compact 未完成就再发起一个,则会等上一个任务完成后再返回。
- compact 可能阻塞写入,尤其是在
stt_trigger = 1的数据库中,但不阻塞查询。stt_trigger用于控制 TSDB 数据落盘策略以及触发后台合并文件的文件个数,企业版默认值为2,开源版只能配置为1。 - 使用
META_ONLY做元数据压缩时,被压缩的数据库应该停止写入和查询。 - 若使用共享存储,数据库还有
SS_COMPACT参数(默认值1):0表示数据文件组首次迁移到共享存储前不进行 compact,1表示首次迁移前进行 compact。
延伸操作
- 若数据文件疑似损坏,可以用
scan DATABASE db_name系列命令扫描数据文件,问题会输出在相应服务端日志中,命令与限制见集群维护。 - 自动 compact 各参数的完整取值约束与示例,见数据库参数文档。
【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考