小 T 导读:在地灾专业监测物联网平台项目中,由于原本的关系型数据库 Oracle 已经无法满足实时写入与高性能查询要求,苍穹数码选择接入 TDengine Database 以解决海量时序数据的存储和计算问题。本文详细阐述了他们的业务痛点、解决思路以及具体效果,以供参考。
公司简介
苍穹数码技术股份有限公司 2001 年创建于北京,是一家专业从事 3S 技术研究、开发与应用服务,致力于政府、国防和企业信息化建设的高新技术企业,也是业内率先打通地理信息全产业链的平台级产品、技术与服务提供商,在信息化相关技术领域具有核心竞争优势。
我国常见的地质灾害共有 12 类、48 种。在所有的地质灾害中,崩塌、滑坡、泥石流是最为严重的,其具有分布广、灾发性、破坏性强,具有隐蔽性及容易链状成灾等特点,不仅会对工程建筑、交通运输、居民生命财产等造成直接危害,也会间接影响社会安定、引发生态环境恶化、加剧各种自然灾害等。
在国家突发事件应急体系建设“十三五”规划中早有强调,预防与准备是应对地质灾害的有效手段,只有提高综合风险研判能力、灾害监测和预警预报能力,才能真正体现风险防范的效益。基于此,建设地灾专业监测物联网平台势在必行。
一、分析场景与痛点,进行数据库选型调研
该物联网监测平台主要包含以下 5 个方面的功能:
- 数据采集:不同时期不同采集频率,自动提高采集频率,同时支持设备自适应、设备反控及异常数据监测
- 数据传输:考虑断网、断电情况(由于天气原因,丘陵地区时常阴雨绵绵,监测对设备稳定性特殊性要求较高)
- 数据存储(强依赖入库性能):考虑后期设备增多,数据存储问题 、高频采集数据入库效率问题都要考虑在内
- 数据分析(强依赖查询性能):一点一策,一设备一策。基于人工智能模型,充分考虑灾害发育特征,基于主要诱因设置阈值模型(单因子、多因子模型设置)
- 预警预报:虚报不漏报,宁愿听骂声也不听哭声
要实现以上功能,首先需要解决的就是海量时序数据的存储和计算问题,其有着体量大、时间长,写入、查询要求高等特点,传统关系型数据库已经无法满足实时写入与高性能查询要求。
我们的地灾物联网专业监测平台研发于 2018 年,当时选用的大型企业级数据库 Oracle,随着接入的设备传感器越来越多、数据量越来越大,数据入库与数据查询也变得越来越慢。特别是当雨季来临,传感器数据采集频率提高到秒级、毫秒级别,数据入库就会阻塞,效率非常低下。
因此从 2019 年我们便开始关注一些国内外的时序数据库(Time-Series Database),通过调研发现 TimescaleDB、 TDengine 两款比较合适,接下来主要从数据写入、查询、团队上手难度等指标项考察了这两款时序数据库。
下面以近 10 年全省的雨量站小时雨量数据为测试数据,从常用的应用场景对两个数据库进行对比分析。
- 测试机器配置信息如下:
- 历史数据批量入库场景对比结果:
- 入库后数据文件大小对比结果:
- 常见查询场景比对:
- 查询全省全部站点累计降雨(10-30 天),按站点分组,汇总累计降雨
- 查询单一站点、区县所有站点年数据,按照年、月、日、小时统计汇总 (全省 2138 个雨量站点,单位 S)
结论:从入库、压缩比及查询 3 个维度来看,TDengine 都是完胜。基于以上信息综合比对如下:
二、数据库设计与应用
TDengine 在物联网监测平台中的数据采集侧架构图如下所示:
TDengine 的存储是从空间与时间两个维度进行分层分级存储,具体实现路径如下:
- 建库建表:
- 创建数据库
地灾专业监测数据库设置保存 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 的切换十分简单,一般只需要修改配置文件即可。如下图所示:
- 典型应用
某个滑坡监测项目——
某含水率传感器监测曲线——
某省累计降雨等值线——
对于本项目来说,TDengine 主要发挥了如下特色功能:
- 使用超级表模板,数据快速入库,自动创建子表
- 滑动窗口统计功能
- 速度足够快,资源占用足够少,属于节能减排绿色产品
- 开发、部署非常方便
- 支持国产芯片与国产操作系统,属于信创名录产品,应用于保密项目没有后顾之忧
三、写在最后
在本项目中,TDengine Database 展现出了强大的读写性能和数据压缩能力,聚合类查询速度非常快,也帮助我们有效降低了机器使用成本。超级表、子表、标签、时间窗口、状态窗口等概念非常适配物联网大数据应用场景,相信随着产品功能的越加完善,TDengine 未来潜力无限。百舸争流,奋楫者先;千帆竟发,勇进者胜。祝愿涛思数据越来越好,争做物联网大数据的 Oracle。