牛晓青
背景
2021年我曾写了一个专栏,介绍
TDengine2.x
的基础实践以及遇到的问题,2022年初又发布了基于EMQX与TDengine的前后端分离项目实践系列文章,前面这些实践中主要用到了
TDengine
作为时序数据库(Time Series Database)能够高效完成海量时序数据的存储与计算功能,关于
TDengine
的高阶功能,诸如流式计算与数据订阅功能并未涉及,因此,这篇文章的内容主要是对最新发布的
TDengine3.x
安装体验以及数据订阅功能的实践。其中,数据订阅的场景为:在一系列的监测电压、电流、温度的时序数据中,一旦发现温度值超过50℃时,进行告警。(我曾使用
TDengine-alert
结合
WebHook
实现过类似需求。)
表设计
Note: 建库建表语句如下(以下是经过简化后的,仅写入两条数据,说明问题即可):
-- ts, 时间戳-- voltage, 电压-- currente, 电流-- temperature, 温度-- sn, 设备序号-- city, 时间戳-- groupid, 分组编号createdatabaseifnotexists iot;-- 超级表create stable ifnotexists iot.power(ts timestamp, voltage int, currente float, temperature float) tags(sn int, city nchar(64), groupid int);-- 子表createtableifnotexists iot.device0 using iot.power tags(0,"太原",0);createtableifnotexists iot.device1 using iot.power tags(1,"西安",1);-- 模拟数据insertinto iot.device0 values("2022-12-29 17:03:18.734",1,1.0,1.0);insertinto iot.device1 values("2022-12-29 17:03:23.734",2,2.0,2.0);
TDengine3.x
- 发布说明 https://github.com/taosdata/TDengine/releases
- 下载地址 https://docs.taosdata.com/get-started/package/#!
- TDengine发布历史及下载链接 https://docs.taosdata.com/releases/tdengine/#!
我下载的是2022年12月28日刚发布的
3.0.2.2
,新鲜出炉,香喷喷~
下载安装
TDengine3.x
的下载安装与
2.x
基本一致,除了下载地址更新为
/3.0/
。这里选用
rpm
方式进行安装。
# 下载[root@td0 local]# wget https://www.taosdata.com/assets-download/3.0/TDengine-server-3.0.2.2-Linux-x64.rpm
--2022-12-29 03:28:08-- https://www.taosdata.com/assets-download/3.0/TDengine-server-3.0.2.2-Linux-x64.rpm
正在解析主机 www.taosdata.com (www.taosdata.com)... 101.200.125.16
正在连接 www.taosdata.com (www.taosdata.com)|101.200.125.16|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:34081820 (33M)[application/x-redhat-package-manager]
正在保存至: “TDengine-server-3.0.2.2-Linux-x64.rpm”
100%[=========================================>]34,081,820 993KB/s 用时 25s
2022-12-29 03:28:34 (1.28 MB/s) - 已保存 “TDengine-server-3.0.2.2-Linux-x64.rpm” [34081820/34081820])# 安装[root@td0 local]# rpm -ivh TDengine-server-3.0.2.2-Linux-x64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:tdengine-3.0.2.2-3.el7 ################################# [100%]
Start to install TDengine...
System hostname is: td0
Enter FQDN:port (like h1.taosdata.com:6030) of an existing TDengine cluster node to join
OR leave it blank to build one:
Enter your email address for priority support or enter empty to skip:
Created symlink from /etc/systemd/system/multi-user.target.wants/taosd.service to /etc/systemd/system/taosd.service.
To configure TDengine : edit /etc/taos/taos.cfg
To start TDengine :sudo systemctl start taosd
To access TDengine : taos -h td0 to login into TDengine server
TDengine is installed successfully!# 查看状态[root@td0 local]# systemctl status taosd
● taosd.service - TDengine server service
Loaded: loaded (/etc/systemd/system/taosd.service; enabled; vendor preset: disabled)
Active: inactive (dead)# 启动服务[root@td0 local]# systemctl start taosd[root@td0 local]# systemctl status taosd
● taosd.service - TDengine server service
Loaded: loaded (/etc/systemd/system/taosd.service; enabled; vendor preset: disabled)
Active: active (running) since 四 2022-12-29 03:31:39 EST; 4s ago
Process: 21678ExecStartPre=/usr/local/taos/bin/startPre.sh (code=exited, status=0/SUCCESS)
Main PID: 21684(taosd)
CGroup: /system.slice/taosd.service
├─21684 /usr/bin/taosd
└─21694 /usr/bin/udfd -c /etc/taos/
12月 29 03:31:39 td0 systemd[1]: Starting TDengine server service...
12月 29 03:31:39 td0 systemd[1]: Started TDengine server service.
# 启动taosadapter(主要实现通过6041端口进行REST访问)[root@td0 local]# systemctl status taosadapter
● taosadapter.service - TDengine taosAdapter service
Loaded: loaded (/etc/systemd/system/taosadapter.service; disabled; vendor preset: disabled)
Active: inactive (dead)[root@td0 local]# systemctl start taosadapter[root@td0 local]# systemctl status taosadapter
● taosadapter.service - TDengine taosAdapter service
Loaded: loaded (/etc/systemd/system/taosadapter.service; disabled; vendor preset: disabled)
Active: active (running) since 四 2022-12-29 03:32:27 EST; 4s ago
Main PID: 22455(taosadapter)
CGroup: /system.slice/taosadapter.service
└─22455 /usr/bin/taosadapter
12月 29 03:32:27 td0 systemd[1]: Started TDengine taosAdapter service.
# 防火墙处理:我这里是虚拟机环境,直接关闭防火墙,实际生产环境只需开放对应端口即可。[root@td0 local]# firewall-cmd --state
running
[root@td0 local]# systemctl stop firewalld[root@td0 local]# firewall-cmd --state
not running
[root@td0 local]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
命令行客户端
在服务器上使用
TDengine
自带的命令行客户端验证服务的安装、运行情况。
[root@td0 local]# taos
Welcome to the TDengine Command Line Interface, Client Version:3.0.2.2
Copyright (c)2022 by TDengine, all rights reserved.
****************************** Tab Completion **********************************
* The TDengine CLI supports tab completion for a variety of items, *
* including database names, table names, function names and keywords. *
* The full list of shortcut keys is as follows: *
* [ TAB ]...... complete the current word *
* ......if used on a blank line, display all valid commands *
* [ Ctrl + A ]...... move cursor to the st[A]rt of the line *
* [ Ctrl + E ]...... move cursor to the [E]nd of the line *
* [ Ctrl + W ]...... move cursor to the middle of the line *
* [ Ctrl + L ]......clear the entire screen *
* [ Ctrl + K ]......clear the screen after the cursor *
* [ Ctrl + U ]......clear the screen before the cursor *
**********************************************************************************
Server is Community Edition.
taos> show databases;
name |=================================
information_schema |
performance_schema |
Query OK, 2 row(s)inset(0.002114s)
远程Windows客户端
我这里远程开发用的是
Win 10
操作系统。注意需要下载与服务器端版本一致的客户端:
https://www.taosdata.com/assets-download/3.0/TDengine-client-3.0.2.2-Windows-x64.exe
Note:
TDengine
默认使用
6030
端口通信,所以在服务器端需要开放
6030
的
TCP
端口。
远程REST客户端
# 测试RESTful远程连接curl-u root:taosdata -d'select * from iot.power' td0:6041/rest/sql
远程REST GUI客户端
tdenginegui Setup 1.0.0
提示:连接失败。。到官方看了一眼,发现有更新!!卸载旧版本,下载安装新版本。
TDengineGUI.Setup.1.0.3.exe
:连接成功。
数据订阅-场景
在一系列的监测电压、电流、温度的时序数据中,一旦发现温度值超过50℃时,进行告警。
根据场景需求,先通过
taos
客户端创建一个主题:
alarm_temperature
:
create topic alarm_temperature as select * from iot.power where temperature >= 50;
这个主题名称在我们实现消费者端时要用到。以下列出了主题相关的管理操作:创建、查看、删除等。
-- 创建主题
taos>create topic alarm_temperature asselect*from iot.power where temperature >=50;Create OK,0row(s) affected (0.009575s)-- 查看主题
taos>show topics;
topic_name |=================================
alarm_temperature |
Query OK,1row(s)inset(0.002781s)
taos>create topic alarm_voltage asselect*from iot.power where voltage >=230;Create OK,0row(s) affected (0.002000s)
taos>create topic alarm_currente asselect*from iot.power where currente >=10;Create OK,0row(s) affected (0.002221s)
taos>show topics;
topic_name |=================================
alarm_currente |
alarm_voltage |
alarm_temperature |
Query OK,3row(s)inset(0.001895s)-- 查看消费者
taos>show consumers;
Query OK,0row(s)inset(0.004082s)-- 查看订阅信息
taos>show subscriptions;
topic_name | consumer_group | vgroup_id | consumer_id |========================================================================================================
alarm_temperature | demo |2|NULL|
alarm_temperature | demo |3|NULL|
Query OK,2row(s)inset(0.002721s)-- 删除主题
taos>drop topic alarm_currente;Drop OK,0row(s) affected (0.001335s)
taos>show topics;
topic_name |=================================
alarm_voltage |
alarm_temperature |
Query OK,2row(s)inset(0.001956s)
数据订阅-消费者
为了降低使用数据订阅的上手复杂度,
TDengine
时序数据库(Time Series Database)的数据订阅功能,提供了与
Kafka
一致的接口。
这里的消费者,基于5-TDengine集成SpringBoot,MyBatis,MyBatisPlus中
MyBatisPlus
的实例,进行了改造。除了基本的
CRUD
接口外,重点实践了
TDengine
的数据订阅消费者的实现。
pom依赖
核心依赖:
SpringBoot
、
web
、
mybatis-plus
、
taos-jdbcdriver
、
spring-boot-configuration-processor
以及
lombok
。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.17</version></dependency><dependency><groupId>com.taosdata.jdbc</groupId><artifactId>taos-jdbcdriver</artifactId><version>3.0.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
这里一定注意
taos-jdbcdriver
的版本要与
TDengine
服务端版本一致或兼容。关于版本兼容性说明,见官方这个表(我的服务端
TDengine
版本为:3.0.2.2):
配置文件
- application.yml
主要包含数据源、
mybatis-plus
、日志以及自定义的
TDengine
时序数据库(Time Series Database)的数据订阅消费者配置。
spring:datasource:driver-class-name: com.taosdata.jdbc.TSDBDriver
url: jdbc:TAOS://td0:6030/iot?charset=UTF-8&locale=en_US.UTF-8&timezone=UTC-8username: root
password: taosdata
druid:initial-size:5min-idle:5max-active:5mybatis-plus:configuration:map-underscore-to-camel-case:falselogging:level:com:taosdata:example:mybatisplusdemo:mapper: debug
td:consumer:bootstrap-servers: td0:6030msg-with-table-name:trueenable-auto-commit:truegroup-id: demo
value-deserializer: com.taosdata.example.mybatisplusdemo.deserializer.PowerDeserializer
Note:记得在开发环境配置主机名解析,我这里是
Win10
的
C:\Windows\System32\drivers\etc\hosts
:
192.168.44.158 td0
- TdConfigProperties.java
结合
@ConfigurationProperties
注解实现自定义的
TDengine
的数据订阅消费者配置,将配置与代码解耦。
@ConfigurationProperties(prefix ="td.consumer")@Component@DatapublicclassTdConfigProperties{privateString bootstrapServers;privateBoolean msgWithTableName;privateBoolean enableAutoCommit;privateString groupId;privateString valueDeserializer;}
数据订阅及消费
通过
@PostConstruct
注解,在后端项目启动后自动进行订阅与消费。订阅的实现模型有两种,一种是“推”,即服务器主动将数据发到客户端;另一种是“拉”,即客户端主动向服务器请求数据。
TDengine
时序数据库(Time Series Database)使用的是“拉”模型,因此演示代码中通过一个死循环实现对主题数据的消费(实际生产可考虑其他实现方式)。
@Configuration@Slf4jpublicclassSubscribeOnStartUp{privatestaticfinalStringTOPIC="alarm_temperature";@AutowiredprivateTdConfigProperties tdConfig;@BeanpublicPropertiesconfig(){Properties properties =newProperties();
properties.setProperty(TMQConstants.BOOTSTRAP_SERVERS, tdConfig.getBootstrapServers());
properties.setProperty(TMQConstants.MSG_WITH_TABLE_NAME, tdConfig.getMsgWithTableName().toString());
properties.setProperty(TMQConstants.ENABLE_AUTO_COMMIT, tdConfig.getEnableAutoCommit().toString());
properties.setProperty(TMQConstants.GROUP_ID, tdConfig.getGroupId());
properties.setProperty(TMQConstants.VALUE_DESERIALIZER, tdConfig.getValueDeserializer());return properties;}@PostConstructpublicvoidsubscribe(){
log.info("PostConstruct");// poll dataTaosConsumer<Power> consumer =null;try{
consumer =newTaosConsumer<>(config());
consumer.subscribe(Collections.singletonList(TOPIC));while(true){ConsumerRecords<Power> powerRecords = consumer.poll(Duration.ofMillis(100));for(Power power : powerRecords){// TODO 告警推送:短信、邮箱、钉钉、企业微信、飞书、WebHook
log.info("Consumed: {}", power.toString());}}}catch(SQLException throwables){
throwables.printStackTrace();}finally{try{if(null!= consumer){
consumer.unsubscribe();}}catch(SQLException e){
e.printStackTrace();}}}}
Note:在实际中,当消费了告警数据后,可以进行告警推送:短信、邮箱、钉钉、企业微信、飞书、
WebHook
等,就像下面我们项目中的这样,可选多种告警推送方式。
告警订阅测试
在
taos
客户端中模拟数据写入:近3分钟的五条数据,显然,每条数据的温度指标都高于我们设定的阈值:50℃。
taos> insert into device0 values(now - 2m, 220, 5, 50)(now - 90s, 220, 5, 60)(now - 1m, 220, 5, 70)(now - 30s, 220, 5, 80)(now, 220, 5, 90);
在消费者端可以看到,所有的告警数据被成功消费。
Reference
- TDengine 3.0.2.0 正式发布,性能、稳定性大幅提升
- 数据订阅
Source Code
- Source Code: Github
If you have any questions or any bugs are found, please feel free to contact me.
Your comments and suggestions are welcome!
版权归原作者 Heartsuit 所有, 如有侵权,请联系我们删除。