写入、读取均优于InfluxDB,TDengine在智慧水务系统中的应用
作者|张方亮,南京市市政设计研究院主任工程师
小 T 导读:作为一家市政公用行业综合性设计院,近几年,南京市市政设计研究院从流域统筹、区域协调、系统治理和标本兼治等综合性需求出发,将“厂网河湖岸”融为一体,大力推广系统治水、系统运维、智慧运维的理念,与此同时,公司新组建了数字化发展研究院,以加强在智慧水务方向的研发力度。作为数研院第一个自主研发的项目,淮安智慧水务项目需要实现对数十条河道的实时监测和预警,其中包含水质监测箱、液位仪、流量计、雨量计、截流井监测计、水泵等多种设备的数据采集和分析。
文章图片
高兴之余,也有一个苦恼的事情随之而来——要对如此巨大的数据量进行实时监测和预警、采集和分析,究竟怎样的一个数据库才能支撑呢?我们又该如何进行数据模型设计?
数据库选型重点看什么? 在项目最初进行数据库选型时,我们发现水务系统的设备数据具有以下几个特性:
- 时序性
- 数据插入后不再修改
- 每个设备的数据之间独立的
- 多维度统计功能
市面上时序数据库产品众多,在对多款产品进行对比分析后,我们最终选择了 TDengine,理由如下:
1.性能优异,兼容性强 虽然接入设备繁多,但 TDengine 兼容性很强,写入、读取和统计效率也大大高于其他数据库,对比 InfluxDB 来看,测试数据显示如下:
文章图片
2.接入简单,功能强大 【写入、读取均优于InfluxDB,TDengine在智慧水务系统中的应用】TDengine 将数据库、消息队列、缓存、流式计算等功能融合,应用无需再集成 Kafka/Redis 等软件,大幅降低了开发和维护的复杂度成本,具有学习成本低、接入快速等特点,特别适合我们的新手团队,全员只用了一周时间就掌握了基本的开发流程。
3.开源免费,社区活跃 TDengine 是一款优秀的国产软件,在政府类项目中非常有优势。同时,它的技术支持也非常好,社区和微信群很活跃,你甚至可以和开发人员一对一沟通。大家在使用过程中也会积极提供 bug 信息,为开源贡献一点力量,助力 TDengine 变得越来越完美。
引入 TDengine 之后的系统架构 引入 TDengine 之后,整体的系统架构如下图所示。
文章图片
我们在各个厂商的云平台、DTU/RTU 设备、SCADA 系统与 TDengine 之间搭建了一个数据中间件,用于处理各种协议和接口,初步解决了各类设备的接入问题,后期会考虑自建一个物联网云平台,并接入 TDengine 集群,对接所有智慧类项目的物联网数据。
搭载 TDengine 之后的数据模型设计 值得一提的是,在 TDengine 上进行的数据模型设计也很有亮点。
我们的设备类型包括:液位计、流量计、水质检测箱、雨量计、旧泵站、智慧截流井,下面以“水质检测箱”为例,进行数据结构说明:
文章图片
注:位置(location)为河道名称;监测点(id)为河道上某一处地方;设备标识(imei)为每款设备的唯一标识。
数据建模时,具体操作如下:
- 建库语句:
create database if not exists water update 1;
- 建超级表语句:
create table if not exists water.river_meter(ts timestamp, cod float, nh4n float, do float, ss float, ph float, orp float) tags(location ncher(64), id nchar(32));
这里必须要提一下 TDengine 的一个创新点,即一个采集设备对应一张表,其中动态创建的子表,能够自动关联父表,在保证高效插入采集数据的同时,也更加方便进行后续的查询统计。
以上述案例来说,其每增加一款水质检测箱,建表为:
CREATE TABLE water.river_meter_x_865374056****** USING water.river_meter TAGS ('小南河','865374056******');
在实际业务中的数据建模展示如下:
- 部分字表——
文章图片
- 部分子表数据——
文章图片
- 统计 location='小南河'的每周水质数据——
文章图片
总结和期望 从和 TDengine 合作至今,这一款时序数据库给了我们很多惊喜,我整理了一下最有代表性、也是印象最为深刻的三点:
- 超级表和标签的概念非常惊艳,极大提高了聚合统计的效率;
- 其为每张表在内存中分配了一定的缓存空间,来存储最热的记录,在使用 last_row 进行实时查询时效率非常高;
- 从最大程度考虑到物联网数据的使用场景,其对缓存、消息队列、流式处理、订阅等功能做了封装,业务开发不需要再过多的关注细节了。
- 其一是希望能够进一步丰富文档,特别是系统运维方面,不同体量的数据场景能够对应不用的 TDengine 服务器的配置问题,以及常见的 Q&A。
- 其二是希望改善下报警功能。当下该功能依赖 AlertManager,此模块通常不会安装,要实现这个功能只能依靠业务模块自身去订阅 TDengine,然后给自身发送告警。下一步规划中建议能将报警信息以回调形式调用接口。
如今淮安智慧水务项目已经顺利验收,无可置疑,TDengine 在项目中起到了至关重要的作用,对此我们对所有参与和维护 TDengine 研发的开发人员和开源贡献者表示感谢,也衷心祝愿 TDengine 发展越来越好。
推荐阅读
- 一个人的碎碎念
- 野营记-第五章|野营记-第五章 讨伐梦魇兽
- Shell-Bash变量与运算符
- 清明,是追思、是传承、是感恩。
- 牛人进化+|牛人进化+ 按自己的意愿过一生
- 七老修复好敏感、角质层薄、红血丝
- 华为旁!大社区、地铁新盘,佳兆业城市广场五期!
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 螃蟹和这些食物同吃,轻则腹泻、重则中毒!要小心哦~
- 八、「料理风云」