TDengine 在消防行业业务建模思考

        在 TDengine 中进行消防行业的业务建模,需要结合消防场景的具体需求来设计高效的数据存储、查询和分析架构。消防行业的业务模型涉及大量传感器、报警设备等设备的数据采集、实时监控和历史数据分析。

1. 时序数据特点

        TDengine 是针对时序数据的数据库,适用于物联网(IoT)、工业监控、金融监控等场景。这些场景往往涉及大量连续的数据点。消防系统中的监控设备(如电气火灾监控探测器、感烟、感温火灾探测报警器、温湿度探测器、可燃气体探测器等)会定期上传数据,形成典型的时序数据。数据主要包括以下几点:

  • 实时监控数据:消防物联网设备会持续上传环境监控数据,如电压、电流、温度、湿度、烟雾浓度、气体浓度等,时间戳是核心。
  • 事件数据:当检测到异常情况时(如火警、预警、故障、动作、隐患等),设备会上传告警信息。
  • 地理位置数据:设备分布在不同区域、楼宇、楼层,需要记录设备的地理位置信息。

        在 TDengine 中,这类数据适合用超级表来管理,便于批量写入和高效查询

2. 设备模型的超级表设计

        消防系统中的设备种类多样,但同一类型设备的数据结构相似,可以根据设备类型通过创建多个 TDengine 的超级表(Stable Table)进行建模。超级表允许不同设备共享相同的字段和数据结构,并通过标签(Tags)来区分每个设备的个性化数据。

        如电气火灾监控探测器超级表设计示例

CREATE STABLE electrical_fire_device (
    ts timestamp, --时间戳
    residual_current float, -- 剩余电流
    A_phase_temperature float, --A相温度
    B_phase_temperature float, --B相温度
    C_phase_temperature float, --C相温度
    N_phase_temperature float, --N相温度
    A_phase_current float, --A相电流
    B_phase_current float, --B相电流
    C_phase_current float, --C相电流
    A_phase_voltage float, --A相电压
    B_phase_voltage float, --B相电压
    C_phase_voltage float --C相电压
) TAGS (
    device_address varchar(32),
    unit_id varchar(32),
    deivce_type_id varchar(32),
    device_id varchar(32),
    building_id varchar(32),
    floor_id varchar(32)
);

       设计要点

  • ts:时间戳字段,用于存储每次采集数据的时间。
  • residual_current、A_phase_temperature、A_phase_current float、A_phase_voltage float等:对应电气火灾监控探测器上报的重要的实时数据,如剩余电流、相温度、相电流及相电压等。
  • 标签字段:通过 device_id、building_id、floor_id、location_address、unit_id 等标签,可以明确设备所在的位置,并且通过标签查询数据时效率非常高。

        3. 标签(Tags)设计

        消防行业设备有明确的层次结构,如设备所属的建筑、楼层、单位、区域等,这些层次可以通过标签来表示。合理使用标签能够帮助快速定位设备数据,提升查询性能。

标签设计示例

  • device_id:每个设备的唯一标识符。
  • building_id:设备所在的建筑 ID。
  • floor_id:设备所在的楼层 ID。
  • device_address:设备的具体位置描述。
  • device_type_id:设备类型ID

        通过这些标签,能够方便地进行条件查询。例如,可以查询某个建筑、某个楼层的所有设备数据,或按设备 ID 查询特定设备的数据

4. 数据压缩与保留策略

        消防系统中的监控数据通常会长期保存,以备事故调查和分析。因此,在设计业务模型时需要考虑数据的压缩和保留策略:

  • 压缩:TDengine 内置了高效的时序数据压缩算法,确保大量历史数据能够高效存储,减少存储空间。
  • 保留策略:消防数据保留时间可能较长,但对于低优先级的数据,可以设置合理的保留策略,定期清理旧数据。例如,可以保留最近一年的详细数据,并删除超过一年的数据。
  • 多级存储与对象存储:可以通过配置参数dataDir,使得集群能够同时利用挂载的多块硬盘。此外,使用TDengine企业版还提供了数据分级存储的功能,可以将不同时间段的数据存储在不同存储设备的目录中,以此实现将“热”数据和“冷”数据分开存储。这样做可以充分利用各种存储资源,同时节约成本。例如,对于最新采集且需要频繁访问的数据,由于其读取性能要求较高,可以配置将这些数据存储在高性能的固态硬盘上。而对于超过一定期限、查询需求较低的数据,则可以将其存储在成本相对较低的机械硬盘上。为了进一步降低存储成本,TDengine 还支持将时序数据存储在对象存储系统中。同时,TDengine 还允许对存储在对象存储中的时序数据执行删除和更新操作。

        设置数据保留策略示例

CREATE DATABASE your_database_name KEEP 365;
ALTER DATABASE your_database_name KEEP 180;

