TDengine在智慧排水系统中的应用介绍
业务场景
智慧排水系统整体处理流程
整个智慧排水系统包含数据采集层、数据传输层、数据平台层和业务处理层几个模块,具体的处理流程如下图所示:
TDengine中的数据建模
TDengine是一个专门为物联网结构化数据流设计的时序数据库,其建库、建表的思路与关系库完全不同,遵循一个数据流隔离的原则。物联网设备产生的数据是按照时间顺序产生的数据流。在智慧排水系统,我们往往关心某一个液位计在一段时间范围内的变化趋势或大、小值这些统计量。
具体到我们的场景中,我们的建库、建表思路如下:
数据库
数据库创建主要依据业务模块来,把泵站、泵闸等上报数据分开存储。
name | created time | ntables | vgroups |replica| days | keep1,keep2,keep(D) | tables | rows | cache(b) | ablocks |tblocks| ctime(s) | clog | comp |time precision| status |
==============================================================================================================================================================================================================================================
log | 19-09-06 10:36:33.888| 3| 1| 1| 10|30,30,30 | 32| 1024| 2048| 2.00000| 32| 3600| 1| 2|us |ready |
hgm | 19-09-08 22:42:58.873| 12| 1| 1| 10|3650,3650,3650 | 1000| 4096| 16384| 4.00000| 100| 3600| 1| 2|ms |ready |
jlj | 19-09-08 23:01:12.251| 17| 1| 1| 10|3650,3650,3650 | 1000| 4096| 16384| 4.00000| 100| 3600| 1| 2|ms |ready |
bengzhan | 19-09-08 23:01:21.895| 93| 1| 1| 10|3650,3650,3650 | 1000| 4096| 16384| 4.00000| 100| 3600| 1| 2|ms |ready |
bengzha | 19-09-08 23:01:29.272| 15| 1| 1| 10|3650,3650,3650 | 1000| 4096| 16384| 4.00000| 100| 3600| 1| 2|ms |ready |
|ready </font>
超级表
超级表的结构非常简单,采集字段就是时间戳ts和采集值val。但此处定义了两个标签,用于描述具体的点位静态信息。
taos> describe rtdata;
Field | Type | Length | Note |
=======================================================================================================
ts |TIMESTAMP | 8| |
val |FLOAT | 4| |
sncode |BINARY | 20|tag |
pointcode |BINARY | 10|tag |
taos> show stables;
name | created time |columns| tags | tables |
====================================================================================================================
rtdata | 19-09-09 18:15:42.243| 2| 2| 12|
普通表
taos> show tables;
table_name | created time |columns| stable |
=================================================================================================================================================================
sch_8_n_level | 19-09-09 18:24:22.655| 2|rtdata |
sch_7_n_level | 19-09-09 18:24:22.620| 2|rtdata |
sch_6_n_level | 19-09-09 18:24:22.585| 2|rtdata |
sch_29_n_level | 19-10-30 11:35:01.292| 2|rtdata |
sch_5_n_level | 19-09-09 18:24:22.550| 2|rtdata |
sch_4_n_level | 19-09-09 18:24:22.514| 2|rtdata |
sch_30_n_level | 19-10-29 14:54:53.446| 2|rtdata |
sch_3_n_level | 19-09-09 18:24:22.479| 2|rtdata |
sch_2_n_level | 19-09-09 18:24:22.442| 2|rtdata |
sch_10_n_level | 19-09-09 18:24:25.338| 2|rtdata |
sch_1_n_level | 19-09-09 18:24:22.408| 2|rtdata |
sch_9_n_level | 19-09-09 18:24:22.691| 2|rtdata |
TDengine的优势
高写入速度
用下来感受是TDengine的数据写入性能非常高。现在的接入网关的设备数是23个液位9个频率计9个电流计。总共10个拦蓄盾、3个泵站。3个截留井。
1个泵闸,总共有40张表,每张表每天新增6万条数据,现在每张表的大约三百万条数据。使用TDengine带来的大好处是不用再考虑SQLServer中的分库分表操作,数据不断写入一个月后,查询时延也没有增加。
降采样查询
TDengine为监控设备数据分析提供了一个非常有用的功能 -- interval,即按照时间窗口进行降采样。比如在排水系统中,我们往往要计算拦蓄盾每隔20分钟液位值,这种分析可以简单由下面这个SQL语句实现。
select avg(val) from sch_3_n_level where ts > '2019-10-15 00:00:00' and ts < '2019-11-15 00:00:00' interval(20M);
新数据显示
在现在的监测系统中,需要大屏实时显示液位计的新读数。这里正好用上TDengine自带的缓存功能。TDengine为每张表在内存中分配了一定的缓存空间,来存储热的记录,实时查询效率非常高。查询语法用到了last和last_row。
select last_row(*) from rtdata group by sncode;
在数据落盘后,查看/var/lib/taos下的数据文件大小,原来5GB的原始数据,经TDengine压缩后只有80MB,压缩比为1.6%。
未来的展望
整体来讲,TDengine对于处理高频采集的结构化时序数据吞吐量、资源开销和压缩都非常。但目前TDengine还不能像Redis那样做去重以及报警,这块后面也会尝试使用TDengine自带的流式计算和订阅来尝试实现报警,看能否进一步简化架构省掉Redis和SQLServer的工作。希望TDengine官方也能在这方面有更多支持,能越来越棒!
来源 https://www.modb.pro/db/168924
相关文章