时序数据库TDengine助力福州水务轻松应对百万设备数据管理压力

小T导读:在福州水务统一物联网接入平台项目中,基于 TDengine TSDB,我们实现了水厂、管网等多源水务数据的统一存储与管理,并同时满足了水表平台、产销差系统等多业务系统对数据的高效检索与共享需求。TDengine TSDB “一个采集点一张表” 的建模方式完美契合物联网平台对设备级数据的统一管理需求,其卓越的读写性能与数据压缩能力,有效应对了百万设备数据管理的技术挑战。此外,其还支持标准 SQL,简化了应用开发;具备多副本高可用机制,保障业务连续性;并提供多数据源的零代码写入与数据同步功能,为平台业务拓展与平台间数据同步提供了技术基础。本文将结合项目的具体实践,与大家分享 TDengine TSDB 在福州水务统一物联网接入平台中的应用经验与成效。

项目背景

水务数据是一种重要的公共数据,规模大、社会关注度高,而且来源多,种类繁杂,不易收集和管理。实现“智慧水务”理念的前提是统一管理分布在各个水厂、各个供/排水环节的众多设备数据,只有将数据接入到统一的物联网平台后,才能在此基础上开发水务生产环节的各个功能,从而建立信息互通平台,实现水务统一平台、统一管理、统一数据、统一服务,避免重复建设,打破数据壁垒,保障数据资源的高效使用和安全可靠。

为此,我们结合福州水务发展战略与实际业务的需求,建设了福州水务统一物联网接入平台,为供排水业务提供统一数据接入与设备管理能力。

存在问题

统一物联网接入平台面临如下技术难题:

标准不统一,设备管理割裂,建模难度大

在统一物联网平台建设前,设备管理主要依赖各厂家自建平台,管理割裂、数据分散。

统一物联网平台要完成供水、排水、重点工程项目等相关设备数据的统一存储,具体包括:

  • 供水水厂、增压站数据
  • 供水/排水管网监控数据
  • 二次供水泵房数据
  • 水表数据
  • 雨污泵站数据
  • 污水厂数据

这些设备类型繁多、协议标准不统一,且缺乏统一的全生命周期管理机制。数据源分散在多个系统中,与平台“统一管理全部数据”的目标形成天然矛盾。如何通过合理的数据建模,在单一框架下兼容多种设备类型,并同时满足后续灵活的检索与分析需求,成为项目面临的主要挑战。

超百万设备数据持续写入,带来性能挑战

福州有多个水厂,设备数量达到百万级,统一管理这些设备就意味着要承载所有设备不间断的数据写入压力,而且新设备随时可能接入,平台很难提前对所有设备建表,这对平台的写入能力以及建模灵活性提出了很高的要求。

海量数据长期存储带来的存储成本压力

平台需要接入上百万设备的数据并实现长期存储,这些数据量级很大,价值密度却很低,既需要尽可能降低存储成本,还要在进行长期统计计算时保障数据查询时效性,平台要设法兼顾这两方面的需求。

系统大数据量查询,面临性能瓶颈

平台需要为水表平台、产销差系统、综合调度系统、智慧水厂等系统提供实时数据查询、历史数据查询、页面展示、统计报表等业务支持,大量业务应用的并发访问,对底层数据系统的承载能力而言是很大的挑战。二供(二次供水)平台之前使用的 InfluxDB 就曾因查询压力过大导致延迟过高,影响了业务应用。

解决方案

为解决上述问题,统一物联网接入平台不仅需要良好的顶层设计,还需要功能性能强大且稳定可靠的专业数据库提供底层数据能力支撑。水务设备数据是典型的时序数据,因此我们的数据库选型目标定为时序数据库

经过对大量时序库的调研,综合考虑成本、功能、性能、稳定性等各个方面,我们最终选择了 TDengine TSDB 作为统一物联网接入平台的时序数据管理引擎。

TDengine TSDB 是一款专为物联网、工业互联网等场景设计与优化的大数据平台,其诸多特性恰好能够解决我们在统一物联网平台建设中遇到的痛点问题:

  1. 其特有的 “一个采集点一张表” 建模理念,简直是为解决多系统数据统一建模问题量身定制
  2. 其高写入性能以及无模式写入功能,使得百万设备数据写入带来的技术问题迎刃而解
  3. 其针对时序数据的高效压缩能力解决了百万级设备数据长期存储的成本难题
  4. 其高效查询性能解决了对统一物联网平台而言极为关键的查询性能问题

