时序数据库与工业存储专题
工业监控的数据量有多大?1000 个点每秒采集一次,每天就是 8640 万条。MySQL 扛不住,时序库才是正解。本专题把零散的教程和软件按 「认知 → 核心概念 → 选型 → 部署 → 采集写入 → 工程化」 串成一条可照着走的路径,不堆参数表,只讲现场真正用得上的部分。
一条路径走完时序数据库(六个阶段)
- 01
先建立整体认知:什么是时序数据、为什么关系库扛不住高频点位
工业监控的数据有一个鲜明特征:每个点位按固定频率持续产生,写入量巨大但结构简单。用 MySQL/PostgreSQL 存这种数据,几个月后查询就会慢得无法忍受。先搞清楚时序数据的特征和时序库的设计思路,后面的选型和优化才有方向。
- 时序数据三要素:时间戳(Timestamp) + 标签(Tag/Label,标识设备和测点) + 测量值(Value)
- 写入特征:95% 以上是写入,且是按时间顺序的追加写,很少更新和删除;这和关系库的随机读写完全不同
- 查询特征:几乎所有查询都带时间范围,按设备/测点分组,做聚合、降采样、趋势分析;关系库的 B+树索引对这种查询效率不高
- 时序库的核心设计:面向追加写优化的存储引擎、列式存储、时间分区、自动降采样、数据保留策略
- 02
核心概念:数据模型、存储引擎、压缩与保留策略
不同时序库的数据模型和存储引擎差异很大,但核心概念是相通的。搞清楚 Measurement/Tag/Field、分区策略、压缩算法、保留策略(RP)、连续查询(CQ)这些概念,无论用哪款时序库都能快速上手。
- 数据模型:InfluxDB 用 Measurement+Tag+Field;TDengine 用「一个数据采集点一张表」+ 超级表(STable);TimescaleDB 用标准 SQL 表 + Hypertable 自动分区
- 存储引擎:LSM-Tree(InfluxDB/TDengine) 写优化、追加写合并;TSBS 等;列式存储有利于压缩和聚合查询
- 压缩算法:时序数据规律性强,专用压缩算法(如 Gorilla、Delta-of-Delta、Snappy)能达到 5-20 倍压缩比,远高于关系库
- 保留策略(RP):自动删除过期数据,按「热数据在内存/SSD、温数据在 HDD、冷数据归档」分层存储,控制存储成本
- 连续查询(CQ)/降采样:自动把高频数据聚合成低频数据(如 1 秒→1 分钟→1 小时),长期趋势查询用降采样数据,速度快几十倍
- 03
选型对比:7 款主流时序库怎么选(国产 vs 国际、SQL vs 专用查询)
时序数据库是近 10 年发展最快的数据库品类,可选方案很多。选型不要只看性能排行榜,要结合你的团队技术栈、部署环境、数据规模、查询需求、社区生态综合判断。这里给出 7 款主流时序库的定位和适用场景。
- TDengine(国产开源):C 语言开发,性能极高,自带消息队列和缓存,「一个采集点一张表」模型适合工业场景,集群版开源,中文文档好,国产替代首选
- InfluxDB(国际最流行):Go 语言开发,生态最完善,Telegraf 采集器+Flux 查询语言+Grafana 可视化是监控领域经典组合,单机版开源,集群版商业
- TimescaleDB(PostgreSQL 扩展):标准 SQL 支持最好,兼容 PostgreSQL 生态,适合需要复杂查询和关系+时序混合场景,团队会 SQL 就能用,学习成本最低
- Apache IoTDB(国产 Apache 顶级):Java 开发,专为工业物联网设计,与 Hadoop/Spark 生态集成好,支持端边云协同,适合大数据和工业互联网场景
- VictoriaMetrics(监控领域黑马):Go 语言开发,Prometheus 兼容,资源占用极低,写入和查询性能优秀,适合监控指标存储,运维简单
- QuestDB(高性能时序分析):Java/C++开发,列存+向量化执行,SQL 支持好,插入性能极高,适合高频金融和工业数据分析
- Apache Druid(大数据分析型):Java 开发,亚秒级 OLAP 查询,预聚合+列式存储,适合 TB 级以上数据分析和高并发看板,资源需求较高
实战教程: 什么是时序数据库:为什么工业监控离不开它 → - 04
实战部署:TDengine 离线安装、集群部署与基础运维
工业环境往往不能联网,离线安装是基本功。以 TDengine 为例,从离线安装包准备、单机部署、集群部署、启动验证,到日常运维命令,一步步走通。TDengine 是国产时序库中工业场景落地最多的,掌握它的部署运维非常有价值。
- 离线安装:下载 TDengine-server 离线包,dpkg/rpm 安装,自动注册 systemd 服务,taosd 启动后用 taos 客户端验证
- 集群部署:至少 3 个节点,配置 firstEp/secondEp、fqdn、serverPort,逐个节点启动,用 show dnodes 验证集群状态
- 数据节点管理:create/drop dnode、扩容缩容、负载均衡,vnode 自动分布
- 日常运维:taos 客户端、taosdump 备份恢复、taosBenchmark 性能测试、日志查看、慢查询分析
- 安全加固:修改默认密码、创建独立用户、按数据库授权、开启审计日志、防火墙限制端口
相关软件: TDengine - 05
数据采集与写入:Telegraf、边缘网关、直连写入与降采样
时序库只是存储,数据怎么写进来才是关键。工业场景有几种典型写入路径:采集网关(Telegraf/Neuron)协议转换后写入、上位机/边缘程序直连写入、消息队列(Kafka/MQTT)解耦后写入。搞清楚每种路径的适用场景和配置方法,数据链路才能稳定跑起来。
- Telegraf 采集器:插件化架构,支持 Modbus/OPC UA/SNMP/系统指标等 200+ 输入插件,输出到 InfluxDB/TDengine/Kafka,配置化采集,零代码
- 边缘网关写入:Neuron/ThingsGateway/Node-RED 做协议转换,把 Modbus/OPC UA 等工业协议数据转成时序库写入,适合多设备多协议场景
- 直连写入:上位机/边缘程序用时序库 SDK 直接写入,适合需要精确控制写入逻辑、数据预处理、事务性要求的场景
- 消息队列解耦:设备→MQTT/Kafka→时序库,写入和存储解耦,防止时序库故障导致数据丢失,支持削峰填谷和多消费者
- 降采样策略:高频原始数据保留 7-30 天,1 分钟降采样保留 3 个月,1 小时降采样保留 1-3 年,用连续查询自动完成
- 06
工程化落地:容量规划、性能优化、高可用与系统集成
从「能存能查」到「生产环境长期稳定跑」,要回答几个工程问题:存储容量怎么估算、查询性能怎么优化、高可用怎么保证、和 SCADA/MES/Grafana 怎么集成。这是一线工程师最有价值的经验部分,也是时序库落地的关键。
- 容量规划:原始数据量 = 点位数 × 采样频率 × 每点字节数 × 86400 × 保留天数,再乘以压缩比(通常 5-10 倍),加上降采样和索引,预留 30% 余量
- 查询优化:用降采样数据做长期趋势查询、给高频查询建连续查询、避免 select *、合理设置时间范围、用 tag 做过滤而不是 value、监控慢查询
- 高可用:集群部署(至少 3 节点)、数据多副本、写入端负载均衡、查询端 VIP/代理、定期备份(taosdump)、异地容灾
- 系统集成:Grafana 做可视化看板(原生支持 TDengine/InfluxDB)、SCADA/MES 通过 SQL/REST API 查询、告警引擎(如 Kapacitor)做阈值报警、数据导出到数据湖做深度分析
- 运维监控:监控时序库自身的 CPU/内存/磁盘/写入速率/查询延迟,设置告警,定期做数据完整性校验和恢复演练
边学边用:数据解析在线工具
时序数据库相关软件选型(按用途分组)
时序数据库常见问题
什么是时序数据库?和 MySQL/PostgreSQL 这种关系数据库有什么区别?
时序数据库(Time-Series Database, TSDB)是专门为处理带时间戳的数据设计的数据库。和关系库的核心区别:① 写入模式——时序数据是按时间顺序的追加写,几乎不更新删除,关系库是随机读写;② 存储引擎——时序库用 LSM-Tree 等写优化引擎和列式存储,关系库用 B+树行存;③ 压缩——时序数据规律性强,专用压缩算法能达到 5-20 倍压缩比;④ 查询——时序查询几乎都带时间范围和分组聚合,时序库对此做了专门优化;⑤ 自动功能——时序库内置数据保留策略、自动降采样、时间分区,关系库需要自己实现。简单说,关系库是万能的但在高频时序场景性能差,时序库是专用的在时序场景性能好几十倍。
工业监控为什么必须用时序数据库?用 MySQL 不行吗?
小规模、低频采集(几百点、几秒一次)用 MySQL 也能跑,但随着点位和时间增长会遇到几个硬伤:① 写入性能——1000 个点每秒采集一次就是每天 8640 万条,MySQL 单表几百万行后写入和查询明显变慢;② 查询性能——查一个月的趋势数据,MySQL 需要扫描几百万行做聚合,可能要几十秒,时序库用降采样数据几秒返回;③ 存储成本——MySQL 行存压缩比低,时序库列存+专用压缩能省 5-10 倍存储空间;④ 运维复杂度——MySQL 需要自己做表分区、数据清理、归档,时序库内置保留策略和自动降采样。经验上,点位超过 500、采样频率高于 10 秒、数据需要保留超过 3 个月,就应该考虑用时序数据库。如果已经用了 MySQL,也可以用时序库做历史数据存储,MySQL 只存最新状态和配置。
TDengine 和 InfluxDB 怎么选?工业场景哪个更合适?
两者都是优秀的开源时序库,选型取决于具体场景:① 国产替代和自主可控——TDengine 是国产开源,集群版完全开源,中文文档和社区好,信创环境首选;InfluxDB 集群版是商业的,单机版开源。② 性能——TDengine 是 C 语言开发,写入和查询性能极高,尤其是在工业场景的「一个采集点一张表」模型下;InfluxDB 是 Go 语言,性能也很好但略逊于 TDengine。③ 生态——InfluxDB 生态更成熟,Telegraf 采集器+Grafana 可视化+Kapacitor 告警是监控领域经典组合,第三方集成多;TDengine 生态在快速完善,原生支持 Grafana,也有自己的采集方案。④ 部署运维——TDengine 自带消息队列和缓存,架构更一体化,集群部署相对简单;InfluxDB 组件更多(InfluxDB+Telegraf+Kapacitor),但每个组件都很成熟。⑤ 工业场景——TDengine 从设计之初就面向工业物联网,「一个数据采集点一张表」的模型和工业场景天然契合,国内工业项目落地案例多。建议:国产替代/工业场景/追求极致性能选 TDengine;监控运维/生态成熟/团队已有 InfluxDB 经验选 InfluxDB。两者都可以先做 POC 测试再决定。
时序数据库的数据保留策略怎么设?数据会自动删除吗?会不会丢数据?
保留策略(Retention Policy, RP)是时序库的核心功能之一,它定义了数据保留多长时间,到期后自动删除。设置原则:① 按数据价值和查询频率分层——高频原始数据(1 秒级)保留 7-30 天,因为超过这个时间范围的查询很少看原始精度;1 分钟降采样保留 3-6 个月;1 小时降采样保留 1-3 年甚至更久。② 降采样和保留策略配合——先做降采样(1 秒→1 分钟→1 小时),再对不同精度设置不同保留期,这样既省空间又不丢长期趋势。③ 自动删除是安全的——保留策略删除的是超过保留期的原始数据,降采样数据不受影响;删除前确保已经做了降采样和备份。④ 重要数据额外备份——对不能丢失的数据(如合规要求保留 5 年),定期用 taosdump 等工具备份到对象存储或磁带,不要只依赖在线存储。⑤ 监控删除过程——设置告警,确保保留策略按预期运行,不会因为配置错误导致数据误删。简单说:保留策略不会「丢数据」,它删除的是你明确告诉它可以删除的过期原始数据,长期趋势数据通过降采样保留。
时序数据库能存多少数据?容量怎么规划?磁盘满了怎么办?
时序数据库的存储容量取决于数据规模、压缩比和保留策略。容量规划公式:① 原始数据日增量 = 点位数 × 每秒采样次数 × 每点字节数(通常 10-20 字节含时间戳和标签) × 86400;② 压缩后存储量 = 原始数据量 ÷ 压缩比(通常 5-10 倍,具体看数据规律性);③ 总存储 = 压缩后日增量 × 保留天数 × (1 + 降采样数据量 10-20%) × 1.3(预留余量)。举例:1000 点、1 秒采样、每点 16 字节,日增量 = 1000×1×16×86400 = 1.38GB/天,压缩 8 倍后约 172MB/天,保留 90 天约 15GB,加上降采样和预留约 25GB。磁盘满了的应对:① 立即告警——设置磁盘使用率告警(80% 警告,90% 严重);② 缩短保留期——临时缩短高频原始数据的保留期,释放空间;③ 扩容——增加数据节点或扩容磁盘,TDengine 等支持在线扩容;④ 归档——把冷数据备份到对象存储/磁带后从在线库删除;⑤ 降采样——如果还没做降采样,立即做,降采样数据量只有原始数据的几十分之一。关键是提前规划,不要等磁盘满了才处理。
时序数据库支持 SQL 吗?查询复杂吗?和 MySQL 的 SQL 一样吗?
大部分时序数据库都支持类 SQL 查询,但和 MySQL 的标准 SQL 有差异:① TimescaleDB 是 PostgreSQL 扩展,支持完整标准 SQL,包括 JOIN、子查询、窗口函数等,和 MySQL 最接近,学习成本最低;② TDengine 支持类 SQL,语法和 MySQL 很像,支持 where/group by/order by/limit/聚合函数,但不支持 JOIN(用超级表和标签代替),有自己特有的时间相关函数;③ InfluxDB 1.x 支持 InfluxQL(类 SQL),2.x 主推 Flux(函数式查询语言),也支持 InfluxQL;④ Apache IoTDB 支持类 SQL,语法和 MySQL 类似;⑤ QuestDB 支持标准 SQL,扩展了时间相关功能。时序查询的特点:① 几乎所有查询都带时间范围(where ts > now() - 7d);② 常用聚合函数(avg/max/min/count/sum/first/last);③ 分组 by time(1m) 做时间维度聚合;④ 按标签(tag)分组过滤。和 MySQL 的主要区别:① 不支持或弱化 JOIN(时序库用宽表和标签代替关系型的 JOIN);② 有更多时间相关函数和聚合;③ 事务支持弱(时序库大多不支持复杂事务,因为追加写不需要);④ 不建议用 select *,要明确指定时间范围和列。总体来说,会 MySQL 的 SQL,时序库的 SQL 半天就能上手,主要是理解时间聚合和降采样的概念。
边缘端能用时序数据库吗?资源占用多少?和云端时序库怎么配合?
边缘端可以用时序数据库,而且是工业物联网的常见架构。边缘端时序库的选择和资源占用:① TDengine 有边缘版,资源占用低(几百 MB 内存),支持 ARM 架构,适合在边缘网关和工控机上运行;② InfluxDB 也可以在边缘端运行,但资源占用比 TDengine 高一些;③ SQLite 也可以在边缘端做轻量时序存储,但点位多了性能不够;④ 还有专门的边缘时序库如 EdgeDB、rqlite 等。边缘端时序库的典型用法:① 本地缓存——边缘端采集数据先存本地时序库,网络中断时不丢数据,网络恢复后同步到云端;② 本地查询——边缘端做本地监控和告警,不需要连云端;③ 边缘计算——在边缘端做数据预处理和降采样,只把需要的数据上传云端,节省带宽。端云配合架构:① 边缘端采集→边缘时序库本地存储→数据同步(TDengine 有数据订阅功能,或用 MQTT/Kafka)→云端时序库长期存储和分析;② 边缘端只存最近 7-30 天的高频数据,云端存长期降采样数据;③ Grafana 可以同时查询边缘和云端时序库,做统一可视化。资源规划:边缘网关(ARM 4 核 2GB)可以跑 TDengine 边缘版,支持几千点 1 秒采样;工控机(x86 4 核 4GB)可以跑完整版 TDengine/InfluxDB,支持几万点。
继续往深走
时序数据库解决「数据存哪、怎么查」,放到完整系统里,还要回答数据怎么采、系统怎么分层、看板怎么做: