zoukankan      html  css  js  c++  java
  • TDengine的实际运用

    业务场景:需要将工地的扬尘数据(温度,湿度,pm2.5,pm10,pm100,噪声,风向,风速)存储在数据库中,以提供给业务查询、分析和统计。

    遇到问题:目前共有监测点107个,每分钟上送1条数据,每年有预计有【107*60*24*365 ≈ 5000w】多条数据。如果存储两年的数据,数据总计约1亿多条。数据存储在mysql数据库,进行查询时,速度比较慢,部分页面出现超时。

    解决方法1mysql数据库分库分表

    弊端:

    (1).分库分表需要提前对数据做好规划。
    如果按照时间对表进行水平划分,随着监控点增加,后面的表数据量可能越来越大,容易出现数据热点问题;
    如果按照监测点hash取模对表进行水平划分,当监测点增加,进行扩展比较困难。例如:之前是mod4,后面是mod6,则需要对之前的历史数据重新进行处理。

    (2).对数据进行统计分析时,可能需要进行多表的聚合查询,查询速度会受到影响。

    解决方法2使用物理网数据库

    (1)InfluxDB

    高性能的时序数据库,可以高效的存储和查询时序数据。目前社区版集群功能不开源。

    (2)TDengine

    数据库开源,支持集群,充分考虑时序数据的特点,以超级表为模型,将每个监测点的数据单独存储在一张表中,提高了插入和查询速度。有丰富的函数,支持窗口查询和连续查询,自带TDengine模块,和AlertManager联合使用,可以推送告警信息。

    综合业务需求,选择了TDengine。

    一、TDengine的集群搭建

    可以参考:https://www.cnblogs.com/lina-2015/p/15210176.html

    二、TDengine的SQL查询

    1.表设计

    -- 创建数据库
    create database db_transfer_platform keep 730 replica 3;
    -- 使用数据库
    use db_transfer_platform;
    -- 创建超表
    create stable if not exists s_dust_history_data(ts timestamp,measured_value double,id int)tags(device_code nchar(30),channel_number nchar(30),signal_code nchar(30),status bool);
    -- 删除超表
    drop stable if exists s_dust_history_data;
    -- ts 时间戳;measured_value 测量值;id 平台主键;device_code 设备编号;channel_number 通道序号;signal_code 信号编号;status 在线状态
    
    -- 注意:
    -- 1.ts默认为主键,不能为空
    -- 2.列名避免取关键值,否则无法插入

    2.数据插入

    -- example:创建子表,插入数据,查询数据 
    -- 子表名称[监测信号_设备编号] eg pm_25_1003055表示设备编号为1003055的pm2.5的监测表
    create table if not exists eg_pm_25_1003055 using s_dust_history_data tags('1003055','1','18113001',true);
    create table if not exists eg_pm_10_1003055 using s_dust_history_data tags('1003055','2','18114001',false);
    insert into eg_pm_25_1003055 (ts,measured_value,id) values("2021-07-29 21:43:22",7.0,123);
    insert into eg_pm_10_1003055 (ts,measured_value,id) values("2021-07-29 21:43:22",6.0,124);
    insert into eg_pm_25_1003055 (ts,measured_value,id) values("2021-07-29 21:43:22",9.0,123);
    
    -- 注意:
    -- 1.全列模式写入速度会远快于指定列,建议尽可能采用全列写入方式 
    -- 2.批量插入数据,写入速度更快(最多支持多少同时插入32000条左右,和sql长度有关)
    -- 3.对于重复的数据,忽略后面插入的数据

    3.数据查询

    select * from s_dust_history_data where ts > '2021-07-29 00:00:00' and ts < '2021-07-30 00:00:00' and signal_code = '18113001';

    3.1命令查询

    3.2客户端查询

    客户端下载地址:https://github.com/skye0207/TDengineGUI/releases/tag/v1.0.0

    三、TDengine告警模块

    可以参考:https://www.cnblogs.com/lina-2015/p/15210197.html

    爱人不亲,反其仁;治人不治,反其智;礼人不答,反其敬;行有不得,反求诸己
  • 相关阅读:
    JAVA多线程之守护线程
    有符号数与无符号数
    子母钟系统,GPS时钟系统,医院网络时间同步技术方案
    NTP时间同步服务器,GPS时钟系统,北斗授时产品,京准科技
    卫星时钟系统(NTP网络时钟系统)技术应用方案
    GPS对时产品,NTP校时,时间同步服务器,北斗授时设备
    GPS对时装置(NTP时钟服务器)应用安防监控系统
    考场时钟系统(标准化考场时钟同步建设)应用方案
    时间同步装置(GPS时钟)在电网SCADA系统应用
    网络时间服务器(医院时钟系统)相关问题汇总
  • 原文地址:https://www.cnblogs.com/lina-2015/p/15210172.html
Copyright © 2011-2022 走看看