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

爱人不亲,反其仁;治人不治,反其智;礼人不答,反其敬;行有不得,反求诸己
原文地址:https://www.cnblogs.com/lina-2015/p/15210172.html