工业数据为什么要时序库
一条产线几千个点位,每个点每秒一条数据,一天就是上亿条。温度、压力、振动、电流都是带时间戳的序列,这种数据叫时序数据。用关系库硬扛,表越写越大,查询越来越慢,这就是工业数据平台卡顿的根源。
时序数据库按时间组织数据,写入快、压缩率高、聚合查询是内置能力。国产的 TDengine 在工业界用得很多,开源、SQL 兼容、集群部署简单,下面就用它讲清楚工业时序数据的存储实战。
- 超级表同一类型设备一张模板表。
- 子表每台设备一张,带标签。
- 降采样interval 按时间聚合。
- 集成边缘网关写入、OPC UA 对接。
核心思路:把设备的静态属性(编号、产线、位置)做成标签,把随时间变化的量(温度、电流)做成列,查询时按标签过滤、按时间聚合,海量点位也能秒级出结果。
TDengine 核心概念
TDengine 有三个关键概念:库、超级表、子表。库对应一个数据域,超级表定义字段结构,子表继承结构并绑定具体设备标签。
- 库:CREATE DATABASE,可设保留天数、副本数、分区数。
- 超级表:STABLE,定义时间戳列、测点列、标签列。
- 子表:实际存储数据的表,TAGS 绑定设备属性。
- 标签:字符串或数值,用于过滤,不随数据增长。
理解了这个模型,写入和查询就顺了:每台设备一个子表,查某台设备直接查它的子表,查整个车间按标签过滤所有子表,统计聚合由引擎并行完成。
建表与写入
先建库和超级表,再建子表,之后就是往里写数据。TDengine 支持标准 SQL,写入用 INSERT 语句,批量写效率更高。
-- 建库:数据保留 180 天
CREATE DATABASE factory KEEP 180 DURATION 10 BUFFER 256;
-- 建超级表:测点列 + 标签列
CREATE STABLE factory.meter (
ts TIMESTAMP,
voltage FLOAT,
current FLOAT,
temp FLOAT
) TAGS (line INT, device_id NCHAR(32));
-- 建子表并写数据
CREATE TABLE factory.m_001 USING factory.meter TAGS (1, 'D001');
INSERT INTO factory.m_001 VALUES (NOW, 220.5, 12.3, 45.6);
-- 批量写入(每行一个测点)
INSERT INTO factory.m_001 VALUES
(NOW - 1s, 220.4, 12.2, 45.5),
(NOW, 220.6, 12.4, 45.7);
标签不要建太多,一般十几列以内;标签值变化要重建子表。写入时间戳建议统一用设备本地时间,跨时区或网络延迟大的场景要约定好口径,否则聚合会错位。
查询与降采样
时序查询最常用的是降采样:把秒级原始数据按分钟、小时聚合成趋势数据,报表和看板直接查聚合结果,快得多。
-- 每 10 分钟一个聚合点:均值、最大值、最新值
SELECT _wstart, AVG(current), MAX(temp), LAST(voltage)
FROM factory.meter
WHERE line = 1
INTERVAL(10m);
-- 查某设备最近一小时原始数据
SELECT ts, voltage, current FROM factory.m_001
WHERE ts >= NOW - 1h;
-- 每台设备最近一条(配合标签)
SELECT device_id, LAST(current) FROM factory.meter
WHERE line = 1 GROUP BY device_id;
INTERVAL 聚合默认按时间窗分组,_wstart 是窗口起点。趋势看板用 10 分钟或 1 小时粒度,追溯故障才查原始数据,这样存储和查询压力都能控住。
与工业平台集成
TDengine 是存储层,数据要从现场进来:边缘网关把 PLC、仪表的数据转成 MQTT 或直接写入;OPC UA 服务器接进来要跑一个连接器;也可以从 Kafka 消费消息再批量写库。
- 网关直写:用 taosAdapter 的 REST 接口,网关按协议转换后 HTTP 写入。
- MQTT 路径:边缘设备发 MQTT,用规则引擎或自研消费者写入 TDengine。
- OPC UA:跑 UA Client 订阅节点变化,转成 INSERT 语句批量入库。
- 可视化:Grafana 有官方 TDengine 插件,直接查 SQL 出大屏。
集成时注意写入节奏:宁可攒 1 秒批量写一次,也不要一条一条 HTTP 请求,吞吐差十倍。采集频率高到毫秒级(如振动分析)时,考虑边缘预聚合再入库,避免库被原始数据撑爆。
容量规划与运维
容量规划先算账:点数乘频率乘字节数就是每天的写入量。1000 个点、1 秒一条、每条 20 字节,一天约 1.7GB,180 天约 300GB,三副本就是 900GB 磁盘。
- 保留策略:KEEP 控制保留天数,到期自动删除,不用手工清。
- 分区:DURATION 决定按多长时间分一个分区文件,查询按需扫。
- 压缩:TDengine 列式压缩,float 压缩比很高,实际占用远小于估算。
- 副本:单机不配副本,集群配 3 副本防数据丢失。
- 备份:定期用 taosdump 导出,异地保存一份。
监控库自身:taosAdapter 有 metrics,磁盘满了写入会失败;日常看集群健康、数据写入速率、查询耗时,出问题第一时间知道。
常见问题与选型
// 1. 写入慢:单条 INSERT 太多,改批量
// 2. 查询慢:没做降采样,直接扫原始数据
// 3. 时间戳乱:设备时钟不同步,统一 NTP
// 4. 标签设计不合理:过滤不了,扫全表
// 5. 磁盘爆:KEEP 没设或设太长
// 6. 选型:时序用 TDengine,事务用关系库,别混用
工业数据存储没有银弹:高频时序进时序库,业务单据进关系库,各自干各自擅长的事。
把 TDengine 用顺,数据从现场到看板一路畅通,工厂的数字化才真正落地。