分类 :3.存储引擎 | 篇章:07 数据保留与 TTL

适用版本:TDengine v3.x(v3.3.x / v3.4.x) | 最后更新:2026-06-01
时序数据随时间推移价值递减------最近的数据需要高速查询,较旧的数据可迁移到低成本介质,过期数据应自动清理。TDengine 通过 KEEP 多级保留、TTL 自动过期和多级存储目录实现完整的数据生命周期管理。
核心概念速查表
| 概念 | 说明 |
|---|---|
| KEEP | 数据保留天数,超过则自动删除 |
| KEEP 三级 | KEEP, KEEP1, KEEP2:三级保留策略(热/温/冷) |
| TTL | Table-level Time To Live,子表级别的过期策略 |
| DURATION | 单个 FileSet 覆盖的时间跨度 |
| dataDir | 多级存储挂载点(tier 0/1/2) |
| S3 | 对象存储外挂(企业版) |
详细解析
1. KEEP 参数与数据保留
KEEP 定义数据的最大保留时间:
CREATE DATABASE power KEEP 365d;
含义:
- 数据超过 365 天 → 对应 FileSet 被自动删除
- 删除单位是整个 FileSet(不是单行)
- 检查频率:后台定时检查(通常小时级)
三级 KEEP 与多级存储联动:
CREATE DATABASE power
KEEP 30d, 180d, 365d
DURATION 10d;
含义(配合 3 级 dataDir):
- KEEP(第3级, 最长): 365 天后删除
- KEEP2(第2级): 180~365 天的数据 → tier 2(冷存储)
- KEEP1(第1级): 30~180 天的数据 → tier 1(温存储)
- 0~30 天的数据 → tier 0(热存储/SSD)
时间线:
├─── 0~30天 ───┼── 30~180天 ──┼── 180~365天 ──┼── 删除 ──→
│ tier 0 │ tier 1 │ tier 2 │
│ SSD │ HDD │ 大容量HDD │
2. 数据过期与删除
文件过期检测:
每个 FileSet 有 fid,对应一个时间段 [T_start, T_end]
过期判定:
current_time - T_end > KEEP
→ 整个 FileSet 过期
→ 删除该 FileSet 的所有文件(.head/.data/.sma/.stt/.tomb)
删除粒度:
✓ 整个 FileSet(一组文件)
✗ 不是逐行删除
这就是 DURATION 的意义:
DURATION 越小 → FileSet 越多 → 过期精度越高(粒度细)
DURATION 越大 → FileSet 越少 → 过期精度低(可能多保留 DURATION 时间)
最佳实践:
KEEP=365d, DURATION=10d → 过期精度 ±10 天(可接受)
KEEP=30d, DURATION=1d → 过期精度 ±1 天
3. 数据分层迁移
三级存储的文件迁移机制:
FileSet 的层级判定(tsdbFidLevel 逻辑):
fid_time = FileSet 的时间段终点
age = current_time - fid_time
if age < KEEP1:
level = 0 → 文件存放在 tier 0 目录
elif age < KEEP2:
level = 1 → 文件应存放在 tier 1 目录
else:
level = 2 → 文件应存放在 tier 2 目录
迁移过程(后台自动):
① 定时检查每个 FileSet 的当前层级
② 如果实际位置 ≠ 应在层级 → 触发迁移
③ 迁移 = 在目标层的目录创建新文件 → 复制数据 → 删除源文件
④ 迁移过程不影响查询(读旧文件直到切换完成)
4. 多级存储目录配置
taos.cfg 中的多级存储配置:
# 三级存储目录
dataDir /ssd/taos 0 1 ← tier 0, primary=1(主目录)
dataDir /hdd1/taos 1 0 ← tier 1
dataDir /hdd2/taos 2 0 ← tier 2
格式:dataDir <path> <level> <primary>
- level: 0=热(SSD), 1=温(HDD), 2=冷(大容量/廉价存储)
- primary: 1=主目录(WAL/Meta 存放在这里),只能有一个
同级多目录(扩容):
dataDir /ssd1/taos 0 1
dataDir /ssd2/taos 0 0 ← 同为 tier 0,负载均衡
数据分配策略:
- 新数据写入 tier 0(最快)
- 同级多目录:轮询或按剩余空间分配
- 老数据自动降级到低 tier
5. TTL(Table Time To Live)
TTL 是子表级别的过期机制:
CREATE TABLE d1001 USING meters TAGS('Beijing') TTL 30;
含义:
- 子表 d1001 在最后一次写入后 30 天自动删除
- 注意:删除的是整张子表(而非部分数据)
TTL 与 KEEP 的区别:
┌──────────┬─────────────┬─────────────────────────────┐
│ 维度 │ KEEP │ TTL │
├──────────┼─────────────┼─────────────────────────────┤
│ 作用对象 │ 数据库级别 │ 子表级别 │
│ 删除粒度 │ FileSet文件 │ 整张子表 │
│ 过期基准 │ 数据时间戳 │ 最后写入时间 │
│ 典型场景 │ 保留最近N天 │ 删除不活跃设备的历史表 │
└──────────┴─────────────┴─────────────────────────────┘
TTL 检查周期:
- 后台线程定期扫描(默认 1 小时)
- 超过 TTL 的子表 → 从 META 和 TSDB 中完全清除
6. S3 对象存储外挂(企业版)
企业版 S3 分层存储:
配置参数:
- S3_ENDPOINT: S3 服务地址
- S3_ACCESS_KEY / S3_SECRET_KEY: 认证信息
- S3_BUCKET: 存储桶名称
- S3_KEEPLOCAL: 本地保留天数(之后迁移到 S3)
- S3_COMPACT: 上传 S3 前是否先 Compact
工作原理:
┌──────────┐ ┌──────────┐ ┌──────────┐
│ tier 0 │ ──→ │ tier 1/2 │ ──→ │ S3 │
│ 本地SSD │ │ 本地HDD │ │ 对象存储 │
│ < KEEP1 │ │< S3_KEEP │ │ 长期归档 │
│ │ │ LOCAL │ │ │
└──────────┘ └──────────┘ └──────────┘
查询 S3 数据:
- 查询时如果数据在 S3 → 自动下载到本地临时目录
- 下载后缓存一段时间(避免重复下载)
- 查询延迟显著高于本地(网络 I/O)
7. TRIM DATABASE
sql
-- 清理已经过期但尚未被自动删除的文件
TRIM DATABASE power;
-- 用途:
-- 1. 修改 KEEP 后立即清理旧数据
-- 2. 磁盘空间紧张时手动回收
-- 3. 加速过期检查(不等后台定时器)
8. DURATION 与 KEEP 的配比建议
| KEEP | 建议 DURATION | 文件集数量 | 说明 |
|---|---|---|---|
| 1 天 | 1 小时 | 24 | 短期监控 |
| 30 天 | 1 天 | 30 | 月级保留 |
| 365 天 | 10 天 | 36~37 | 年级保留 |
| 3650 天 | 30 天 | ~122 | 长期归档 |
原则:FileSet 总数控制在 30~200 之间,过多会增加文件管理开销,过少会降低过期精度和查询裁剪效果。
代码示例
创建多级保留数据库
sql
-- 典型的三级存储配置
CREATE DATABASE power
DURATION 10d
KEEP 30d,180d,365d
BUFFER 256
STT_TRIGGER 4;
-- 含义:
-- 0~30天: tier 0 (SSD)
-- 30~180天: tier 1 (HDD)
-- 180~365天: tier 2 (冷存储)
-- 365天后: 自动删除
使用 TTL 管理子表
sql
-- 创建带 TTL 的子表(90天不活跃即删除)
CREATE TABLE d1001 USING meters TAGS('Beijing','area1') TTL 90;
-- 修改已有子表的 TTL
ALTER TABLE d1001 TTL 30;
-- 取消 TTL(永不自动删除子表)
ALTER TABLE d1001 TTL 0;
修改保留策略
sql
-- 缩短保留时间(会触发数据删除)
ALTER DATABASE power KEEP 180d;
-- 之后手动清理
TRIM DATABASE power;
-- 延长保留时间(安全操作)
ALTER DATABASE power KEEP 730d;
性能考量
数据迁移对系统的影响
| 影响 | 说明 |
|---|---|
| 磁盘 I/O | 迁移 = 读源 + 写目标 + 删源 |
| 时间窗口 | 大量文件迁移可能持续数小时 |
| 查询影响 | 迁移期间查询不受阻塞 |
| 空间需求 | 迁移过程中源和目标短暂共存 |
S3 查询延迟
| 数据位置 | 首次查询延迟 | 后续查询 |
|---|---|---|
| 本地 SSD | 1~10ms | 同 |
| 本地 HDD | 5~50ms | 同 |
| S3(首次) | 100~2000ms | 有本地缓存后 < 50ms |
FAQ
Q1: 修改 KEEP 后数据会立即删除吗?
不会立即删除。后台定时线程下一次检查时才会执行清理。如果需要立即生效,执行 TRIM DATABASE。
Q2: TTL 和 KEEP 冲突时哪个优先?
两者独立运作:
- KEEP 按数据时间戳删除过期 FileSet
- TTL 按子表最后写入时间删除不活跃子表
- 一张子表可能因 TTL 被删除,也可能其数据因 KEEP 过期而被清理
Q3: 磁盘满了但数据还没过期怎么办?
- 扩容:增加 dataDir 同级目录
- 缩短 KEEP + TRIM 回收空间
- 手动 DELETE 删除不需要的数据范围
- 降级到更低 tier(如果有配置)
Q4: DURATION 可以修改吗?
不可以。DURATION 在 CREATE DATABASE 时确定,后续无法修改。因为已有文件按 DURATION 分组,修改会导致文件边界混乱。如需变更,只能新建数据库并迁移数据。
参考
系统构架篇
- 01-《TDengine 整体架构全景》
- 02-《集群拓扑深度解析》
- 03-《MNode 内部机制深度解析》
- 04-《RPC 通信层深度解析》
- 05-《VNode 生命周期》
- 06-《RAFT 共识协议》
- 07-《端到端的消息流》
数据模型
- 01-《数据库创建与参数详解》
- 02-《超级表/子表/普通表》
- 03-《支持数据类型深度解析》
- 04-《TDengine Tag 设计哲学与 Schema 变更机制》
- 05-《TDengine 虚拟表实现原理》
存储引擎
- 01-《TDengine 存储引擎概览》
- 02-《TDengine MemTable 深度解析》
- 03-《TDengine WAL 预写日志机制》
- 04-《TDengine 数据文件格式》
- 05-《TDengine Commit 与 Flush 机制 》
- 06-《TDengine Compaction 合并策略 》
关于 TDengine
TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。