近百万条数据、3 秒查询,TDengine 助力北微云平台的搭建

2024-03-17 22:58

本文主要是介绍近百万条数据、3 秒查询,TDengine 助力北微云平台的搭建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:朱永杰

小 T 导读:作为一家聚焦惯性传感技术领域的企业,北微传感致力于让物联世界更美好,其研发的数百种型号的倾角传感器、电子罗盘、航姿参考系统、惯性测量单元、光纤陀螺仪、组合导航等产品,在交通运输、工程机械、航空航天、能源电力、医疗器械等领域发挥着重要的作用。随着业务的不断发展,北微传感对传感器数据的重视程度也在逐渐提高。

为了实现传感器的智能监控以及智能管理,北微传感旗下的北微云团队打造了物联网接入平台,实现传感器数据的解析、处理、可视化、状态监控、数据监测、月度数据下载、告警推送、上传日志记录等诸多功能。

这套系统在终端设备对接连接管理平台后,可通过 TCP/UDP 等形式采集终端数据,并在连接结束后将当前传输的数据集通过消息队列的形式,推送到设备管理及数据解析平台,实现对传输数据的解析以及上传日志的留档。在应用开发层,从物联网平台的基础业务场景出发,结合数据实现业务封装,提供大屏数据接口、数据状态监测等诸多功能。后续计划提供对应的 SDK,将平台数据及能力下放,方便用户在自身系统上拓展出平台提供的能力。

由于传感器设备数量众多且数据不一,连接管理平台所接收的数据传输量巨大。为了保证数据接收日志的连贯以及上传间隔的直观可视化,无论是 TCP 还是 UDP 的接收都采用了批量插入的操作,每次终端上传的突发数据量都很大,因此要求搭载的数据库要具备极高的数据吞吐率和存储低延时。

基于此,我们决定进行数据库选型,以匹配北微云平台的搭建。

一、为什么选择 TDengine?

在整套系统的构建中,用户出于对后续产品的迭代等考量,在研发初期就对数据动态化、接入设备多元化、系统性能、查询速度以及数据展现形式设定了相关的要求。

初期系统采用的是简单的单设备类型及单协议设计,数据库搭建上选用的是 MySQL+索引的方式,弊端是当数据写入过多以及查询深度过大时,时常出现数据库宕机等各种问题。此外,当接入终端的数量增加时会产生大量的时序数据,在实现存储、压缩、查询等基本需求外,还需要平衡学习及运维成本。

从以上问题和需求出发,数据库需要具备以下几点能力:

  • 可以准确地记录插入时间,具有较高的查询速度、强大的数据读写及压缩能力

  • 从报表的查询场景出发要具备优秀的时间检索能力,以提高月度报表的请求速度

  • 提供毫秒级别的数据查询、时间轴的滑动窗口聚合以及多种针对物联网场景的函数

  • 提供可以快速集成的告警组件,减少开发成本

幸运的是,我在 2020 年 3 月参与过一个空调控制系统的研发,当时采取的是 InfluxDB、TDengine 双数据库存储的形式,但在后续的迭代中已经全面转向 TDengine。在这个研发任务中,我负责的业务就是基于 TDengine 实现监测数据的可视化以及大屏展示,对于其类 SQL 的操作方式以及优秀的查询性能印象深刻。

基于以上原因,为了保证项目的快速交付以及系统的稳定运行,我们选择了 TDengine 作为北微云平台接入设备的时序数据库。

二、TDengine 的具体实践

具体到我们的场景中,使用 TDengine 建库建表的思路如下所示:

TDengine 超级表的结构十分简单,采集字段就是时间戳 ts 和采集值 data_value。但此处定义了三个标签,分别是用于描述设备的地址编码、企业分组编码以及参数编码。

从下面子表的设计中可以看到,针对大数据量以及多数据参数的查询情况,我们采取了一个数据参数、一个地址编码为一张表的存储方式,在查询时直接对设备地址编码_参数编码的表进行查询,大大降低了数据查询时间。在可视化服务通过一定算法优化的前提下,单核 2G 轻量服务器的配置,近百万条数据的分析查询时间仅在 3 秒以内。

在实际使用中,我们还发现采用 TDengine 提供的连续查询功能,可以高效处理类似于时间窗口下传感器的电量及温度场景。举个例子,以每小时为时间窗口、每半小时为前进量来统计传感器所在地点的温度:

可以通过 select * from avg_temp_100000015 order by ts desc;的形式快速获取已经存储好的数据,对于类似的按照时间周期进行折线统计的场景相当有效。反映到实际业务场景中,如下所示:

下图为 TDengine 的查询效果展示,几乎达到了所查即所得的效果。

三、北微云架构搭载 TDengine 的效果与优势

北微云采用了工业互联网平台典型的端边云系统架构,通过设备管理平台、连接管理平台、应用开发平台等几大模块的运作保障应用层业务功能的稳定,更好地服务于终端型号及解析策略配置、设备连接与管理、数据分析及监控、月度数据查询与下载等场景,同时可支持多类型终端及为其他项目提供接入的需求。下图为具体的架构示意图:

本项目中,通过各种协议以及 SDK、API 等获取的传感器数据是主要的数据来源。物联网终端设备按照固定的上传周期进行上传,随着时间的推移,传感器积累的数据量在不断增多,由此所带来的查询成本以及数据导出压力也变得相当巨大。同时,用户对于数据安全也具有较高的要求。

