Java零基础入门物联网(3): 国产数据库之光TDengine

前言最近,因为项目需要,将 TDengine 整合进入项目中进行使用。虽然之前也在前面的项目中多多少少用过,但抽了周末时间看了一番官网,并总结些记录及使用,物联

前言

最近由于项目需要,已将TDengine集成到项目中使用。我在之前的项目中已经在一定程度上使用过它,但是如果你想学习,我周末花了一些时间阅读官方网站,并整理了一些关于如何使用它的注释和说明。在物联网领域,你应该对时序数据库的概念有一定的了解。今天文章的主角TDengine是时序数据库的巨星。

一、概述篇

1.1 概述

TDengine是一款开源的云原生时序数据库,针对物联网、工业互联网、金融、IT运维监控等场景进行设计和优化。能够高效、实时地处理海量设备和数据采集器每天产生的TB级甚至PB级数据,提供业务运营的实时监控和预警,并能从大数据中提取商业价值

2022年8月,TD推出3.0版本(注:2.x版本将不再维护)。 3.x版本的性能测试明显高于InfluxDB和TimescaleDB,支持10亿设备、100个节点采集数据,支持存储与计算分离。因此非常适合在物联网领域集成使用。

官方网站:www.taosdata.com/

e9d8e69c33dd4271af89a727bdf9708d~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717829587&x-signature=CwSw2%2Bm43ApSbuAzrG4yEXHAbus%3D

1.2 基本概念

了解更多信息,请访问官方网站。在进行任何进一步的表设计之前,您应该清楚地理解这里的概念。

1.2.1 采集量(Metric)

采集值是指由传感器、设备或其他类型的采集点采集的物理量,例如电流、电压或温度。数据类型可以是整数、浮点、布尔值或字符串。随着时间的推移,收集的数据量将会增加。 也称为集合索引,也有人称之为集合点。任何从事物联网工作的人都需要理解这个概念。

1.2.2 标签(Tag)

标签是静态的,例如设备地址和设备颜色,但TD 允许用户更改标签。

问:更改标签后,保存的标签是原来的值还是更改后的值?

1.2.3 数据采集点(Data Collection Point)

数据采集点是指按照预设时间段或由事件触发采集物理量的硬件或软件。一个数据采集点可以采集一个或多个采集卷,但所有这些采集卷都是同时采集的,并且具有相同的时间戳。

1.2.4 表(table)

5a40367db73843bca47061a2820f936a~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717829587&x-signature=4rLRHwGeiWCNzdxrWpDzMstyZRo%3D

为了充分利用数据时序等数据特性,TDengine采用了一个数据采集点一张表的策略,这就要求你为每个数据采集点建一张单独的表(比如你有1000万个智能点),你需要在table中额外创建d1001、d1002、d1003、d1004等10000个表,用于存储该数据采集点采集到的时间序列数据)。这种设计有几个优点。

不同数据采集点生成数据的进程是完全独立的,因此每个数据采集点都有唯一的数据源,一张表只有一个写入者。这样您就可以在不锁定的情况下写入表。写入速度将会大大提高。在数据采集点,生成的数据按照时间排序,因此可以通过追加的方式实现写入操作,进一步大幅提升数据写入速度。来自数据收集点的数据按顺序存储在块中。在一段时间内读取数据会显着减少随机读取操作,并将读取和查询速度提高几个数量级。数据块内使用列存储,每种数据类型使用不同的压缩算法。此外,数据收集点收集的数据量变化缓慢,从而导致更高的压缩率。使用传统方法将多个数据采集点的数据写入单个表时,需要保护写入操作,因为不可控的网络延迟无法保证数据从不同数据采集点到达服务器的时序。将一个数据采集点的数据连续存储在一起是很困难的。使用一个数据收集点和一张表可以优化单个数据收集点的插入和查询性能。

总结:一个采集点对应一张表。

1.2.5 超级表

一个采集点一张表是否会导致表数量庞大、聚合操作频繁?

因此,引入了超表的概念。

超级表是指特定类型的数据收集点的集合。同一类型的数据采集点具有完全相同的表结构,但每个表具有不同的静态属性标记。

1.2.6 子表

通过超表创建的表称为子表。查询可以查询子表和超表。当您从主表运行查询时,TD会在查询之前过滤子表并选择匹配的子表。这大大提高了效率。

子表与常规表

子表是添加了静态标签的常规表,可以动态维护。子表和常规表不能互换。

