第二章:历史数据架构

好,咱们进入正题。历史数据架构这块,说实话,是很多OPC UA项目里最容易出问题的地方。我见过太多项目,实时通讯跑得挺顺,一到要查历史数据就卡壳。为什么?架构没想清楚。

历史服务器架构

先说说历史服务器架构。你想想看,一个工厂里几百上千个变量,每秒都在产生数据。这些数据往哪存?怎么存?谁来管?这就是架构要解决的问题。

我个人习惯把历史服务器分成三层:

  • 采集层:负责从OPC UA服务器拉数据。这里要注意,不是所有数据都要实时拉,有些可以批量拉。
  • 存储层:数据落地的地方。可以是关系数据库,也可以是时序数据库。
  • 服务层:对外提供查询接口。客户端要查历史数据,走这一层。

我在项目中遇到过一种情况:客户把所有数据都往一个数据库里塞,结果查询慢得要命。后来我们拆成了热数据和冷数据两层——最近一周的数据放内存数据库,历史数据放磁盘。效果立竿见影。

核心要点:历史服务器架构的关键是分层。每一层各司其职,别混在一起。

历史数据存储引擎

存储引擎这块,选择很多。但说白了,就两种主流方案:

引擎类型 代表产品 适用场景
关系型 SQL Server, PostgreSQL 数据量不大,需要复杂查询
时序型 InfluxDB, TimescaleDB 高频采集,海量数据

嗯,这里要注意。OPC UA规范里其实没规定你必须用哪种引擎。它只定义了数据怎么存、怎么取。我建议你根据数据量来选:

  • 每天少于100万条记录?关系型够用。
  • 每天上亿条?老老实实用时序数据库。

我曾经在一个钢铁厂项目里,用了SQL Server存温度数据。结果三个月后,查询一次要等两分钟。后来换成InfluxDB,同样的数据量,查询时间降到毫秒级。这就是选错引擎的代价。

小技巧:如果预算有限,可以考虑PostgreSQL + TimescaleDB插件。既有关系型的灵活性,又有时序数据库的性能。

历史数据存储的配置与部署

配置部署这块,我踩过的坑最多。先说说OPC UA历史服务器的配置项:

// 典型的OPC UA历史服务器配置
{
  "ServerUri": "opc.tcp://localhost:4840",
  "HistoryDatabase": {
    "Type": "TimescaleDB",
    "ConnectionString": "Host=localhost;Port=5432;Database=opcua_history",
    "RetentionPeriod": "90d"
  },
  "SamplingInterval": 1000,  // 毫秒
  "QueueSize": 10000,
  "ArchivePeriod": "1h"
}

这里有几个关键参数:

  • SamplingInterval:采样间隔。别设太短,否则数据量爆炸。我一般建议工业场景设1秒。
  • QueueSize:缓冲区大小。网络断了怎么办?数据先放队列里,等恢复再写库。
  • ArchivePeriod:归档周期。数据先攒一批,再批量写入。这样效率高。

部署的时候,我建议把历史服务器和OPC UA服务器分开部署。为什么?因为历史查询很吃资源,混在一起会影响实时通讯。我曾经见过一个项目,就因为没分开部署,导致实时数据采集延迟从10毫秒飙到了500毫秒。

避坑指南:我曾经在生产环境里直接把历史数据库和OPC UA服务器装在同一台机器上。结果数据量一上来,CPU直接打满。后来不得不紧急迁移。记住:历史服务要独立部署,最好用单独的服务器。

最后说说部署的硬件要求。根据我的经验:

  • CPU:4核起步,8核更稳
  • 内存:16GB保底,32GB推荐
  • 磁盘:SSD必须的。机械盘扛不住高频写入
  • 网络:千兆网卡,别省这个钱

嗯,大概就这些。历史数据架构这块,说白了就是三个字:分、存、查。分清楚层次,存对地方,查得快。做到这三点,你的历史数据系统基本就稳了。