在咨询涛思数据的小伙伴后,我们在线上环境搭建时采用了 TDengine 双主节点部署的形式,降低了单机遇到全量查询时的数据压力,提高吞吐的同时也提升了查询响应的速度。

该项目中的应用开发平台以及设备管理平台采取了多机部署,通过设置对应的 Nginx 负载均衡策略提升系统的流畅程度。相较于北微传感之前使用的三方平台——进入设备列表至少要等待 3 秒、海量数据查询 1 分钟以上,目前情况已经有了相当大的改善:全量查询基本控制在了秒级,大屏的实时场景也可以提供毫秒级别的数据响应。

在传感器监测的场景下,系统需要根据传感器数据对不同的数据项进行监控,若超过预设阈值则进行对应的告警推送。从技术的角度讲,报警是指从最近一段时间产生的数据中筛选出符合一定条件的数据,根据定义好的计算方法得出一个结果,当结果符合某个条件且持续一定时间后,触发警告并以某种形式通知用户。在 TDengine 告警模块的帮助下,组件的开发尤其迅速,我们短短两天就完成了相关编码。

在告警组件的开发中,我们通过封装参数内置公式解析算法对请求 JSON 中的 expr(表达式以及部分函数)进行封装,为复杂的逻辑运算提供了解析与支持,并基于 Alert 组件的 RESTful 接口扩展出报警监测规则、报警监测组件以及报警监测模板的能力。

在收到规则及模板添加请求后,通过领域模型封装能力,可以快速构建符合请求规范的 JSON 形式的报警规则。在推送完成后还可以实现告警规则的本地化存储,使前端可以通过调用后端接口的方式,对已经推送的报警规则进行管理。

在对应的数据行为以及业务封装完成后,只需要通过 SpringBoot 整合 AlertManager,以实现数据的接收,再走消息总线发送到解析平台进行解析与记录,并根据扩展点和预先制定的推送方式完成告警信息的推送即成功(目前站内提供了网站弹窗以及邮箱推送的功能)。

四、写在最后

在第一期的设计中,我们针对 TDengine 提供的告警模块实现了一些内部的封装以及功能的拓展,该项目在 12 月初已经交付使用且在年后将转入第二阶段的开发。

二期中对于系统的拆分有着比较清晰的要求,在完善对外 SDK 的同时,需要将一些非核心领域的相关能力做一定的剥离,可能会将封装的告警组件通过 Java SDK 的版本暴露出去。后续平台使用稳定后会通过 GitHub、Gitee 将其进行开源,希望可以帮助有同样需求的同仁,快速扩展并设计出基于平台特色的告警组件。


✨TDengine | 物联网大数据平台,时序大数据引擎首页点击查看‘源代码’,了解更多具体细节。✨

这篇关于近百万条数据、3 秒查询,TDengine 助力北微云平台的搭建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/820446

相关文章

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

MyBatis-Plus使用动态表名分表查询的实现

《MyBatis-Plus使用动态表名分表查询的实现》本文主要介绍了MyBatis-Plus使用动态表名分表查询,主要是动态修改表名的几种常见场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录1. 引入依赖2. myBATis-plus配置3. TenantContext 类:租户上下文

MySQL基本表查询操作汇总之单表查询+多表操作大全

《MySQL基本表查询操作汇总之单表查询+多表操作大全》本文全面介绍了MySQL单表查询与多表操作的关键技术,包括基本语法、高级查询、表别名使用、多表连接及子查询等,并提供了丰富的实例,感兴趣的朋友跟... 目录一、单表查询整合(一)通用模版展示(二)举例说明(三)注意事项(四)Mapper简单举例简单查询

MySQL中的DELETE删除数据及注意事项

《MySQL中的DELETE删除数据及注意事项》MySQL的DELETE语句是数据库操作中不可或缺的一部分,通过合理使用索引、批量删除、避免全表删除、使用TRUNCATE、使用ORDERBY和LIMI... 目录1. 基本语法单表删除2. 高级用法使用子查询删除删除多表3. 性能优化策略使用索引批量删除避免

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE

Linux服务器数据盘移除并重新挂载的全过程

《Linux服务器数据盘移除并重新挂载的全过程》:本文主要介绍在Linux服务器上移除并重新挂载数据盘的整个过程,分为三大步:卸载文件系统、分离磁盘和重新挂载,每一步都有详细的步骤和注意事项,确保... 目录引言第一步:卸载文件系统第二步:分离磁盘第三步:重新挂载引言在 linux 服务器上移除并重新挂p

使用MyBatis TypeHandler实现数据加密与解密的具体方案

《使用MyBatisTypeHandler实现数据加密与解密的具体方案》在我们日常的开发工作中,经常会遇到一些敏感数据需要存储,比如用户的手机号、身份证号、银行卡号等,为了保障数据安全,我们通常会对... 目录1. 核心概念:什么是 TypeHandler?2. 实战场景3. 代码实现步骤步骤 1:定义 E

使用C#导出Excel数据并保存多种格式的完整示例

《使用C#导出Excel数据并保存多种格式的完整示例》在现代企业信息化管理中,Excel已经成为最常用的数据存储和分析工具,从员工信息表、销售数据报表到财务分析表,几乎所有部门都离不开Excel,本文... 目录引言1. 安装 Spire.XLS2. 创建工作簿和填充数据3. 保存为不同格式4. 效果展示5