一个超级表包含多个子表。这些子表具有相同的集合架构,但无法通过子表协调数据。此更改适用于所有子表。超级表与模板类似。您无法将数据写入超级表。数据只能从子表写入。在centos7上安装

1.3 安装

服务器,在本地计算机上安装客户端。 下载安装包并上传到您的服务器。

1.tar解压目录

2. 进入安装包所在目录,先解压文件,然后进入其子目录并运行其中的install.sh安装脚本。以上服务器端安装完成。

3、安装完成后,使用systemctl命令启动TDengine服务进程。

sql 复制代码systemctl start taosd 以下systemctl 命令对于管理TDengine 服务很有用。 — 启动服务进程:systemctl start taosd — 停止服务进程:systemctl stop taosd — 重新启动服务进程:systemctl restart taosd — 查看服务状态:systemctl status taosd systemctl stop taosd 命令是,而不是停止TDengine服务执行后立即执行,等待所需的磁盘放置工作在系统中成功完成。如果数据量很大,可能需要很长时间。大的。

如果您的系统不支持systemd,请通过键入/usr/local/taos/bin/taosd 启动TDengine 服务。

使用taos命令,输入命令行运行官网的case :

sql copy codetaos CREATE TABLE t(ts TIMESTAMP, Speed INT);创建OK,影响0行(0.014925s)taos INSERT INTO t VALUES(‘2019-07-15 00:00:00’, 10);插入OK,1行( s) 受影响(0.001002s)taos INSERT INTO t VALUES (‘2019-07-15 01:00:00’, 20);插入OK,1 行受影响(0.000965s)taos SELECT * FROM ts |====================================2019-07-15 00:00:00.000 | 2019 – 07 -15 01:00:00.000 | 查询确定,与集合中的2 行(0.001406s)建立连接。 Windows 可以直接连接到服务器来使用。 TD 提供两种连接方法。

1、通过taosAdapter组件提供的REST API与taosd建立连接。从现在开始,这种连接方法将被称为“REST 连接”。 2、通过客户端驱动taosc与服务器程序taosd建立直接连接。这种连接方法称为“本机连接”。区别:REST 连接不需要安装taosc,并且会降低30% 的性能。

下面解释本机连接方法。这意味着您需要在本地计算机上安装客户端软件。 默认安装路径为C:\TDengine,包含以下文件(目录):

taos.exe:TDengine CLI 命令行程序taosadapter.exe:服务器端可执行文件,提供RESTful 服务,接受其他各种软件的写入请求taosBenchmark.exe:TDengine 测试程序cfg : 配置文件目录driver: 应用程序驱动程序动态链接库。示例: 示例程序bash/C/C#/go/JDBC/Python/Node.jsinclude: 头文件日志: 日志文件unins000.exe: 卸载程序需要配置taos.cfg 文件,并将firstEP 更改为TDengine 服务器的端点。有。例如

第一集mytd:6030

同时,在C:\Windows\system32\drivers\etc\hosts的hosts目录中添加一条主机记录。

192.168.31.102mytd

执行taos命令:发现如下bug

服务器版本验证失败。原因:0x80002662: 无法检索表信息。错误: 某些vnode/qnode/mnode 停止服务。

原因是服务器的域名没有改变。 Linux 上修改/etc/hosts 添加mytd 192.168.31.102。

本服务中演示的软件版本为3.0.7.0。

c17e9e9d3f084a71aedfe49b17e82bad~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717829587&x-signature=r3sE%2F0oaEkEV4Um0Vfv9vrqTcYM%3D

二、TD 集成

2.1 开发指南

要使用TD,您必须:

1. 确定TD连接方式。例如,使用Java导入依赖。 2. 根据您独特的应用场景确定数据模型。根据您的数据特征决定构建一个或多个库。静态标签区分集合卷、创建适当的超表并创建子表。 4. 创建监控仪表板并使用TD 3.0的流计算能力。 5. 在插入新数据时收到通知,无需部署Kafka 或其他任何东西。软件(很好的功能!)。 6、很多场景下,需要获取各个数据采集点的最新状态。我们建议使用TD的缓存功能,而不是部署单独的缓存软件(多种解决方案),例如Redis。 7. 您可以使用自定义函数(UDF)来解决此问题。

2.2 maven 项目测试

XML 复制代码依赖项依赖项groupIdcom.taosdata.jdbc/groupId artifactIdtaos-jdbcdriver/artifactId version3.2.4/version /dependency /dependency 创建测试代码。

