写入、读取均优于InfluxDB,TDengine在智慧水务系统中的应用

作者|张方亮,南京市市政设计研究院主任工程师

小 T 导读:作为一家市政公用行业综合性设计院,近几年,南京市市政设计研究院从流域统筹、区域协调、系统治理和标本兼治等综合性需求出发,将“厂网河湖岸”融为一体,大力推广系统治水、系统运维、智慧运维的理念,与此同时,公司新组建了数字化发展研究院,以加强在智慧水务方向的研发力度。
作为数研院第一个自主研发的项目,淮安智慧水务项目需要实现对数十条河道的实时监测和预警,其中包含水质监测箱、液位仪、流量计、雨量计、截流井监测计、水泵等多种设备的数据采集和分析。
写入、读取均优于InfluxDB,TDengine在智慧水务系统中的应用
文章图片

高兴之余,也有一个苦恼的事情随之而来——要对如此巨大的数据量进行实时监测和预警、采集和分析,究竟怎样的一个数据库才能支撑呢?我们又该如何进行数据模型设计?
数据库选型重点看什么? 在项目最初进行数据库选型时,我们发现水务系统的设备数据具有以下几个特性:
  • 时序性
  • 数据插入后不再修改
  • 每个设备的数据之间独立的
  • 多维度统计功能
很显然,这些都是典型的物联网数据特征,因此我们排除了关系型数据库、NoSQL 数据库(如 MongoDB、HBase 等)的选项,将选型范围缩小在了专为物联网设计的时序数据库。
市面上时序数据库产品众多,在对多款产品进行对比分析后,我们最终选择了 TDengine,理由如下:
1.性能优异,兼容性强 虽然接入设备繁多,但 TDengine 兼容性很强,写入、读取和统计效率也大大高于其他数据库,对比 InfluxDB 来看,测试数据显示如下:
写入、读取均优于InfluxDB,TDengine在智慧水务系统中的应用
文章图片

2.接入简单,功能强大 【写入、读取均优于InfluxDB,TDengine在智慧水务系统中的应用】TDengine 将数据库、消息队列、缓存、流式计算等功能融合,应用无需再集成 Kafka/Redis 等软件,大幅降低了开发和维护的复杂度成本,具有学习成本低、接入快速等特点,特别适合我们的新手团队,全员只用了一周时间就掌握了基本的开发流程。
3.开源免费,社区活跃 TDengine 是一款优秀的国产软件,在政府类项目中非常有优势。同时,它的技术支持也非常好,社区和微信群很活跃,你甚至可以和开发人员一对一沟通。大家在使用过程中也会积极提供 bug 信息,为开源贡献一点力量,助力 TDengine 变得越来越完美。
引入 TDengine 之后的系统架构 引入 TDengine 之后,整体的系统架构如下图所示。
写入、读取均优于InfluxDB,TDengine在智慧水务系统中的应用
文章图片

我们在各个厂商的云平台、DTU/RTU 设备、SCADA 系统与 TDengine 之间搭建了一个数据中间件,用于处理各种协议和接口,初步解决了各类设备的接入问题,后期会考虑自建一个物联网云平台,并接入 TDengine 集群,对接所有智慧类项目的物联网数据。
搭载 TDengine 之后的数据模型设计 值得一提的是,在 TDengine 上进行的数据模型设计也很有亮点。
我们的设备类型包括:液位计、流量计、水质检测箱、雨量计、旧泵站、智慧截流井,下面以“水质检测箱”为例,进行数据结构说明:
写入、读取均优于InfluxDB,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******');

在实际业务中的数据建模展示如下:
  • 部分字表——
写入、读取均优于InfluxDB,TDengine在智慧水务系统中的应用
文章图片

  • 部分子表数据——
写入、读取均优于InfluxDB,TDengine在智慧水务系统中的应用
文章图片

  • 统计 location='小南河'的每周水质数据——
写入、读取均优于InfluxDB,TDengine在智慧水务系统中的应用
文章图片

总结和期望 从和 TDengine 合作至今,这一款时序数据库给了我们很多惊喜,我整理了一下最有代表性、也是印象最为深刻的三点:
  • 超级表和标签的概念非常惊艳,极大提高了聚合统计的效率;
  • 其为每张表在内存中分配了一定的缓存空间,来存储最热的记录,在使用 last_row 进行实时查询时效率非常高;
  • 从最大程度考虑到物联网数据的使用场景,其对缓存、消息队列、流式处理、订阅等功能做了封装,业务开发不需要再过多的关注细节了。
此外,作为极为看好的一款数据库,我们对 TDengine 也抱有更高的期望:
  • 其一是希望能够进一步丰富文档,特别是系统运维方面,不同体量的数据场景能够对应不用的 TDengine 服务器的配置问题,以及常见的 Q&A。
  • 其二是希望改善下报警功能。当下该功能依赖 AlertManager,此模块通常不会安装,要实现这个功能只能依靠业务模块自身去订阅 TDengine,然后给自身发送告警。下一步规划中建议能将报警信息以回调形式调用接口。
TDengine 让我们看到了时序数据库之于物联网时代的重要性,不管是从极致性能还是成本管控来看,这款专门为物联网设计和研发的时序数据库都是不可多得的数据库产品。尽管还存在优化空间,但瑕不掩瑜,其值得成为数据库选型中的优选对象。
如今淮安智慧水务项目已经顺利验收,无可置疑,TDengine 在项目中起到了至关重要的作用,对此我们对所有参与和维护 TDengine 研发的开发人员和开源贡献者表示感谢,也衷心祝愿 TDengine 发展越来越好。

    推荐阅读