如何用 TDengine 企业版 RSMA 降采样存储降低长周期数据的磁盘占用
2026/9/15 15:04:52 网站建设 项目流程

如何用 TDengine 企业版 RSMA 降采样存储降低长周期数据的磁盘占用

【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine

如果你的场景是「原始数据只保留一段时间,但降采样后的数据要保留很久」(例如最近几周保留原始精度,更早的数据按小时或天级窗口聚合后再存),TDengine 企业版的降采样存储可以按时间窗口对数据做降采样(downsampling)并落盘:降采样数据体积远小于原始数据,可减少磁盘占用,查询时可直接扫描降采样数据,响应更快。本功能自v3.3.8.0起在企业版提供,对应的对象叫 Rollup SMA(Small Materialized Aggregation,简称 RSMA)。

适用前提:

  • TDengine 企业版,版本v3.3.8.0及以上;
  • 配置了多级存储(RSMA 的自动触发依赖数据从低层级向高层级迁移);
  • RSMA 只能基于超级表创建。

1. 准备条件:多级存储与 KEEP 配置

RSMA 支持自动触发:数据由低存储层级向高存储层级迁移时自动完成降采样存储,由数据库KEEP参数(keep0/keep1/keep2)控制。企业版KEEP可以设置多个保存时间,以英文逗号分隔,最多 3 个,并满足keep0 <= keep1 <= keep2,如KEEP 100h,100d,3650d;社区版不支持多级存储,配置多个保存时间不会生效。多级存储规划见 数据库参数说明。

多级存储本身在配置文件/etc/taos/taos.cfg中通过dataDir配置,支持 3 级,每级最多 128 个挂载点:

dataDir [path] <level> <primary>

例如:

dataDir /mnt/data1 0 1 dataDir /mnt/data2 0 0 dataDir /mnt/data3 1 0 dataDir /mnt/data4 1 0 dataDir /mnt/data5 2 0 dataDir /mnt/data6 2 0

配置规则(来自 多级存储与对象存储):

  • level取值为012:0 级存最新数据,1 级存次新数据,2 级存最老数据,数据流向为 0 级 -> 1 级 -> 2 级,迁移由系统自动完成;
  • 整个配置中只允许一个主挂载点(level=0,primary=1);
  • 不允许跨级配置:合法组合是仅 0 级、0+1 级、0+1+2 级,不能跳过 1 级只配 0 级和 2 级;
  • 禁止手动移除使用中的挂载盘,挂载盘不支持非本地的网络盘。

数据文件保存时间超过KEEP后,删除或迁移不会立即执行,会额外等待KEEP_TIME_OFFSET指定的延迟(默认0h),可以借此与业务高峰期错开。

2. 创建 RSMA

创建语法:

CREATE RSMA [IF NOT EXISTS] rsma_name ON [dbname.]table_name FUNCTION([func_name(col_name)[, ...]]) INTERVAL(interval1[, interval2]);

创建时需指定 RSMA 名称、表名、函数列表和窗口大小。关键约束:

  • 命名规则与表名相同,最大长度193;只能基于超级表创建。若超级表列包含BLOB/MEDIUMBLOB类型,暂不支持 RSMA。
  • FUNCTION支持MINMAXSUMAVGFIRSTLAST。函数参数必须为 1 个,且是非主键普通列,不能为标签列;非数值类型列不能指定SUM/AVG等数值聚合函数。FUNCTION可省略或为空,未显式指定函数的列默认使用LAST。复合主键列仅支持FIRST/LAST,未显式指定时默认亦为LAST
  • INTERVAL至少 1 个、至多 2 个,取值范围为[0, DURATION](按数据库精度换算),且至少一个非0interval1 = 0表示 level 2 不降采样;interval2 = 0表示 level 3 不降采样。
  • 时间单位可用:a(毫秒)、b(纳秒)、u(微秒)、s(秒)、m(分钟)、h(小时)、d(天);不支持w/n/y
  • 当两个 interval 均为正数时,须满足interval1 < interval2,且interval2interval1的整数倍;二者均不得超过数据库DURATION,且DURATION必须能被各正数 interval 整除,以降低跨文件边界计算带来的复杂度、资源消耗和碎片化。
  • interval2interval1整数倍可保证MIN/MAX/SUM/FIRST/LAST相对原始数据的正确性;AVG仍可能存在误差。

一个符合文档示例的创建语句(示例来自 降采样存储文档):

CREATE RSMA `rsma7` ON `d0`.`stb1` FUNCTION(min(`c0`),max(`c1`),avg(`c2`),sum(`c3`),first(`c4`),last(`c5`),first(`c6`)) INTERVAL(60000a,300000a);

3. 触发降采样计算

创建 RSMA 后,计算有两条路径:

自动触发(默认路径):数据由低存储层级向高存储层级迁移时自动完成降采样存储。前提是数据库KEEP已配置多级保存时间、多级存储已就绪。

手动触发:适用于「降采样数据更新或删除后需要重算」以及「已迁移至目标存储层级但尚未降采样」等场景。

ROLLUP DATABASE db_name [start_opt] [end_opt] ROLLUP [db_name] VGROUPS IN (vgroup_ids) [start_opt] [end_opt]

start_opt/end_opt支持三种写法:

start_opt ::= START WITH timestamp_literal -- 如 'YYYY-MM-DD HH:MM:SS' | START WITH unix_timestamp -- 如 1672531200 | START WITH TIMESTAMP timestamp_literal end_opt ::= END WITH timestamp_literal | END WITH unix_timestamp | END WITH TIMESTAMP timestamp_literal

示例:

taos> ROLLUP DATABASE d0 START WITH '2025-12-30 10:00:00.000' END WITH '2025-12-31 10:00:00.000'; result | id | reason | =================================== accepted | 53584270 | success | taos> ROLLUP d0 VGROUPS IN (2,3) START WITH '2025-12-30 10:00:00.000'; result | id | reason | =================================== accepted | 1726039381 | success |

手动重算的行为边界(务必了解):

  • 未指定时间范围时,计算KEEP落在[INT64_MIN, now]之间的所有文件组;指定时间范围时只计算该范围内的文件组。
  • 手动重算主要用于对尚不满足多级存储迁移条件的 level 2 / 3 文件组做降采样计算与存储。
  • 若指定时间范围内的文件组仍在 level 1,且不满足向更高层级迁移的条件,则不计算。
  • ROLLUP后若未写入新数据,不会重复计算;对 level 2 / 3 文件组,若上次ROLLUP后有新数据写入或更新,或满足 level 2 向 level 3 迁移条件,则进行计算。
  • 若需重算的文件组已在 S3 上,重算生成的文件组会重新落到本地,远端文件组不再生效;后续再触发 S3 上传可能报错,需手工删除远端文件组(该逻辑与COMPACT相同)。

4. 验证:查看 RSMA、任务进度与磁盘占用

查看已创建的 RSMA

SHOW [db_name.]RSMAS; SELECT * FROM information_schema.ins_rsmas [WHERE db_name = '{db_name}'];

{db_name}为要查询的库名。文档示例输出:

taos> SHOW RSMAS\G; *************************** 1.row *************************** rsma_name: rsma7 rsma_id: 4785417934375247480 db_name: d0 table_name: stb1 table_type: SUPER_TABLE create_time: 2025-10-03 23:03:57.577 interval: 60000a,300000a func_list: min(c0),max(c1),avg(c2),sum(c3),first(c4),last(c5),first(c6)

其中func_list只显示创建时通过FUNCTION显式指定的函数。也可以对单个 RSMA 查看完整创建语句:

SHOW CREATE RSMA [db_name.]rsma_name;

查看降采样任务进度ROLLUP执行后会产生 retention 任务,用以下命令跟踪:

SHOW RETENTIONS; SHOW RETENTION {retention_id};

文档示例输出(数值为示例,实际以你的环境为准):

taos> SHOW RETENTIONS; retention_id | db_name | start_time | trigger_mode | type | ============================================================================ 857434526 | d0 | 2025-10-11 11:26:04.649 | manual | rollup | taos> SHOW RETENTION 857434526; retention_id | vgroup_id | dnode_id | number_fileset | finished | start_time | progress(%) | remain_time(s) | =========================================================================================================================== 857434526 | 6 | 1 | 4 | 1 | 2025-10-11 11:26:04.649 | 24 | 31 | 857434526 | 7 | 1 | 0 | 0 | 2025-10-11 11:26:04.649 | 0 | 0 |

vgroup行的finished列表明该文件组是否已处理完,progress(%)remain_time(s)反映当前进度与预估剩余时间。若任务需要中止:

KILL RETENTION {retention_id};

核对磁盘占用变化:RSMA 降采样完成后会删除对应原始数据文件,降采样数据与原始数据的时间范围不重叠。确认数据已落盘后,可用 存储规划文档中的方式核对存储空间:

taos> flush database <dbname>; $ du -hd1 <dataDir>/vnode --exclude=wal

<dbname>替换为目标库名,<dataDir>替换为taos.cfg中配置的数据目录(如 0 级挂载点/mnt/data1)。对比降采样前后的输出即可确认 level 1 / 2 上的占用变化。

验证查询路径:RSMA 不改变查询语义,直接按原 SQL 查询即可。注意若查询时间范围跨越多个存储层级,结果中可能同时包含原始数据与降采样数据。

5. 限制与维护要点

以下约束直接影响 RSMA 数据的准确性与后续操作,来自 降采样存储文档:

  • 1 / 2 / 3 存储层级的数据均支持更新和删除,但更新与删除不会自动触发重算。当 2 / 3 层存在乱序写入时,已聚合窗口内可能出现多条数据;手动重算会同时基于聚合结果与乱序数据,对AVG/FIRST/LAST等函数再次聚合的结果可能不准确,对MIN/MAX/SUM等无影响。
  • 存在 RSMA 时仍可做表结构修改、建表删表;这些操作在计算与重算时延迟生效。
  • RSMA 与 S3 迁移存在依赖:S3 首次迁移时需先完成 RSMA 计算。
  • 修改 RSMA 只能改「此前未显式指定函数的列」的聚合函数(主要用于新增列场景),未显式指定函数的列默认聚合为LAST,修改可能导致前后聚合语义不一致,操作前确认业务需求:
ALTER RSMA [IF EXISTS] [db_name.]rsma_name FUNCTION ([func_name(col_name)[, ...]]);
  • 删除后再重建 RSMA,有可能造成聚合函数前后不一致:
DROP RSMA [IF EXISTS] [db_name.]rsma_name;

下一步

  • 多级存储的整体规划(容量划分、写入性能、维护方式)参见 存储规划 · 多级存储。
  • 如需把最冷数据进一步放到 S3 / 共享存储以降低成本,参见 多级存储与对象存储 中的共享存储配置(ssEnabledssAccessString等),并注意 RSMA 与 S3 首次迁移的依赖关系。

【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询