TDengine的实际运用
业务场景:需要将工地的扬尘数据(温度,湿度,pm2.5,pm10,pm100,噪声,风向,风速)存储在数据库中,以提供给业务查询、分析和统计。
遇到问题:目前共有监测点107个,每分钟上送1条数据,每年有预计有【107*60*24*365 ≈ 5000w】多条数据。如果存储两年的数据,数据总计约1亿多条。数据存储在mysql数据库,进行查询时,速度比较慢,部分页面出现超时。
解决方法1:mysql数据库分库分表
弊端:
(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告警模块
爱人不亲,反其仁;治人不治,反其智;礼人不答,反其敬;行有不得,反求诸己