各位好,我是老张。
去年帮一个做工业设备监控的团队做架构评审。产线上三千多个传感器,温度、振动、电流,每秒采集一次,数据量不大,但写入密集。他们的架构是:传感器数据进InfluxDB,设备台账和产线信息在MySQL,空间位置信息在PostGIS,检修记录和故障知识库存在Elasticsearch里。四套系统。
做异常检测的时候,一条分析请求要同时查温度曲线、看设备型号、定位安装位置、检索同类机型的故障历史。四个系统各查一遍,拿到数据后在应用层做拼接。结果呢?一条诊断请求跑下来3到5秒,产线工人等不起。
问题不在单个数据库的性能,而在跨系统的数据链路。时序数据告诉你数值变了,但变的原因在别的地方。设备台账、产线归属、安装位置、检修记录、故障知识,这些数据围绕同一个业务对象,却分散在四个系统里。每次分析,都要经历提取、转换、拼接,链路越长,数据更新不及时和信息不完整的问题就越严重。
这也是我后来反复琢磨的问题。
让AI判断一台设备是否异常,需要多少数据?只盯着当前的温度读数远远不够。温度升高可能是故障前兆,也可能只是负载增加的正常反应。要做出准确判断,得理解过去一段时间的温度变化曲线,观察振动和电流是否同步异常,还得回溯设备近期的检修记录,以及同类机型是否出现过相似问题。
工业、能源、交通场景里的分析,和普通的业务查询不是一回事。系统不仅要回答"现在是什么状态",还要理解"这个状态在一段时间内是怎么变的"。连续的时序数据是异常检测、故障诊断和预测性维护的基础,但仅有过程数据,解释不了过程。
今天聊聊我看到的解决思路。
分别建设的代价
工业场景的数据治理,过去最常见的手法就是按数据类型选库。时序数据用时序数据库,关系数据用MySQL或Oracle,空间数据用PostGIS,知识检索用向量库。每套系统各管一摊,独立运维,独立扩展。
系统少的时候没问题。但做故障诊断、实时分析的时候,一条请求要走三四个系统,接口要写,数据要同步,运维要盯多套平台。响应慢只是表象,信息一致性才是根子上的问题。温度曲线显示异常,但对应的设备检修记录因为同步延迟还没更新,拿去做分析的数据本身就不完整,诊断结果自然靠不住。
KES TimeSeries的思路是不再分别建设。多种数据在同一数据库体系内直接关联。时序数据描述状态变化,关系数据说明业务属性,GIS数据提供空间位置,向量数据补充专业知识,围绕同一个业务对象被直接关联。
这个想法不新鲜,但能做到什么程度,要看时序能力本身扎不扎实。
写入链路:高频数据是怎么扛住的
工业物联网场景的写入有两个特点:高频、持续。三千个传感器每秒采一次,就是每秒三千条写入。产线扩到一万台设备,写入量就是每秒上万条。写入链路扛不住,后面的分析都是空话。
KES在写入端做了三件事。Append追加写,避免随机IO开销。无锁化设计,消除线程竞争。异步IO,写入请求不阻塞等待磁盘完成。这三件事组合起来,写入链路的资源等待被压到最低。
官方测试环境下,单节点写入能力达到千万级指标点每秒。这个量级意味着什么?一万台设备、每台设备十个测点、每秒采集一次,总共十万指标点每秒,单节点就能扛住一百套这样的产线。
存储端:压缩比决定了历史数据能不能存得起
传感器数据是连续写入的,一条温度曲线跑一个月就是两百多万条记录。不压缩的话,存储空间很快就被吃光。
KES采用自适应行列存储,结合Delta-of-Delta增量编码和Gorilla浮点数压缩。Delta-of-Delta对单调递增的时间戳编码效率极高,Gorilla对浮点数的相邻差值压缩效果显著。这两种算法组合在一起,典型数字型时序数据压缩比达到10比1,存储空间可减少约90%。
这里有个关键点:压缩算法是自动匹配的,不需要人工调参。时序数据的特点就是不同类型的数据适合不同的压缩方式,自适应匹配省了DBA的活。
| 能力维度 | 技术方案 | 实测数据 |
|---|---|---|
| 写入性能 | Append追加写+无锁化+异步IO | 单节点千万级指标点/秒 |
| 存储压缩 | Delta-of-Delta编码+Gorilla压缩 | 压缩比10:1,存储空间减少90% |
| 库内计算 | 时间桶聚合+动态降采样+数据补齐 | 处理采样不一致和数据缺失 |
| 连续聚合 | 分钟/小时/天多粒度预计算 | 分钟级滑动窗口毫秒级响应 |
库内计算:分析不用反复扫原始数据
这是我比较看重的一块。
工业现场常见的一个问题是采样频率不一致。温度传感器每秒采一次,压力传感器每五秒采一次,振动传感器每十秒采一次。不同频率的数据要对齐做分析,传统做法是在应用层做插值补齐,计算量大不说,还容易引入误差。
KES把这部分计算放在数据库内部。内置时间桶聚合、动态降采样和数据补齐能力,直接处理采样频率不一致、数据短时缺失和网络中断等问题,恢复连续可分析的设备运行曲线。
对频繁查询的历史趋势,KES通过连续聚合机制对分钟、小时、天等不同粒度做增量预计算。查询时把预计算的历史结果和最新数据组合,不用反复扫描海量原始明细。典型的分钟级滑动窗口分析中,毫秒级响应。
这种设计在架构上有一个直接的好处:分析负载不再压在原始数据表上。原始表只管写入,预计算表负责查询,读写分离在数据库内部就完成了。
北京轨道交通的实测
北京轨道交通应急指挥调度平台接入了金仓时序数据库。实际生产环境的数据:写入性能较原系统提升超过10倍,部分历史分析从分钟级缩到秒级,时序数据存储空间占用降低70%到80%。
这些数据来自生产环境,不是实验室里的理想测试。
在这个项目里,时序数据、关系数据、GIS数据和向量数据在同一数据库中关联。故障诊断不需要跨系统拉数据,直接在数据库内完成多模态数据的联合分析。这也是我之前说的那个三千传感器团队遇到的问题的解法。
架构选型建议
回到开头的问题:三千个传感器的产线,数据架构该怎么搭?
如果只有时序数据采集需求,选个专业的时序数据库就行。但工业场景很少只有单一数据类型。设备有台账、有产线归属、有空间位置、有检修记录、有故障知识。做异常检测的时候,这些数据都得用上。
分别建设的代价是接口开发、数据同步、多套运维。随着业务扩展,数据孤岛的问题迟早会冒出来。提前准备一套能稳定承载时序数据、完成库内计算并组织多模态上下文的数据架构,后面省心。
金仓时序数据模型KES TimeSeries的时序能力不是独立外挂的模块,而是构建在KES融合数据库架构中的原生能力。不需要额外引入独立的时序数据库,同一套系统里完成多模态数据的存储和关联分析。
我做架构选型时,一般从三个维度评估:数据类型的多样性、实时分析的需求强度、运维团队的规模。如果三个维度都指向"多",融合架构的收益是明确的。
落地过程中的几个实操建议
这套架构落地后,有几个建议给各位参考。
数据迁移不要一次性全量切换。先在新系统跑并行验证,对比新旧系统的查询结果是否一致,确认数据完整后再逐步切流。工业场景数据量大,一次性切换的风险太高。
连续聚合的预计算粒度按实际查询频率来定。别为了求全把分钟、小时、天、周全做一遍,存储空间和维护成本会成倍增加。先把查询模式摸清楚,哪些粒度真正被用到,再决定做哪些。
高并发写入场景提前做容量规划。千万级指标点每秒是峰值数据,持续稳定写入的实际能力要根据硬件配置做POC验证。规划时留出30%以上的冗余,别按峰值满载来算。
sys_hypo等扩展的兼容性在测试阶段就验证清楚。不同版本之间的功能差异,生产环境里出问题再排查成本很高。测试环境和生产环境的配置差异尽量缩小。
写在最后
工业时序数据的存储和分析,本质上是一个数据关联问题。传感器产生的时序数据只是起点,围绕这个起点的设备属性、空间位置、检修记录和故障知识,才是让AI读懂业务的关键。把这些数据连在一起的方式,决定了分析链路有多长、响应有多快、上下文有多完整。
这套融合架构从写入链路、存储压缩到库内计算,每个环节都针对工业场景做了专项调优。对于千行百业的工业物联网项目来说,这是一条值得考虑的路。
各位在工业时序数据处理上用过什么方案?跨系统数据关联的痛点怎么解决的?欢迎在评论区聊聊。
我是老张,下篇见。