免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

TDengine 3.3.8.1 版本深度解析:ALTER RSMA 增量聚合能力与关键缺陷修复

TDengine 3.3.8.1 版本深度解析:ALTER RSMA 增量聚合能力与关键缺陷修复 TDengine 3.3.8.1 版本深度解析ALTER RSMA 增量聚合能力与关键缺陷修复【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine导读本文以 TDengine 3.3.8.1发布日期 2025-10-11官方 Release Notes 为主体深入解析该版本唯一的核心增强——ALTER RSMA语句并结合仓库源码与官方 RSMA 文档梳理滚动物化聚合Rollup SMA的完整生命周期同时逐条解读 11 项缺陷修复背后的技术场景帮助运维与开发者在升级到 3.3.8.1 后快速评估影响面、验证修复效果。读完本文你将掌握 RSMA 的创建、修改、删除、查看与手动计算全流程并能针对每个修复项设计出可落地的回归验证思路。版本概览3.3.8.1 是一个聚焦「稳定性与可用性」的补丁版本包含1 项增强Enhancement与11 项缺陷修复Fixes发布时间为 2025-10-11。从修复分布看该版本覆盖了流式计算Stream、物化聚合RSMA、连接管理perf_connections、WebSocket/STMT、数据同步taosX decimal、平台兼容Windows 本地变量显示、文件系统跨设备 move_to、存储引擎磁盘刷盘线程死锁以及消息订阅带标签过滤条件的 Topic等多个子系统是一次覆盖面较广的常规修复版本。核心增强ALTER RSMA —— 支持修改物化聚合函数3.3.8.1 最重要的功能变化是新增ALTER RSMA语句它补全了 RSMARollup SMA滚动物化聚合对象在创建之后缺少的「可变更」能力使 RSMA 的生命周期管理从「创建—查询—删除」扩展为完整的「创建—变更—查询—删除」。RSMA 是什么RSMA 是 TDengine 企业版自 v3.3.8.0 起提供的**降采样存储downsampled storage**能力它按时间窗口对用户数据进行降采样聚合并将聚合结果落盘保存。其典型适用场景是——原始数据只保留较短时间而降采样数据需要保留更长时间由于降采样后数据体积远小于原始数据可显著降低磁盘占用且查询可直接扫描降采样结果以获得更快的响应速度见 RSMA 文档。RSMA 具备两类触发机制自动触发数据从低存储层级向高存储层级迁移时自动执行降采样由数据库的KEEP选项keep0/keep1/keep2控制多级存储可参考 多级存储规划手动触发当数据发生更新/删除后需要重算降采样结果或数据已迁移到目标层级但尚未完成降采样时可手动触发计算。RSMA 的一个关键语义承诺是RSMA 不改变查询语义查询时间范围横跨多个存储层级时结果中可能同时包含原始数据与降采样数据。ALTER RSMA 语法与语义ALTER RSMA [IF EXISTS] [db_name.]rsma_name FUNCTION ([func_name(col_name)[, ...]]);该语句用于变更列的聚合函数主要面向新增列的场景。其语义约束在 RSMA 文档中有明确说明需要注意以下两点只能修改此前未显式指定聚合函数的列。在CREATE RSMA时未通过FUNCTION显式指定的列其聚合函数默认为LAST修改默认行为可能改变变更前后的聚合语义因此官方文档明确提示操作前务必确认业务需求。结合CREATE RSMA的语法可以更完整地理解这条约束的来源CREATE RSMA [IF NOT EXISTS] rsma_name ON [dbname.]table_name FUNCTION([func_name(col_name)[, ...]]) INTERVAL(interval1[, interval2]);在创建 RSMA 时FUNCTION列表可以省略或为空未显式指定的列一律默认使用LAST聚合复合主键列只支持FIRST/LAST未指定时同样默认LAST。ALTER RSMA正是为这种「默认值列」提供事后显式指定聚合函数的能力。源码佐证RSMA 变更的消息处理链路从仓库源码看RSMA 的管理面逻辑集中在 mnode 的 mndRsma.c。mndInitRsma在 mnode 初始化时注册了一整套消息处理入口mndSetMsgHandle(pMnode, TDMT_MND_CREATE_RSMA, mndProcessCreateRsmaReq); mndSetMsgHandle(pMnode, TDMT_MND_DROP_RSMA, mndProcessDropRsmaReq); mndSetMsgHandle(pMnode, TDMT_MND_ALTER_RSMA, mndProcessAlterRsmaReq); mndSetMsgHandle(pMnode, TDMT_MND_GET_RSMA, mndProcessGetRsmaReq);可见ALTER RSMA在 3.3.8.1 中已成为与CREATE/DROP/GET平级的独立 RPC 消息类型TDMT_MND_ALTER_RSMA并配套了TDMT_VND_ALTER_RSMA_RSP应答消息说明变更操作会经由 mnode 分发到 vnode 侧执行并回传结果——这是一条完整的两阶段消息链路。RSMA 对象本身在 sdbmnode 的共享数据库中以SDB_RSMA表持久化序列化格式中包含name、tbName、dbFName、interval[0/1]、intervalUnit、nFuncs、funcColIds、funcIds等字段其中聚合函数集合以「列 ID 函数 ID」的配对数组形式保存这正是ALTER RSMA修改函数列表时需要更新的核心数据。RSMA 生命周期管理全景围绕ALTER RSMA这里将 RSMA 对象管理的完整命令族一并梳理均出自 RSMA 文档操作语法要点创建CREATE RSMA [IF NOT EXISTS] rsma_name ON [dbname.]table_name FUNCTION([...]) INTERVAL(interval1[, interval2])只能在超级表上创建含BLOB/MEDIUMBLOB列的超表暂不支持名字规则同表名最长193字符修改ALTER RSMA [IF EXISTS] [db_name.]rsma_name FUNCTION ([...])3.3.8.1 新增仅能修改未显式指定函数的列删除DROP RSMA [IF EXISTS] [db_name.]rsma_name删除后重建可能造成前后聚合函数不一致需确认业务需求查看定义SHOW CREATE RSMA [db_name.]rsma_name返回完整的重建语句列出全部SHOW [db_name.]RSMAS或SELECT * FROM information_schema.ins_rsmas [WHERE db_name {db_name}]func_list仅展示创建时显式指定的函数手动计算ROLLUP DATABASE db_name [start_opt] [end_opt]/ROLLUP [db_name] VGROUPS IN (vgroup_ids) [start_opt] [end_opt]支持START WITH/END WITH指定时间范围查看任务SHOW RETENTIONS/SHOW RETENTION {retention_id}展示每个 vgroup 的计算进度终止任务KILL RETENTION {retention_id}终止指定 retention 任务其中SHOW CREATE RSMA的官方示例输出如下可作为验证ALTER RSMA生效与否的直观手段taos SHOW CREATE RSMA rsma7\G; *************************** 1.row *************************** RSMA: rsma7 Create RSMA: CREATE RSMA rsma7 ON d0.stb1 FUNCTION(min(c0),max(c1),avg(c2),sum(c3),first(c4),last(c5),first(c6)) INTERVAL(60000a,300000a) Query OK, 1 row(s) in set (0.005250s)CREATE RSMA 的 INTERVAL 约束修改时同样受其影响ALTER RSMA只修改函数列表而不修改INTERVAL因此创建时的窗口约束对理解降采样行为仍然关键INTERVAL必须指定 12 个值取值范围[0, DURATION]按数据库精度换算且至少一个非0interval1 0表示第 2 层不做降采样interval2 0表示第 3 层不做降采样必须带时间单位允许a毫秒、b纳秒、u微秒、s秒、m分钟、h小时、d天不支持w/n/y两个 interval 均为正时要求interval1 interval2且interval2必须是interval1的整数倍两者均不得超过数据库DURATION且DURATION应能被每个正 interval 整除以降低跨文件边界计算的复杂度、资源消耗与碎片化令interval2为interval1的整数倍可保证MIN/MAX/SUM/FIRST/LAST相对原始数据的正确性AVG仍可能存在误差。缺陷修复逐条解析1. 时间戳列上同时执行 first / last 函数返回错误结果该修复针对的是同一查询中、同一时间戳列上同时执行FIRST与LAST时结果不正确的问题。FIRST/LAST是 TDengine 中最常用的时序语义函数在聚合执行器executor中通过保留窗口内首末行记录实现同一列被两个函数同时引用时若执行器对共享状态如首末行指针、分组上下文处理不当就会产生交叉污染。建议在升级后用如下形态的语句回归验证SELECT FIRST(ts), LAST(ts) FROM stb INTERVAL(1m);2. 周期触发模式下taosd 重启后首个窗口计算结果不正确该修复针对Stream流式计算在周期触发periodic trigger模式下taosd 重启后首个窗口计算结果错误的问题。流计算的状态已计算窗口边界、触发游标在重启后需要从 WAL / 检查点恢复若首个窗口的边界恢复逻辑存在偏差会导致窗口内容不完整或重复计算。该问题与窗口边界持久化强相关可在 CI 场景中用「写入数据 → 重启 taosd → 检查首个窗口聚合结果」的方式做重启一致性回归。3. perf_connections 中 end_point 信息不正确perf_connections是 TDengine 的连接性能监控表TSDB_MGMT_TABLE_CONNS可见于 profile.cpp 的单元测试引用。该修复修正了连接表中end_point远端端点地址信息展示不准确的问题——通常与连接建立时端点的解析/记录时机有关。升级后可通过SELECT * FROM perf_connections观察各连接的end_point是否与实际客户端来源一致。4. taosX 同步 decimal 数据时的精度丢失该修复针对taosX 数据同步工具在传输DECIMAL类型数据时发生精度丢失的问题。DECIMAL属于精确数值类型跨端序列化/反序列化或中间格式转换如 JSON、字符串时若未保留 scale 信息就会引入精度损失。仓库中 decimal 实现位于 source/libs/decimal涉及DECIMAL的编码解码路径均可作为排查范围。回归方法构造高精度 decimal 数据经 taosX 同步后对比源库与目标库的逐位数值是否一致。5. Windows 平台上 show local variables like timezone 显示不正确该修复针对Windows 平台下SHOW LOCAL VARIABLES LIKE timezone显示错误的问题。本地变量local variables中的timezone取值依赖操作系统时区探测Windows 与时区相关的 API如GetTimeZoneInformation与 POSIX 时区命名体系存在差异容易导致解析失败或显示异常。升级后在 Windows 上执行上述语句即可验证。6. 流计算 count 窗口指定 DELETE_RECALC 选项后未报错该修复针对的是流计算使用 count 窗口count window时指定DELETE_RECALC选项后系统未报告错误的问题。DELETE_RECALC是流式任务的触发选项之一其枚举定义与解析可见于 parAst.h 与 sql.ySTREAM_TRIGGER_OPTION_DELETE_RECALC表示数据删除后触发重算。问题在于——DELETE_RECALC依赖删除事件的时间语义而count 窗口以「行数」而非「时间」为窗口边界两者语义上不兼容因此正确行为应当是在创建 stream 时直接拒绝该组合。本次修复即为在该场景下补充参数合法性校验并报错防止用户创建出行为不符合预期的流任务。7. 修复若干 Explorer 拼写错误属于纯界面/文案层修复修正了 TDengine Explorer 中的若干拼写错误不影响功能行为。8. move_to 跨设备cross-dev失败该修复针对文件移动操作move_to在**跨设备cross-device**场景下失败的问题。跨设备移动在底层往往需要「复制 删除」而非简单的rename(2)后者跨文件系统时会返回EXDEV若实现未处理该回退路径就会失败。从仓库结构看文件移动相关逻辑位于 source/os/src/osFile.cos模块封装了跨平台文件操作。升级后可在启用了多级存储/不同挂载点的环境上验证文件迁移与层级流转是否正常。9. 使用 STMT 时 WebSocket 重连导致崩溃该修复针对WebSocket 连接在重连过程中使用 STMT预编译语句时触发崩溃的问题。STMT 在连接上下文连接句柄、参数绑定结构中持有会话状态WebSocket 重连会重建底层连接对象若 STMT 上下文的指针未随重连更新或释放时机不当即可能悬垂引用崩溃。相关代码路径可参考 source/client/wrapperC 接口封装与 STMT 实现。回归方法通过 WebSocket 建立连接 → 执行 prepare/bind/execute → 强制断线重连 → 再次执行 STMT反复循环验证稳定性。10. 高负载读写下磁盘刷盘线程可能死锁该修复针对大量写入与查询并发时磁盘刷盘disk flush线程可能发生死锁的问题。刷盘线程与查询/写入路径存在锁竞争如文件锁、缓冲区锁、vnode 锁在极端并发下若锁获取顺序不一致可能形成循环等待。此类死锁通常伴随 taosd 日志中的刷盘线程长时间无进展、写入延迟飙升等特征。升级后可通过高并发读写压测观察刷盘线程如taosd线程列表中的 flush 相关线程是否持续正常运行。11. 订阅带标签选择条件的 Topic 时标签过滤未生效该修复针对数据订阅TMQ场景下订阅一个带 tag 选择条件的 topic 时tag 过滤条件未生效的问题。订阅端在消费数据时需按 topic 定义中的 tag 条件过滤数据若过滤谓词在下推或消费端应用阶段丢失订阅者就会收到本应被过滤掉的数据。回归方法创建一个带 tag 过滤条件的 topic如SELECT * FROM stb WHERE tag1 x订阅并消费确认仅收到满足条件的行。升级与回归建议结合本版本增强与修复内容建议按以下顺序制定升级后的回归清单RSMA 相关若使用企业版降采样存储重点验证ALTER RSMA对新增列的聚合函数修改是否生效用SHOW CREATE RSMA比对并确认修改前后业务对聚合语义的预期流计算相关覆盖 count 窗口 DELETE_RECALC的非法组合应报错、周期触发模式下重启 taosd 后首窗口计算正确、FIRST(ts)LAST(ts)同列联查结果正确连接与订阅WebSocket STMT 断线重连循环、带 tag 过滤条件的 Topic 订阅过滤、perf_connections的end_point显示存储与平台多级存储/跨设备场景下的move_to、高并发读写下的刷盘线程稳定性、Windows 平台timezone本地变量显示、taosX 同步 decimal 精度。以上修复大多属于行为正确性修正升级后可通过针对性的 SQL 与场景测试快速验证对于未涉及 RSMA 与上述场景的业务3.3.8.1 可视为低风险的稳定性补丁版本。【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表