助力地质灾害专业监测,他们选择将 Oracle 替换为 TDengine

小 T 导读:在地灾专业监测物联网平台项目中,由于原本的关系型数据库 Oracle 已经无法满足实时写入与高性能查询要求,苍穹数码选择接入 TDengine Database 以解决海量时序数据的存储和计算问题。本文详细阐述了他们的业务痛点、解决思路以及具体效果,以供参考。

公司简介

苍穹数码技术股份有限公司 2001 年创建于北京,是一家专业从事 3S 技术研究、开发与应用服务,致力于政府、国防和企业信息化建设的高新技术企业,也是业内率先打通地理信息全产业链的平台级产品、技术与服务提供商,在信息化相关技术领域具有核心竞争优势。

TDengine Database scene

我国常见的地质灾害共有 12 类、48 种。在所有的地质灾害中,崩塌、滑坡、泥石流是最为严重的,其具有分布广、灾发性、破坏性强,具有隐蔽性及容易链状成灾等特点,不仅会对工程建筑、交通运输、居民生命财产等造成直接危害,也会间接影响社会安定、引发生态环境恶化、加剧各种自然灾害等。

地质灾害类型

在国家突发事件应急体系建设“十三五”规划中早有强调,预防与准备是应对地质灾害的有效手段,只有提高综合风险研判能力、灾害监测和预警预报能力,才能真正体现风险防范的效益。基于此,建设地灾专业监测物联网平台势在必行。

一、分析场景与痛点,进行数据库选型调研

该物联网监测平台主要包含以下 5 个方面的功能:

  • 数据采集:不同时期不同采集频率,自动提高采集频率,同时支持设备自适应、设备反控及异常数据监测
  • 数据传输:考虑断网、断电情况(由于天气原因,丘陵地区时常阴雨绵绵,监测对设备稳定性特殊性要求较高)
  • 数据存储(强依赖入库性能):考虑后期设备增多,数据存储问题 、高频采集数据入库效率问题都要考虑在内
  • 数据分析(强依赖查询性能):一点一策,一设备一策。基于人工智能模型,充分考虑灾害发育特征,基于主要诱因设置阈值模型(单因子、多因子模型设置)
  • 预警预报:虚报不漏报,宁愿听骂声也不听哭声

要实现以上功能,首先需要解决的就是海量时序数据的存储和计算问题,其有着体量大、时间长,写入、查询要求高等特点,传统关系型数据库已经无法满足实时写入与高性能查询要求。

我们的地灾物联网专业监测平台研发于 2018 年,当时选用的大型企业级数据库 Oracle,随着接入的设备传感器越来越多、数据量越来越大,数据入库与数据查询也变得越来越慢。特别是当雨季来临,传感器数据采集频率提高到秒级、毫秒级别,数据入库就会阻塞,效率非常低下。

因此从 2019 年我们便开始关注一些国内外的时序数据库(Time-Series Database),通过调研发现 TimescaleDB、 TDengine 两款比较合适,接下来主要从数据写入、查询、团队上手难度等指标项考察了这两款时序数据库。

下面以近 10 年全省的雨量站小时雨量数据为测试数据,从常用的应用场景对两个数据库进行对比分析。

  • 测试机器配置信息如下:
测试机器配置 TDengine Database
  • 历史数据批量入库场景对比结果:
历史数据批量入库场景对比结果:timescaledb 24小时,tdengine 2小时
  • 入库后数据文件大小对比结果:
入库后数据文件大小对比结果:timescaledb 38G,tdengine 698M
  • 常见查询场景比对:
  1. 查询全省全部站点累计降雨(10-30 天),按站点分组,汇总累计降雨
  2. 查询单一站点、区县所有站点年数据,按照年、月、日、小时统计汇总 (全省 2138 个雨量站点,单位 S)
常见查询场景比对

结论:从入库、压缩比及查询 3 个维度来看,TDengine 都是完胜。基于以上信息综合比对如下:

