TDengine 数据保留与 TTL — 多级存储、过期删除与分层迁移

分类 :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: 磁盘满了但数据还没过期怎么办?

  1. 扩容:增加 dataDir 同级目录
  2. 缩短 KEEP + TRIM 回收空间
  3. 手动 DELETE 删除不需要的数据范围
  4. 降级到更低 tier(如果有配置)

Q4: DURATION 可以修改吗?

不可以。DURATION 在 CREATE DATABASE 时确定,后续无法修改。因为已有文件按 DURATION 分组,修改会导致文件边界混乱。如需变更,只能新建数据库并迁移数据。

参考

系统构架篇

数据模型

存储引擎

关于 TDengine

TDengine 专为物联网IoT平台、工业大数据平台设计。其中,TDengine TSDB 是一款高性能、分布式的时序数据库(Time Series Database),同时它还带有内建的缓存、流式计算、数据订阅等系统功能;TDengine IDMP 是一款AI原生工业数据管理平台,它通过树状层次结构建立数据目录,对数据进行标准化、情景化,并通过 AI 提供实时分析、可视化、事件管理与报警等功能。

相关推荐
AI猫站长1 小时前
快讯|地瓜机器人旭日S600 560TOPS算力平台适配自变量具身基础模型,蚂蚁灵波与简智联合研发专属数采设备,龙旗工厂智元机器人8小时作业成功率99.5%
大数据·人工智能·机器学习·机器人·具身智能
安当加密03011 小时前
等保2.0三级数据库加密:2026检查清单 + TDE部署实战(附脚本)
数据库·网络安全·数据安全·tde·等保2.0·数据库加密·tde透明加密
Kaistar-alice1 小时前
“智慧能源・物联网” 的来龙去脉
物联网·能源
解决问题no解决代码问题1 小时前
TiDB 原理与节点宕机实战讲解
数据库·tidb
咖啡星人k1 小时前
长亭百智云:全新一代AI基础服务平台深度解读
大数据·人工智能·架构·rag·mcp·百智云
黎阳之光1 小时前
虚实同源·数智治水:黎阳之光视频孪生,重构智慧水务新范式
运维·物联网·算法·安全·数字孪生
江湖中的阿龙1 小时前
Redis 五大核心数据类型底层原理
数据库·redis·缓存
i嘻嘻8321 小时前
高性能聚合物泡沫:从材料替代走向系统级价值重构
大数据