ini 复制代码public class TDTest { public static void main(String[] args) throws SQLException { String jdbcUrl=’jdbc:TAOS://mytd:6030?user=rootpassword=taosdata’; Properties connProps=new Properties(); connProps.setProperty(TSDBDriver. PROPERTY_KEY_CHARSET, ‘UTF-8’); connProps.setProperty(TSDBDriver.PROPERTY_KEY_LOCALE, ‘en_US.UTF-8’); connProps.setProperty(TSDBDriver.PROPERTY_KEY_TIME_ZONE, ‘UTC-8’); ‘Connected’); conn.close(); }}

2.3 数据建模

在物联网场景中,通常有不同类型的采集设备,采集不同的物理量。

同一类型的采集设备往往有多个设备分布在不同的地点。我们以智能电表为例。

TDengine创新:一个采集点、一张桌子。

前提条件:在写入数据之前,必须先建库、建超表、建表。

b0af2b0287424ef7bb31d09bd2e3fa0c~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1717829587&x-signature=yHi2lY9wMt%2FJTwDd8e27sL%2BQ0co%3D

2.3.1 创建库

建议您创建具有相同数据特征的表库。每个库都可以配置不同的存储策略。

如果您的数据不可靠但您的要求很高,请创建一个单独的数据库。如果数据可靠,则创建另一个数据库。该库中的数据保留365 天。 1010.复制SQL代码创建表meter(ts时间戳,当前float,电压int)TAGS(locationbinary(64),groupIdint)一个数据采集点和一张表。所以1000万个智能电表等于1000万个电表。

物联网系统往往有很多相同类型的数据采集点,如何处理这么多的表是一个很大的挑战。

引入超级表是为了方便处理同一类型的多个表。

创建超级表时,必须指定表名、表结构模式和标签模式。

超级表列分为两部分。

动态字段:采集的物理量动态静态字段:地理位置、设备组等同表同时采集:超表中包含的采集物理量必须同时采集。相同的。即例如温湿度传感器可以放在超级表中,因为它们同时采集数据,但设备参数较多,采集到的数据不是实时的,所以不能放在超级表中超级表你不能。由于某些类型的设备可能存在多组数量,因此必须为每组数量构建单独的超级表。因此,您可能需要为一种类型的设备创建多个超级表。因为系统有N个不同类型的设备,所以系统可以有多个DB库,而DB库必须建立一个或多个超级表

2.3.2 引入超级表

diff copy code create table d1001有。使用meter标签(‘Beijing’,2);- TDengine必须为每个数据采集点创建一个单独的表。它是从超级表(meter)创建的,也称为子表(d1001),因此在创建它时,您必须:使用超级表作为模板来指定标签的具体值。一个超级表可以包含多个子表。子表的数量没有限制。我们建议您使用全球唯一的ID 来收集数据。用户在写入数据时,并不判断某个子表是否存在。这时可以使用自动建表语法来创建不存在的子表。如果表已经存在,则不会创建新表。

SQL 复制代码使用meters 标签(‘beijing’, 2) 值(现在为10.2, 219)插入到d1001 中。 – 上面的SQL 语句将记录(现在为102, 219)插入到表d1001 中。 – 由于这个表还没有创建,我们自己创建一个子表,思考一下:多列模型VS 单列模型

TD支持多列模型,也支持使用多列模型同时收集到同一个表中的单列模型。只要物理量是从同一个数据采集点同时采集的,这些物理量就可以作为不同的列进行超表化。它基于智能电表的单列模型(电流、电压等作为字段)的情况,其中为每个物理量创建单独的表。例如,它有两个内置的电流和电压超级表。 TD的建议:

尽可能使用多列模型,因为它们的插入和存储效率更高。在某些场景下,收集点的实物量类型会频繁变化,此时可以使用单例模型。

2.3.3 创建子表

sql复制代码CREATE STABLE ocloud_point (ts timestamp, pointValue float) TAGS (unit binary(64));# 创建子表create table ocloud_point_1001_0001 using ocloud_point tag(‘kwh’);# 自动创建表Create INSERT INTO ocloud_point_1001_0001 USING ocloud_point TAGS (‘kwh’) VALUES (NOW, 10.2),(NOW,1022);INSERT INTO ocloud_point_1001_0001 USING ocloud_point TAGS (‘kwh’) VALUES (NOW, 10.2),(NOW,1022) ;同一个表,新如果插入记录的时间戳已经存在,有新值的列将用新值覆盖旧值,但没有新值的列将不受影响。

TD查询功能演示:单列和多列

SQL复制代码taos select * from ocloud_point |==========================================================================2023-08 -12 16:44:48.947 | 10.1999998 | 2022.0000000 (0.00265) 2s) taos 从ocloud _pointvalue 中选择pointvalue |=====。==================10.1999998 |查询成功,集合中有2 行(0.003383 秒) avgscss 复制代码taos select avg(pointvalue) from avg (point value)===========================516.099999904632568 1.新增依赖项

3.6.0 复制代码/依赖项!–tdengine–dependency groupIdcom.taosdata.jdbc/groupId artifactIdtaos-jdbcdriver/artifactId version3.2.4/version/dependency2,修改双数据源配置

yaml 复制代码编号数据源spring: datasource: type: com.alibaba.druid.pool.DruidDataSource druid: stat-view-servlet:启用: true 登录用户名: admin登录密码: 123456 权限: web统计过滤器:启用3336 0 true 动态: 初级: 硕士数据

source: master: driver-class-name: com.mysql.cj.jdbc.Driver username: ${MYSQL_USER:root} password: ${MYSQL_PWD:root} url: jdbc:mysql://${MYSQL_HOST:127.0.0.1}:${MYSQL_PORT:3306}/${MYSQL_DB:ocloud_data}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true taosd: driver-class-name: com.taosdata.jdbc.TSDBDriver url: jdbc:TAOS://192.168.100.98:6030/ocloud?timezone=Asia/Beijing&charset=UTF-8 username: root password: taosdata3、可以编写 mapper 层
less复制代码@Mapper@DS(“taosd”)public interface TDEngineMapper extends BaseMapper<PointValueEntity> { /** * 批量插入 * @param list */ @InterceptorIgnore(tenantLine = “true”) void pointValueInsert(@Param(“list”) List<PointValueEntity> list); /** * 获取个数 * @param data * @return */ Long getCountByTimestamp(PointSelectDTO data); /** * 分页查询 * @param data * @return */ @InterceptorIgnore(tenantLine = “true”) List<PointValueEntity> getPageByTimestamp(PointPageDTO data); }4、xml 的案例代码
xml复制代码<!– 批量插入–><insert id=”pointValueInsert” parameterType=”java.util.List”> insert into <foreach collection=”list” item=”item” separator=” ” close=”;”> ocloud_point_${item.deviceId}_${item.pointId} using ocloud_point tags(#{item.deviceId},#{item.pointId}) values (#{item.ts},#{item.pointValue}) </foreach></insert><!– 按时间范围获取个数 –><select id=”getCountByTimestamp” parameterType=”com.unisun.ocloud.data.tdEngine.dto.PointSelectDTO” resultType=”java.lang.Long”> <choose> <when test=”deviceId != null and pointId != null and deviceId != ” and pointId != ””> SELECT count(0) FROM ocloud_point_${deviceId}_${pointId} WHERE ts BETWEEN #{startTime} AND #{endTime} </when> <otherwise> SELECT count(0) FROM ocloud_point WHERE ts BETWEEN #{startTime} AND #{endTime} </otherwise> </choose></select><!– 按时间周期分页查询 –><select id=”getPageByTimestamp” resultType=”com.unisun.ocloud.data.tdEngine.entity.PointValueEntity”> select _wstart,FIRST(point_value) as pointValue,ts,device_id,point_id FROM ocloud_point <where> <if test=”pointId!=null and pointId!=””> and point_id = #{pointId} </if> <if test=”deviceId!=null and deviceId!=””> and device_id = #{deviceId} </if> <if test=”startTime!=null and endTime!=null”> and ts BETWEEN #{startTime} AND #{endTime} </if> </where> interval(${inter}) FILL(NULL) LIMIT ${pageStart},${pageSize}</select>

小结

有关 TD 的入门使用就到这了,官方给的demo案例也不错,主要可以了解下这款数据库的基本用法,在监控数据领域、物联网采集领域、涉及到时序数据库相关场景的使用时,可以多一项考虑。且随着 TD 的日益成熟,很多高级功能也待自己去探索,比如流式计算的使用、窗口函数、发布订阅等,如若后续碰到相关场景,在考虑作文跟进,本篇的基础介绍就到此结束了,感谢阅读!

原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/85425.html

Like (0)
小条的头像小条
Previous 2024年6月1日 下午2:52
Next 2024年6月1日 下午2:53

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注