多系统数据统一管理 —— 一个采集点一张表

我们首先参考福州地标、企标,建立了统一的数据接入协议标准,包含供水领域水厂、管网、水表、二供泵房、加压泵站、排水泵站、排水管网检测设备、水质监测设备等设备设施类型。如下图所示,红框标注的是一部分已标准化的协议。

时序数据库TDengine助力福州水务轻松应对百万设备数据管理压力 - TDengine Database 时序数据库

标准化协议解决了统一接入的问题,下一步就是统一建模。

虽然平台接入的设备种类繁杂型号多样,但只要是设备数据,其数据结构就存在共性:每个设备都有采集的物理量以及设备自身的描述信息(标签)。物理量会随着时间不断变化,而标签数据则是静态的不会随时间变化。

TDengine TSDB “一个采集点一张表” 的数据建模方法正是针对设备数据的特点而设计:每个设备对应一张表,设备采集的物理量对应表的数据列,设备自身信息例如设备编号则对应标签(TAG)列。把静态的标签数据与动态的采集数据分开,任何设备都可套用这个建模方法,极大降低了我们的数据建模难度。

采用上述方法,数据库中要创建上百万张表来对应上百万的设备,当需要对同类型设备进行聚合查询时显然会十分不便。TDengine TSDB 的 “超级表-子表” 设计解决了这个问题:对于同一类设备,提取其数据结构创建一张 “超级表” ,具体的设备数据则记录在该超级表名下的对应“子表”中,当需要对某类设备进行聚合查询时,直接查询其对应的超级表即可,避免了多表之间的重复查询和拼接等操作,十分高效便捷。超级表-子表的关系如下图所示。

时序数据库TDengine助力福州水务轻松应对百万设备数据管理压力 - TDengine Database 时序数据库

在福州水务统一物联网接入平台项目中,我们共计创建了 1 个业务 DB 名为 fziot,一百余张超级表,超过 190 万张子表。统一物联网平台接入的设备数量目前还在一直增长,设备总数已经超过 100 万,增长变化量如下图所示:

时序数据库TDengine助力福州水务轻松应对百万设备数据管理压力 - TDengine Database 时序数据库

百万级设备数据写入 —— 高性能与无模式写入功能

高性能

TDengine TSDB 的核心竞争力在于其卓越的写入和查询性能。相较于传统的通用型数据库,TDengine TSDB 充分利用了时序数据的时间有序性、连续性和高并发特点,自主研发了一套专为时序数据定制的写入及存储算法,“一个数据采集点一张表” 的设计不仅有利于设备建模与管理,还能大幅提升写入性能。

  • 自研的行列格式数据结构,能够更充分利用时序数据的特点,实现高性能与低空间占用;
  • 单表的数据按块连续存储,数据块内采取列式存储,保证单个数据采集点的插入和查询效率最优;
  • 由于不同数据采集点产生数据的过程完全独立,每个数据采集点的数据源唯一,一张表只有一个写入者,可采用无锁方式写入,从而性能大幅提升;
  • 对于一个数据采集点而言,其产生数据是按照时间排序的,写操作可用追加方式实现,进一步大幅提高数据写入速度。

极高的数据写入性能使得 TDengine TSDB 能够轻松承接统一物联网平台的数据写入压力,自投入使用以来,从未因写入性能不足出现阻塞与延迟。

无模式写入

物联网平台的数据来自多个系统,设备的数量一直在动态变化,因此无法提前为所有设备创建好对应的表,这就要求数据库能够在数据写入时自动判断并建表。

TDengine TSDB 提供无模式(schemaless)写入方式,无需预先创建超级表或子表,TDengine TSDB 会根据实际写入的数据自动创建相应的存储结构。此外,在必要时,无模式写入方式还能自动添加必要的数据列或标签列,确保写入的数据能够被正确存储。

无模式写入示例如下,TAG 列、数据列、主键时间戳之间用空格分开:

properties_testabc1,deviceId=testdevice1   createTime=1746669509685i,temperature=38.5 1746669509684000000

