前言
目前,我参与了一项关于机房数字孪生的项目,这是其系统设计的一部分内容:实时数据采集系统设计(实时数采系统设计)。
实时数采是动环监控系统中的重要组成部分,用于实时获取设备的监测数据并进行处理和展示。
系统分析
数据采集方式
- 主动采集:系统定时向设备发送请求,获取最新的数据。例如通过动环监控单元 FSU 提供的 WebAPI 去主动获取设备的数据。
- 被动采集:设备主动将数据推送给系统,从而获取最新的数据。例如利用设备支持的通信协议(如MODBUS、OPC、MQTT等)建立与设备的通信连接,接收设备发送的实时数据或事件。
数据采集流程
当确定好数据采集方式以后,就可以与设备进行通信啦,然后接收数据,其采集流程如下:
- 获取设备信息:通过设备编码从设备信息表中获取设备的详细信息,包括设备名称、设备类型、设备型号等。
- 获取信号信息:根据设备编码从信号信息表中获取该设备的所有信号信息,包括信号编码、信号名称、信号类型等。
- 实时数据采集:通过设备编码和信号编码向设备进行数据采集,获取实时的监测值。采集的数据包括设备编码、信号编码、监测值以及采集时间等。
- 数据存储与归档:将实时采集的数据存储到实时采集表中。根据归档策略,定期将过时的数据从实时采集表中移动到历史数据表中,以保持实时采集表的数据量较小且查询性能良好。
- 数据清理:定期清理历史数据表中的过时数据,以防止数据库存储空间过度占用。
实时数据采集
实时数据采集需要存入到实时采集表中,实时数据可以按设备类型存入相对应的实时采集表中,例如动环设备 UPS 的实时信号采集值可以存入到 UPS 的实时采集表中;按时间存入相对应的实时采集表中,例如2023年06月24号08点00分00秒的所有设备的实时数据就可以存入相关时间段的表中。
表结构设计
实时采集表用于记录并存储每次采集到的实时数据,包括设备ID、信号ID、采集值、采集时间等字段;历史数据表用于记录过时的实时采集表里面的数据,分担减轻实时采集表的数据压力。
这样的设计可以有效地轻松地存储和查询实时采集的数据,同时与设备和信号的表进行关联。通过将实时采集数据存储在单独的表中,可以更好地管理和分析实时数据,以满足对数据的快速查询和分析需求。
实时采集表(realtime_collection)
字段名 | 数据类型 | 描述 |
---|---|---|
id | bigint | 主键 |
device_code | varchar(36) | 设备编码 |
signal_code | varchar(36) | 信号编码 |
value | double | 监测值 |
collect_time | datetime | 采集时间 |
历史数据表(historical_data)
字段名 | 数据类型 | 描述 |
---|---|---|
id | bigint | 主键 |
device_code | varchar(50) | 设备编码 |
signal_code | varchar(50) | 信号编码 |
value | double | 监测值 |
collect_time | datetime | 采集时间 |
数据存储与归档
- 定时任务调度:选择一个系统负载较低的时间段来执行数据迁移任务。可以根据系统的访问模式和历史数据分析,确定一个适当的时间窗口。例如,在深夜或非高峰时段执行迁移任务。
- 数据库锁定和事务管理:在迁移过程中,确保适当的数据库锁定和事务管理,以保证数据的完整性和一致性。避免对实时采集数据表进行写操作,以免影响正在访问的用户。
- 数据库复制和同步:如果系统需要保持实时采集数据的可用性,并且有大量用户在访问,可以考虑使用数据库复制和同步技术。在迁移过程中,将实时采集数据表复制到目标数据库中,并保持数据的实时同步,然后在较低访问时段将历史数据迁移到历史数据表中。
- 渐进迁移:为了减少对系统的影响,可以采用渐进迁移的方式。逐步将过时的实时采集数据移动到历史数据表,而不是一次性迁移所有数据。这样可以分散迁移任务的负载,并逐步验证数据迁移的正确性。
- 监控和回滚机制:在数据迁移过程中,建议设置监控和日志记录机制,以便及时发现异常情况,并具备回滚机制。如果迁移任务出现问题,可以回滚到迁移之前的状态,以避免数据丢失或损坏。