TimescaleDB 和 TDengine 的综合对比表格

二、数据库设计与应用

TDengine 在物联网监测平台中的数据采集侧架构图如下所示:

TDengine 在物联网监测平台中的数据采集侧架构图

TDengine 的存储是从空间与时间两个维度进行分层分级存储,具体实现路径如下:

实现路径
  • 建库建表:
  1. 创建数据库

地灾专业监测数据库设置保存 20 年,分片参数 90 天,每个 Vnode 30 个内存块(根据机器内存调大),允许编辑,建库语句如下:

CREATE DATABASE IF NOT EXISTS geohazard_monitor KEEP 7300 DAYS 90 BLOCKS 30 UPDATE 1 ;

2. 创建超级表

根据传感器类型 创建超级表,以水压力计含水率为例 ,假设传感器类型编码为 201,则超级表命名 m_201 ,按照统一命名规则,其他传感器超级表命名为 m_xxx(传感器类型编码)。统一约定 t20 为采集时间, t30 为同步入库时间 ,超级表包含 2 个 tag ,对传感器进行编码编号(注意每个子表 tag值一样)。建超级表语句如下:

CREATE STABLE IF NOT EXISTS m_201 (t20 TIMESTAMP, t30 TIMESTAMP ,v_water FLOAT) TAGS (sensor_code BINARY(20), sensor_id INT);

3. 数据入库

使用超级表模板操作数据入库 ,子表命名规则为 m_XXX( 传感器编码)。入库语句如下:

INSERT INTO m_05162300008 USING m_201 TAGS ('05162300008', 2) VALUES ('2021-01-01 00:00:00.000','2021-01-01 00:00:00.001', 0.02);

4. 查询

进行时间窗口(interval)avg聚合滚动查询时,时间窗口单位可以是 b(纳秒)、u(微秒)、a(毫秒)、s(秒)、m(分)、h(小时)、d(天)、w(周)、 n(自然月) 和 y(自然年) 。查询每天含水率平均值语句如下:

SELECT AVG(v_water) FROM m_05162300008 WHERE t20 >= '2020-01-01 00:00:00.000' AND t20<'2020-01-03 00:00:00.000' interval(1d) ;
  • 开发经验

在 Java 应用程序数据库连接上,我们的开发环境选择了 JDBC-RESTful 方式,生产环境选择了安装客户端的 JDBC-JNI 方式,相比 JDBC-RESTful 有一定的性能优势,最大化发挥 TDengine 的性能。但是 JDBC-RESTful 具有轻便、问题易定位等优势,所以大家可以酌情选择。JDBC-RESTful 到 JDBC-JNI 的切换十分简单,一般只需要修改配置文件即可。如下图所示:

JDBC-RESTful 到 JDBC-JNI 的切换
  • 典型应用

某个滑坡监测项目——

某个滑坡监测项目

某含水率传感器监测曲线——

某含水率传感器监测曲线

某省累计降雨等值线——

某省累计降雨等值线

对于本项目来说,TDengine 主要发挥了如下特色功能:

  • 使用超级表模板,数据快速入库,自动创建子表
  • 滑动窗口统计功能
  • 速度足够快,资源占用足够少,属于节能减排绿色产品
  • 开发、部署非常方便
  • 支持国产芯片与国产操作系统,属于信创名录产品,应用于保密项目没有后顾之忧

三、写在最后

在本项目中,TDengine Database 展现出了强大的读写性能和数据压缩能力,聚合类查询速度非常快,也帮助我们有效降低了机器使用成本。超级表、子表、标签、时间窗口、状态窗口等概念非常适配物联网大数据应用场景,相信随着产品功能的越加完善,TDengine 未来潜力无限。百舸争流,奋楫者先;千帆竟发,勇进者胜。祝愿涛思数据越来越好,争做物联网大数据的 Oracle。