该写入语句,可向名为 properties_testabc1 的超级表写入数据,TAG 列 deviceId,赋值为 testdevice1,两个数据列分别为 createTime、temperature,赋值为 1746669509685i、38.5 ,最后一个数字是这一条记录的时间戳。如果该子表已经存在(TAG 列内容完全一致),则自动写入已存在子表中,若不存在,则自动创建新子表并写入。

海量数据长期存储 —— 专业压缩算法

TDengine TSDB 是专门为时序数据管理打造的大数据平台,对数据压缩进行了特殊设计:

  • 在存储架构上采用了列式存储技术,与传统的行式存储不同,列式存储与时序数据的特性相结合,尤其适合处理平稳变化的时序数据;
  • 为了进一步提高存储和数据压缩效率,TDengine TSDB 采用了差值编码技术,通过计算相邻数据点之间的差异来存储数据,而不是直接存储原始值,从而大幅度减少存储所需的信息量;
  • 在差值编码之后,TDengine TSDB 还会使用通用的压缩技术对数据进行二次压缩,以实现更高的压缩率。

针对性的存储技术以及两级数据压缩,使得 TDengine TSDB 对时序数据的压缩效率显著高于其它产品

统一物联网平台从 2023 年 8 月正式投入使用,至今还在不断增加接入的设备数量,目前已经接入了超过 100 万各型设备,TDengine TSDB 三节点三副本集群,目前共计使用磁盘空间 8.1 TB (截至 2025 年 5 月),相比市场上同类产品,数据压缩率优势明显。

多系统数据大数据量查询 —— 高性能查询

为实现海量数据规模下的高性能查询,TDengine TSDB 从多个维度进行了精心的设计:

  1. 采用分片策略,充分利用了硬件资源。TDengine TSDB 按照分布式高可靠架构进行设计,通过节点虚拟化并辅以负载均衡技术,将一个 dnode 根据其计算和存储资源切分为多个 vnode,对于单个数据采集点,无论其数据量有多大,一个 vnode 都拥有足够的计算资源和存储资源来应对,能最高效率地利用异构集群中的计算和存储资源降低硬件投资。
  2. 采用分区策略,按时间条件检索时避免了遍历过程。除了通过 vnode 进行数据分片以外,TDengine TSDB 还采用按时间段对时序数据进行分区的策略。每个数据文件仅包含一个特定时间段的时序数据,避免了遍历,简化了数据管理,还便于高效实施数据的保留策略。
  3. 标签数据与时序数据完全分离存储,显著降低标签数据存储的冗余度,实现了极为高效的多表之间的聚合查询。在常见的 NoSQL 数据库或时序数据库中,一般采用 Key-Value 存储模型,导致每条记录都携带大量重复的标签信息,如果需要在历史数据上增加、修改或删除标签,就必须遍历整个数据集并重新写入,TDengine TSDB 通过将标签数据与时序数据分离存储,有效避免了这些问题,大大减少了存储空间的浪费,并降低了标签数据操作的成本;在进行多表之间的聚合查询时,TDengine TSDB 首先根据标签过滤条件找出符合条件的表,然后查找这些表对应的数据块。显著减少了需要扫描的数据集大小,从而大幅提高了查询效率。
  4. 采用了 LSM 存储结构,进一步优化读写性能。时序数据在 vnode 中是通过 TSDB 引擎进行存储的。鉴于时序数据的海量特性及其持续的写入流量,若使用传统的 B+Tree 结构来存储,随着数据量的增长,树的高度会迅速增加,这将导致查询和写入性能的急剧下降,最终可能使引擎变得不可用。鉴于此,TDengine TSDB 选择了 LSM 存储结构来处理时序数据。LSM 通过日志结构的存储方式,优化了数据的写入性能,并通过后台合并操作来减少存储空间的占用和提高查询效率,从而确保了时序数据的存储和访问性能。
  5. 时序数据文件内部进行了针对性优化。data 文件是实际存储时序数据的文件,在 data 文件中,时序数据以数据块的形式进行存储,每个数据块包含了一定量数据的列式存储。根据数据类型和压缩配置,数据块采用了不同的压缩算法进行压缩,以减少存储空间的占用并提高数据传输的效率。每个数据块在 data 文件中独立存储,代表了一张表在特定时间范围内的数据。这种设计方式使得数据的管理和查询更加灵活和高效。通过将数据按块存储,并结合列式存储和压缩技术,TSDB 引擎可以更有效地处理和访问时序数据,从而满足大数据量和高速查询的需求。