5. 实时报警与历史分析

        消防行业的业务需求包括实时报警和历史数据的分析:

  • 实时报警:当设备检测到火警、预警或故障时,需要通过实时的数据流触发报警系统。可以通过 TDengine 的实时查询功能来实现,对异常数据实时进行监测,并触发报警机制。
  • 历史数据分析:历史数据分析可以帮助进行趋势预测、设备故障排查、消防事故回溯等任务。例如,通过查询某段时间内的温度、烟雾浓度、电流、电压等变化趋势,判断潜在的安全隐患。

        实时查询示例

        如设备历史事件表:

CREATE
STABLE monitor_event_his (
    ts timestamp, --时间戳
    id varchar(32) primary key,
    event_type int,-- 事件类型(0:火警,1:故障,2:隐患等等)
    message_id varchar(32),-- 消息id
    monitor_flag int,-- 监测项标识
    monitor_item varchar(50),--监测项名称
    monitor_item_value FLOAT,-- 监测项值
    description varchar(50),-- 监测项单位(MPa,m,℃)
    event_id varchar(32)-- 事件id
) TAGS (
    device_address varchar(32),-- 设备地址
    unit_id varchar(32),-- 单位id
    deivce_type_id varchar(32),--设备类型
    device_id varchar(32),-- 设备id
    building_id varchar(32),-- 楼栋id
    floor_id varchar(32)-- 楼层id
);

       如下是查询最近一分钟内设备上报的隐患:

SELECT *
FROM monitor_event_his
WHERE event_type = 2
  AND ts > NOW - 1m; -- 查询最近

       再例如通过 interval 等间隔窗口,可以按照指定窗口长度对原始数据做聚合(相当于对原始数据进行了降采样),之后再展示趋势线时,前端展示需要从数据库拉取的数据量会大大减少,从而显著提高效率。

       如下是查询某个设备近一周的剩余电流情况,按照 10分钟长度进行窗口划分后求取平均值:

select avg(residual_current) as avg_residual_current,first(ts) as ts
from electrical_fire_device
where device_id='20240806094407799068' and ts >= now - 7d
interval (10m)

6. 高效批量写入

        消防监控设备往往会产生大量数据,因此需要确保数据写入的高效性。TDengine 支持高效的批量写入,可以将多条数据一次性写入,避免频繁的单条写入请求,提升性能。

批量写入示例

INSERT INTO electrical_fire_device(tbname, ts, residual_current, A_phase_temperature, B_phase_temperature, C_phase_temperature,
                   N_phase_temperature, A_phase_current, B_phase_current, C_phase_current, A_phase_voltage,
                   B_phase_voltage, C_phase_voltage, device_address, unit_id, deivce_type_id, device_id)
VALUES ('20240806094407799068', NOW, 3.6, 30.6, 30.9, 30.7, 30.7, 0.3, 1.5, 2, 235.5, 236.5, 235.7, '强电井内',
        '340000DW1809068949740978176', '23050000', '20240806094407799068'),
       ('20240806094407799068', NOW+1s, 3.7, 30.6, 30.9, 30.7, 30.7, 0.3, 1.5, 2, 235.5, 236.5, 235.7, '强电井内',
        '340000DW1809068949740978176', '23050000', '20240806094407799068')
       ('20240806094407799068', NOW+2s, 3.8, 30.6, 30.9, 30.7, 30.7, 0.3, 1.5, 2, 235.5, 236.5, 235.7, '强电井内',
        '340000DW1809068949740978176', '23050000', '20240806094407799068');-- 批量插入多条设备数据

7. 分布式架构与高可用性

        消防监控系统对数据的实时性和高可用性要求非常高,因此需要考虑 TDengine 的分布式架构设计:

  • 分布式部署:TDengine 可以进行分布式部署,将不同区域或建筑的数据分配到不同的节点存储,实现数据的水平扩展。
  • 数据副本:为确保数据安全,可以设置数据副本,避免单点故障导致数据丢失。
  • 高可用性:通过 TDengine 的集群机制,可以确保在节点出现故障时,系统能够继续正常运行。

8. 多维度查询与分析

消防业务建模中,通常需要通过多维度分析来排查问题或做出决策。TDengine 的标签功能非常适合多维度查询,例如:

  • 查询某个建筑的设备历史数据。
  • 按设备 ID 查询设备的故障记录。
  • 统计某段时间内所有设备的报警次数。

多维度查询示例

SELECT AVG(residual_current), AVG(A_phase_current)
FROM electrical_fire_device
WHERE building_id = 'B001'
  AND ts BETWEEN '2024-09-01' AND '2024-09-10';

总结

        消防行业的业务建模需要围绕传感器数据、实时监控和报警系统展开。TDengine 提供了强大的时序数据处理能力,通过超级表、标签、高效查询与压缩机制,能够帮助消防行业高效管理和分析大量时序数据。在设计业务模型时,应充分利用 TDengine 的分布式架构、高可用性、批量写入和实时查询功能,确保系统的可靠性和扩展性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值