TDengine极简实战:从采集到入库,从前端到后端,体验物联网设备数据流转

简介: TDengine极简实战:从采集到入库,从前端到后端,体验物联网设备数据流转

背景


我们的项目涉及物联网相关业务,由于一开始的年少无知,传感器数据采用了 MySQL 进行存储,经过近两年的数据累积,目前几个核心表单表数据已过亿,虽然通过索引优化、 SQL 优化以及读写分离等措施,勉强满足基本的查询,能在秒级给出数据;但是数据量还在持续增加,当面对用户多维度的统计需求,在实现上、效率上总是那么不尽如人意。。

大概是2021年的6月份,一次偶然的机会,我在一个技术交流群中了解到涛思数据。后来花了三五天,把 TDengine 官网的文档过了一遍,并通过实际代码体验了一番,大大小小总结了14篇文章(文末附链接),这个算是第15篇。

这个关于 TDengine 的极简实战项目,重在体验物联网设备数据的流转过程,尤其关注 TDengine 的特性,因为这个项目就是为体验 TDengine 而写的,顺便学习下 Vue3.0ElementPlus 的使用。

`SW[1749)KQ3C~72[M16P67.png


所谓极(wan)简(ju)实(xiang)战(mu),就是不涉及太复杂的业务^_^,我们就拿通用的物联网系统的数据流转过程为例,体验下物联网数据采集、数据传输、数据转发、数据解析、数据存储、数据查询、数据呈现的完整过程。这篇文章先介绍下整体流程,不涉及具体的编码实现,重点关注数据存储时用到的时序数据库 TDengine 的独特之处,关于前、后端的功能实现,将在后续文章进行详细说明。

作为一个数据库,本身是用来存储数据的,在使用过程中主要就是 CRUD 操作,但用到实际的物联网场景中,还需要具备高可用性、可扩展性以及便于维护的特点, TDengine 满足以上所有要求(在这之前也体验了下清华大学开源的 IoTDB ,但是并没有用明白o(╥﹏╥)o)。关于 TDengine 的时序数据写入性能,TDengine 官方自带了一个 taosdemo 的程序,我在1-TDengine安装与初体验这里面有实践,结果是开启了10个线程,建库+建表+插入数据总耗时约60s,总记录100000000条,每秒写入数据记录1681350.46条。,这里不做赘述,主要体验查询、修改、删除功能,而 TDengine 甚至都用不到我们自己在程序中进行更新、删除操作(可以在建库时设置更新、删除配置),所以重点就是查询啦:海量数据的条件查询、按时间范围查询、聚合查询、分页查询、TopN查询、降采样。


TDengine是什么?


TDengine 专为物联网、车联网等时序空间大数据设计,其核心功能是时序数据库。但为减少大数据平台的研发和运维的复杂度,更进一步降低计算资源, TDengine 还提供大数据处理所需要的消息队列、消息订阅、缓存、流式计算等功能。

为什么要用TDengine?


物联网设备无时无刻都在发出数据,与互联网相比,物联网第一个突出的特点便是数据量大,而我们目前竟然还在用关系型数据库 MySQL 存储这些设备数据,单表过亿,查询与统计遇到了瓶颈。 TDengine 对物联网、运维监控等系统产生的时序数据的特点具有深刻的洞察。所有机器、设备、传感器、以及交易系统所产生的数据都是时序的,而且很多还带有位置信息。这些数据具有明显的特征,而 TDengine 是充分利用这些特点设计出的大数据平台,以下是涛思数据总结的时序数据的特点。

  1. 数据是时序的,一定带有时间戳;
  2. 数据是结构化的;
  3. 数据极少有更新或删除操作;
  4. 无需传统数据库的事务处理;
  5. 相对互联网应用,写多读少;
  6. 用户关注的是一段时间的趋势,而不是某一特点时间点的值;
  7. 数据是有保留期限的;
  8. 数据的查询分析一定是基于时间段和地理区域的;
  9. 除存储查询外,还往往需要各种统计和实时计算操作;
  10. 数据量巨大,一天采集的数据就可以超过 100 亿条。

怎么快速上手TDengine?


那必须是官网了,官方文档写得非常全面,而且也有对应的微信视频号、B站UP等学习资源渠道。

不过在阅读官方文档前,强烈建议先看下白皮书:

www.taosdata.com/downloads/T…

当时,在阅读白皮书的过程中,看到总结的时序数据的特点、数据模型设计、存储结构设计以及数据分片设计时,在心里一遍遍地直呼内行~~,当时就下决心研究下这款优秀的时序数据库,为后续数据迁移、架构演进进行技术预研。


数据来源


至于历史数据怎么来,这不是 TDengine 要解决的问题,哈哈,因为一般需用到 TDengine 这种时序数据库的,都是数据量达到了一定程度,数据分析时的效率遇到瓶颈。

由于换工作的原因,无法使用实际的生产数据进行迁移,我这里模拟了历史数据,直接往 TDengine 中写入1亿条记录。

数据源这里使用 Node.js 模拟了一个 MQTT 客户端,当然也可以使用很多 MQTT 客户端工具: HiveMQ , MQTTfx , MQTTX 等。


主要功能


  1. 按区域检索并查看当前区域接入设备的实时数据
  2. 指定区域下设备各项指标的平均值以及数据总量
  3. 查看指定设备的历史数据,可按照时间段检索
  4. 查看指定设备仅1小时内的各项指标的趋势
  5. 导出指定设备的全量数据为Excel文件

技术选型


  • 物联网终端技术:
  • EMQX
  • Node.js
  • 后端技术:
  • SpringBoot
  • TDengine
  • TDengine-alert
  • MyBatisPlus
  • WebSocket
  • HuTool
  • 前端技术:
  • Vue
  • vue-router
  • ElementPlus
  • Layout 响应式布局
  • Cascader 级联选择器
  • Card 卡片
  • Dialog 对话框
  • Table 表格
  • Pagination 分页
  • DateTimePicker 日期时间选择器
  • Message 消息提示
  • Echarts

环境配置


CentOS 7
TDengine 2.2.0.0,两台虚拟机实例集群
EMQX 4.2.4
SpringBoot 2.4.3
Node.js 12.22.6
Vue 3.0

服务组件


LLT224478]XPLNUES40PBC3.png

经过这个项目,我加强了对以下技术点的应用与掌握。

  • Node.js模拟MQTT客户端
  • EMQX Webhook消息路由
  • SpringBoot+MyBatisPlus服务端数据ORM
  • TDengine亿级数据存储与查询
  • TDengine-alert与AlertManager报警监控
  • WebSocket实时消息推送
  • Hutool Excel文件导出
  • ECharts数据可视化图表呈现
  • 统一响应封装、全局异常拦截
  • Spring事件与监听
  • MyBatisPlus分页

模拟场景


场景:在两个省份的多个城市、每个城市安装100个设备。


{{"太原", "大同", "阳泉", "长治", "晋城", "朔州", "晋中", "运城", "忻州", "临汾", "吕梁"},
                {"西安", "铜川", "宝鸡", "咸阳", "渭南", "延安", "汉中", "榆林", "安康", "商洛"}};

数据模型设计


根据具体业务,设计超级表与子表。


-- ts, 时间戳
-- voltage, 电压
-- currente, 电流
-- temperature, 温度
-- sn, 设备序号
-- city, 时间戳
-- groupid, 分组编号
-- 超级表
create stable if not exists iot.power(ts timestamp, voltage int, currente float, temperature float) tags(sn int, city nchar(64), groupid int)
-- 子表
create table if not exists iot.device1 using iot.power tags(#{sn}, #{city}, #{groupid})
效果展示
  • WebSocket服务端推送

这里用到了 Node.js 模拟的一个 MQTT 客户端,并通过 EMQXWebHook 插件回调后端服务接口,借助 Spring 的事件机制,实现消息入库与 WebSocket 实时数据更新 ;

%U{6[L85S{WW4}V42_F07KG.png

  • TDengine查询效率

总量1亿条记录,分页查询毫无压力,基本都是 ms 级返回结果,这得益于 TDengine 的存储结构设计(其实,底层是分区查询的,扫描的仅是很小一部分数据,所以必须快啊)。

$L]XR{9)XY413RN6HHIK%7C.png

  • TDengine压缩效率

这可以到 TDengine 的数据目录 data ,其链接目录: /var/lib/taos/vnode ,观察数据的占用空间。


数据查询


模拟历史数据,通过脚本直接往 TDengine 中写入近1亿条记录。

  • 条件查询、聚合查询


select count(1) total, avg(voltage) voltage, avg(currente) currente, avg(temperature) temperature from iot.power where city='西安';

1685416359801.png

  • 按时间范围查询
SELECT COUNT(1)
FROM power
WHERE sn = '1100' AND ts BETWEEN '1610168956836' AND '1641704956836';

1685416334886.png

  • 分页查询
SELECT ts,voltage,currente,temperature,sn,city,groupid
FROM power
WHERE sn = '1100' AND ts BETWEEN '1610168956836' AND '1641704956836' ORDER BY ts DESC
LIMIT 10 offset 50;

image.png

  • 降采样

Echarts 的图表展示,用到了 TDengine 的降采样功能,完成插值,体现数据变化趋势。


select last(voltage) voltage, last(currente) currente, last(temperature) temperature
FROM iot.power
WHERE sn = '1101' and ts > '2021-09-07 09:15:11.138' and ts < '2021-09-07 10:15:11.138' interval(60s) fill(value, 0);

1685416255024.png

小总结


这个玩具项目,基于 TDengine 2.2.0.0EMQX 4.2.4SpringBoot 2.4.3Node.js 12.22.6Vue 3.0 完成物联网设备数据的采集、转发、存储与展现。其中关于 TDengine 的查询性能相当亮眼:海量数据的条件查询、按时间范围查询、聚合查询、分页查询、TopN查询、降采样等基本都是毫秒级便给出结果;除此之外,采用两个虚拟机实例的极简集群实现 TDengine 快速扩展。更多详情可参考以下快速上手系列(#^.^#)

快速上手系列


If you have any questions or any bugs are found, please feel free to contact me.

Your comments and suggestions are welcome!

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
目录
相关文章
|
7天前
|
存储 SQL 数据库
深入浅出后端开发之数据库优化实战
【10月更文挑战第35天】在软件开发的世界里,数据库性能直接关系到应用的响应速度和用户体验。本文将带你了解如何通过合理的索引设计、查询优化以及恰当的数据存储策略来提升数据库性能。我们将一起探索这些技巧背后的原理,并通过实际案例感受优化带来的显著效果。
25 4
|
6天前
|
传感器 安全 算法
物联网发布者在数据传输过程中如何防止数据被篡改
在物联网数据传输中,为防止数据被篡改,可采用加密技术、数字签名、数据完整性校验等方法,确保数据的完整性和安全性。
|
6天前
|
存储 安全 算法
物联网发布者在发送数据时如何保证数据的安全性和完整性
数据加密、密钥管理和数据完整性验证是物联网安全的重要组成部分。对称加密(如AES)和非对称加密(如RSA)分别适用于大量数据和高安全需求的场景。密钥需安全存储并定期更新。数据完整性通过MAC(如HMAC-SHA256)和数字签名(如RSA签名)验证。通信协议如MQTT over TLS/SSL和CoAP over DTLS增强传输安全,确保数据在传输过程中的机密性和完整性。
|
7天前
|
缓存 前端开发 搜索推荐
前端性能优化实战:提升网页加载速度
前端性能优化实战:提升网页加载速度
|
12天前
|
编解码 前端开发 开发者
前端开发的必修课:如何让你的网页在不同设备上完美呈现?
【10月更文挑战第30天】随着互联网的普及,用户访问网页的设备种类繁多。前端开发者需确保网页在不同设备上完美呈现。本文介绍了一些最佳实践,包括使用响应式设计、相对单位、灵活的图片和视频、测试与优化及考虑交互设计,帮助实现跨设备兼容。
26 2
|
14天前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
54 4
|
15天前
|
前端开发 数据管理 测试技术
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
31 2
|
16天前
|
前端开发 JavaScript 数据可视化
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第26天】前端自动化测试在现代软件开发中至关重要,Jest和Cypress分别是单元测试和端到端测试的流行工具。本文通过解答一系列问题,介绍Jest与Cypress的实战应用与最佳实践,帮助开发者提高测试效率和代码质量。
27 2
|
17天前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
99 1
|
17天前
|
JSON Dart 数据格式
<大厂实战场景> ~ flutter&鸿蒙next处理后端返回来的数据的转义问题
在 Flutter 应用开发中,处理后端返回的数据是常见任务,尤其涉及转义字符时。本文详细探讨了如何使用 Dart 的 `dart:convert` 库解析包含转义字符的 JSON 数据,并提供了示例代码和常见问题的解决方案,帮助开发者有效处理数据转义问题。
112 0

相关产品

  • 物联网平台