统一物联网平台,不仅把多系统的数据集中统一管理,也同时承接了多系统的数据应用业务,过去分散在各个系统的业务访问压力现在都集中到了一起。

使用 TDengine TSDB 带来的性能提升十分明显,例如二次供水泵房数据数据过去存储在二供平台,大数据中心向二供平台抽取生产数据用于分析应用,当时二供平台采用的底层时序库是 InfluxDB,大数据中心每小时抽取一次二供数据,结果由于压力过大,导致 InfluxDB 延迟现象严重,影响到了正常业务运行。

数据抽取 SQL 如下:

 "sql":"select \"time\",\"cid\",\"devid\",\"tag\",\"value\" from (select mean(value) as value  from \"raw\" where time >= #influx_start_time# and time < #influx_end_time# group by *,time(1m))"

在统一物联网平台建设完成后,统一使用 TDengine TSDB 支持各个系统的数据查询业务,同样的业务,在使用 TDengine TSDB 后只需 1 分多钟即可抽取完毕,且能够持续稳定运行

使用 TDengine TSDB 后的抽取 SQL:

SQL
select last(_ts,`createTime`,`numberValue`,`value`),`deviceId`,`property` from fziot2.properties_egbf_new where _ts >= #ts_start# and _ts < #ts_end# and `createTime` >= to_unixtimestamp(#createtime_start#) and `createTime` < to_unixtimestamp(#createtime_end#) partition by `deviceId`,property interval(1h)

定时抽取业务运行情况如下,可见稳定且高效:

时序数据库TDengine助力福州水务轻松应对百万设备数据管理压力 - TDengine Database 时序数据库

TDengine 带来的其它优势

依托强大的功能与性能优势,TDengine TSDB 成功应对了上述技术难题。作为一款分布式大数据引擎,其还具备很多传统数据库软件不具备的特殊功能,给我们带来了意料之外的优势。

支持 SQL 语句,应用开发十分便利

与实时库需要开发者专门学习数据库特有 API 不同,TDengine TSDB 支持标准 SQL ,开发人员不需要太多学习成本就能上手使用,TDengine TSDB 还针对时序数据特点提供了许多特色查询 SQL ,对我们开发新功能、新应用提供了很大的便利。

支持高可用,保障了业务稳定性

对于水务系统的数据平台而言,业务的持续性十分重要。TDengine TSDB 作为分布式时序数据库,支持高可用特性,基于 RAFT 协议的标准三副本方案,能够保障集群中有 1 个节点损坏时,业务不受影响,这对我们而言十分有必要。

支持多种数据源零代码接入

TDengine TSDB 支持以零代码方式将来自不同数据源的数据无缝导入,而且无需额外部署 ETL 工具,即可对数据进行自动提取、过滤和转换。不同 TDengine TSDB 集群之间也可以很方便地通过 taosX 进行数据同步。这为我们将来进行多数据平台数据统一管理,以及平台间数据同步等工作提供了技术基础,使得数据平台的可拓展性大大提高。

展望

统一物联网接入平台实现了数据的统一采集汇聚分发、设备生命周期管理、实时预警信息推送等功能,加快公司信息化建设速度,减少重复数据建设造成的成本浪费,提升工作效率。

福州水务统一物联网接入平台目前接入的设备数量已经超过 100 万且还在增长,TDengine TSDB 作为底层支持系统表现优异。未来我们将和 TDengine 一起,为水务领域的企业数字化建设做出更多的贡献。

关于城建数智科技

福州市城建数智科技有限公司于 2022 年 7 月成立,是福州城建设计研究院有限公司的全资子公司,重点服务于水务企业,提供咨询规划、软件开发、运维保障等技术服务工作,公司以水务 GIS 平台、大数据平台、物联网平台、水务智慧大脑为核心。提供供水和排水一体化解决方案,并逐步扩展供排水硬件设备的供应业务,发展自动化控制,提供设备安装、检修、校验等服务,更好地对外输出水务领域的数字化解决方案以及相关的软、硬件产品。

作者信息

本文作者:陈欣