tdengine入门详解

news2024/12/24 0:36:04

TDengine是什么?

TDengine 是一款开源、高性能、云原生的时序数据库(Time Series Database, TSDB), 它专为物联网、车联网、工业互联网、金融、IT 运维等场景优化设计,基于C语言开发

什么是时序数据库?时序数据产生的背景是什么?

https://db-engines.com/

基础知识

采集量

采集量是指传感器、设备或其他类型采集点采集的物理量,比如电流、电压、温度、压力、GPS 位置等,是随时间变化的,数据类型可以是整型、浮点型、布尔型,也可是字符串。随着时间的推移,存储的采集量的数据量越来越大。智能电表示例中的电流、电压、相位就是采集量。

标签

标签是指传感器、设备或其他类型采集点的静态属性,不是随时间变化的,比如设备型号、颜色、设备的所在地等,数据类型可以是任何类型。

数据采集点

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

TDengine 采用传统的关系型数据库模型管理数据,需要先创建库,然后创建表,之后才能插入或查询数据。TDengine 采取一个数据采集点一张表的策略,该策略会影响TDengine整体表结构的设计。

超级表

由于一个数据采集点一张表,导致表的数量巨增,难以管理,而且应用经常需要做采集点之间的聚合操作,聚合的操作也变得复杂起来。在 TDengine 的设计里,用来代表一个具体的数据采集点超级表用来代表一组相同类型的数据采集点集合

子表

以超级表为模板创建的表

智能电表数据模型示意图

 

库是指一组表的集合。TDengine 容许一个运行实例有多个库,而且每个库可以配置不同的存储策略。不同类型的数据采集点往往具有不同的数据特征,包括数据采集频率的高低,数据保留时间的长短,副本的数目,数据块的大小,是否允许更新数据等等。

TDengine一些独特的设计点:

  1. 超级表,在 TDengine 的设计里,表用来代表一个具体的数据采集点(一个设备),超级表用来代表一组相同类型的数据采集点集合

Device IDTimestamp采集指标标签
currentvoltagephaselocationgroupid
d1001153854868500010.32190.31California.SanFrancisco2
d1002153854868400010.22200.23California.SanFrancisco3
d1003153854868650011.52210.35California.LosAngeles3
d1004153854868550013.42230.29California.LosAngeles2
d1001153854869500012.62180.33California.SanFrancisco2
d1004153854869660011.82210.28California.LosAngeles2
d1002153854869665010.32180.25California.SanFrancisco3
d1001153854869680012.32210.31California.SanFrancisco2

为充分利用其数据的时序性和其他数据特点,TDengine 采取一个数据采集点一张表的策略,要求对每个数据采集点单独建表(比如有一千万个智能电表,就需创建一千万张表,上述表格中的 d1001,d1002,d1003,d1004 都需单独建表),用来存储这个数据采集点所采集的时序数据。这种设计有几大优点:

  1. 无锁写入:由于不同数据采集点产生数据的过程完全独立,每个数据采集点的数据源是唯一的,一张表也就只有一个写入者,这样就可采用无锁方式来写,写入速度就能大幅提升。

  2. 追加式写入:对于一个数据采集点而言,其产生的数据是按照时间排序的,因此写的操作可用追加的方式实现,进一步大幅提高数据写入速度。

  3. 减少随机操作:一个数据采集点的数据是以块为单位连续存储的。如果读取一个时间段的数据,它能大幅减少随机读取操作,成数量级的提升读取和查询速度。

  4. 针对性压缩:一个数据块内部,采用列式存储,对于不同数据类型,采用不同压缩算法,而且由于一个数据采集点的采集量的变化是缓慢的,压缩率更高

  5.  

功能点

建立连接方式

连接器建立连接的方式,TDengine 提供两种:

  1. 通过 taosAdapter 组件提供的 REST API 建立与 taosd 的连接,这种连接方式简称“REST 连接”,

  2. 通过客户端驱动程序 taosc 直接与服务端程序 taosd 建立连接,这种连接方式简称“原生连接”。这种方式对驱动的匹配性要求较严。

  3. 优点:跨平台性好,不需要创建的docker镜像涵盖taosd驱动 缺点:性能比原生连接慢,性能降幅在30%左右。

查询数据
  1. 标准 SQL,含嵌套查询

  2. 时序数据特色函数

  3. 时序数据特色查询,例如降采样、插值、累加和、时间加权平均、状态窗口、会话窗口等

  4. 用户自定义函数(UDF)

多列模型与单列模型
  1. 多列模型适用于设备对应属性同时采集的场景(最初版本的内置网关),这样可以有较高的插入效率与存储效率

  2. 单列模型适用于设备对应属性不一定同时采集的场景(现在的内置网关采集模式)

查询功能

TDengine 支持如下查询功能:

  • 单列、多列数据查询

  • 标签和数值的多种过滤条件:>, <, =, <>, like 等

  • 聚合结果的分组(Group by)、排序(Order by)、约束输出(Limit/Offset)

  • 时间窗口(Interval)、会话窗口(Session)和状态窗口(State_window)等窗口切分聚合查询

  • 数值列及聚合结果的四则运算

  • 时间戳对齐的连接查询(Join Query: 隐式连接)操作

  • 多种聚合/计算函数: count, max, min, avg, sum, twa, stddev, leastsquares, top, bottom, first, last, percentile, apercentile, last_row, spread, diff 等

实例SQL演示

  1. 建库

create database if not exists meter vgroups 10 buffer 10 keep 30d;

  1. 统计指定时间范围数据量

select _wstart, _wend,count(*) from meter.meters

where id = '89c64310-7bf0-36ba-8c16-ef9648ef88f2' interval(10m);

  1. 获取设备属性最新值/最老值

select last(*) from meter.meters where id = '89c64310-7bf0-36ba-8c16-ef9648ef88f2';

select first(*) from meter.meters where id = '89c64310-7bf0-36ba-8c16-ef9648ef88f2';

  1. 插入记录时自动建表

insert into meter.meters_89c64310-7bf0-36ba-8c16-ef9648ef88f2 using meter.meters tags('89c64310-7bf0-36ba-8c16-ef9648ef88f2') values(now(), 15, 222, 0.5);

  1. 同时向多个表写入数据

insert into meter.meters_89c64310-7bf0-36ba-8c16-ef9648ef88f2 using meter.meters tags('89c64310-7bf0-36ba-8c16-ef9648ef88f2')

values(now(), 15, 222, 0.5)

meter.meters_cdf2373e-457b-312c-8553-36d6c1a09c93 using meter.meters tags('cdf2373e-457b-312c-8553-36d6c1a09c93')

values(now(), 18, 235, 0.46);

  1. 流计算-https://docs.taosdata.com/taos-sql/stream/

create stream if not exists s1 fill_history 1 into meter.st1 as select count(*) from meter.meters interval(1h);

select * from meter.st1 ;

// 删除流

DROP STREAM IF EXISTS s1 ;

  1. 数据切分查询(PARTITION BY part_list)

select location,max(current),count(*) from test.meters partition by location;

  1. 时间窗口切分查询

select _wstart,count(*) from meter.meters

where id = 'cdf2373e-457b-312c-8553-36d6c1a09c93' and ts > '2023-07-30 13:00:00'

interval(10m);

  1. 状态窗口查询

select * from meter.status;

SELECT COUNT(*), FIRST(ts), status FROM meter.status STATE_WINDOW(status);

整体架构

主要逻辑单元

 

物理节点(pnode): pnode 是一独立运行、拥有自己的计算、存储和网络能力的计算机,可以是安装有 OS 的物理机、虚拟机或 Docker 容器。

数据节点(dnode): dnode 是 TDengine 服务器侧执行代码 taosd 在物理节点上的一个运行实例,一个工作的系统必须有至少一个数据节点。dnode 包含零到多个逻辑的虚拟节点(vnode),零或者至多一个逻辑的管理节点(mnode),零或者至多一个逻辑的弹性计算节点(qnode),零或者至多一个逻辑的流计算节点(snode)。

虚拟节点(vnode): 为更好的支持数据分片、负载均衡,防止数据过热或倾斜,数据节点被虚拟化成多个虚拟节点(vnode,图中 V2,V3,V4 等)。每个 vnode 都是一个相对独立的工作单元,是时序数据存储的基本单元,具有独立的运行线程、内存空间与持久化存储的路径。

管理节点(mnode): 一个虚拟的逻辑单元,负责所有数据节点运行状态的监控和维护,以及节点之间的负载均衡(图中 M)。同时,管理节点也负责元数据(包括用户、数据库、超级表等)的存储和管理,因此也称为 Meta Node。mnode 支持多副本,采用 RAFT 一致性协议,保证系统的高可用与高可靠,任何数据更新操作只能在 Leader 上进行。

计算节点(qnode): 一个虚拟的逻辑单元,运行查询计算任务,也包括基于系统表来实现的 show 命令(图中 Q)。集群中可配置多个 qnode,在整个集群内部共享使用(图中 Q1,Q2,Q3)。qnode 不与具体的 DB 绑定,即一个 qnode 可以同时执行多个 DB 的查询任务。每个 dnode 上至多有一个 qnode,由所属的数据节点的 EP 来唯一标识。

流计算节点(snode): 一个虚拟的逻辑单元,只运行流计算任务(图中 S)。集群中可配置多个 snode,在整个集群内部共享使用(图中 S1,S2,S3)。snode 不与具体的 stream 绑定,即一个 snode 可以同时执行多个 stream 的计算任务。

虚拟节点组(VGroup): 不同数据节点上的 vnode 可以组成一个虚拟节点组(vgroup),采用 RAFT 一致性协议,保证系统的高可用与高可靠。写操作只能在 leader vnode 上进行,系统采用异步复制的方式将数据同步到 follower vnode,这样确保了一份数据在多个物理节点上有拷贝。

Taosc taosc 是 TDengine 给应用提供的驱动程序(driver),负责处理应用与集群的接口交互,用都是通过 taosc 而不是直接连接集群中的数据节点与整个集群进行交互的。这个模块负责获取并缓存元数据;将插入、查询等请求转发到正确的数据节点;在把结果返回给应用时,还需要负责最后一级的聚合、排序、过滤等操作。

 

存储模型

TDengine 存储的数据包括采集的时序数据以及库、表相关的元数据、标签数据等,这些数据具体分为三部分:

  1. 时序数据:存放于 vnode 里,由 data、head 和 last 三个文件组成,数据量大,查询量取决于应用场景。容许乱序写入,但暂时不支持删除操作。

  2. 数据表元数据:包含标签信息和 Table Schema 信息,存放于 vnode 里的 meta 文件,支持增删改查四个标准操作。支持多核多线程并发查询。只要计算内存足够,元数据全内存存储,千万级别规模的标签数据过滤结果能毫秒级返回。在内存资源不足的情况下,仍然可以支持数千万张表的快速查询。

  3. 数据库元数据:存放于 mnode 里,包含系统节点、用户、DB、STable Schema 等信息,支持增删改查四个标准操作。这部分数据的量不大,可以全内存保存,而且由于客户端有缓存,查询量也不大。

与典型的 NoSQL 存储模型相比,TDengine 将标签数据时序数据完全分离存储,它具有两大优势:

  1. 能够极大地降低标签数据存储的冗余度:一般的 NoSQL 数据库或时序数据库,采用的 K-V 存储,其中的 Key 包含时间戳、设备 ID、各种标签。

  2. 能够实现极为高效的多表聚合查询:做多表之间聚合查询时,先把符合标签过滤条件的表查找出来,然后再查找这些表相应的数据块,这样大幅减少要扫描的数据集,从而大幅提高查询效率。

数据分片

TDengine 是通过 vnode 来实现数据分片的,通过一个时间段一个数据文件来实现时序数据分区的。

vnode(虚拟数据节点)负责为采集的时序数据提供写入、查询和计算功能。为便于负载均衡、数据恢复、支持异构环境,TDengine 将一个数据节点根据其计算和存储资源切分为多个 vnode。这些 vnode 的管理是 TDengine 自动完成的,对应用完全透明。

数据分区

TDengine 除 vnode 分片之外,还对时序数据按照时间段进行分区。每个数据文件只包含一个时间段的时序数据,时间段的长度由 DB 的配置参数 days 决定。这样分区便于高效实现数据的保留策略,只要数据文件超过规定的天数(系统配置参数 keep),将被自动删除

负载均衡

每个 dnode 都定时向 mnode(虚拟管理节点)报告其状态(包括硬盘空间、内存大小、CPU、网络、虚拟节点个数等),因此 mnode 了解整个集群的状态。基于整体状态,当 mnode 发现某个 dnode 负载过重,它会将 dnode 上的一个或多个 vnode 挪到其他 dnode。

多级存储

多级存储功能仅企业版支持,

生态

 

使用注意事项

  1. 时间戳:

    1. 所有表的第一列都必须是时间戳类型,且为其主键,TDengine 要求插入的数据必须要有时间戳

    2. 时间戳不同的格式语法会有不同的精度影响。字符串格式的时间戳写法不受所在 DATABASE 的时间精度设置影响;而长整形格式的时间戳写法会受到所在 DATABASE 的时间精度设置影响。例如,时间戳"2021-07-13 16:16:48"的 UNIX 秒数为 1626164208。则其在毫秒精度下需要写作 1626164208000,在微秒精度设置下就需要写为 1626164208000000,纳秒精度设置下需要写为 1626164208000000000。

    3. 一次插入多行数据时不要把首列的时间戳的值都写 NOW。否则会导致语句中的多条记录使用相同的时间戳,于是就可能出现相互覆盖以致这些数据行无法全部被正确保存。其原因在于,NOW 函数在执行中会被解析为所在 SQL 语句的客户端执行时间,出现在同一语句中的多个 NOW 标记也就会被替换为完全相同的时间戳取值。

    4. 允许插入的最老记录的时间戳=now - KEEP 值,超过该范围无法插入

  2. json格式,目前版本json只支持tag,不支持其他数据列

  3. 长度调整,只支持调大,不支持调小

  4. 同一条sql写入vnode,彼此间执行结果不影响

这是因为多个子表可能分布在不同的 VNODE 上,客户端将 INSERT 语句完整解析后,将数据发往各个涉及的 VNODE 上,每个 VNODE 独立进行写入操作。如果某个 VNODE 因为某些原因(比如网络问题或磁盘故障)导致写入失败,并不会影响其他 VNODE 节点的写入。

性能对比

TDengine vs Cassandra性能对比 https://www.taosdata.com/engineering/573.html

扩展阅读

  1. https://db-engines.com/en/blog_post/71 时序数据库产生的背景

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/826067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三元运算符引发的自动拆装箱问题

文章目录 问题背景问题排查排查过程问题扩展总结 问题背景 生产环境上出现空指针异常&#xff0c;追踪报错位置得知以下代码报错 if (isNull(aiGroup)) {return null;}aiGroup.setNum(isNull(param.getNum()) ? aiGroup.getNum() : param.getNum().doubleValue());问题排查 …

1500-2000元预算性价比吉他推荐,雅马哈FG800和VEAZEN费森VZ90怎么选?评测对比哪一款更适合初学者入门选购!

在2000元价位入门进阶吉他圈里&#xff0c;可谓是群雄角逐&#xff0c;Yamaha 雅马哈入门级FG800系列和VEAZEN 费森VZ90系列是一直都很热销的面单吉他型号&#xff0c;初学者想要在其中挑选出一把合适自己的吉他还是有点难度的。 那么&#xff0c;今天就以它们为本期的评测主角…

企业级高负载web服务器-Tomcat小项目

目录 web静态动态页面区别安装java环境安装Tomcat安装Tomcat包到目录查看Tomcat主目录结构查看Tomcat配置目录结构Tomcat管理Tomcat web管理功能 部署jpress应用 web静态动态页面区别 静态页面&#xff1a; 在网站设计中&#xff0c;纯粹HTML格式的网页&#xff08;可以包含图…

后端整理(JVM、Redis、反射)

1. JVM 文章仅为自身笔记 详情查看一篇文章掌握整个JVM&#xff0c;JVM超详细解析&#xff01;&#xff01;&#xff01; 1.1 什么是JVM jvm是Java虚拟机 1.2 Java文件的编译过程 程序员编写代码形成.java文件经过javac编译成.class文件再通过JVM的类加载器进入运行时数据…

MFC、Qt、WPF?该用哪个?

MFC、Qt和WPF都是流行的框架和工具&#xff0c;用于开发图形用户界面&#xff08;GUI&#xff09;应用程序。选择哪个框架取决于你的具体需求和偏好。MFC&#xff08;Microsoft Foundation Class&#xff09;是微软提供的框架&#xff0c;使用C编写&#xff0c;主要用于Windows…

蔚小理新势力互联网造车在CAN FD硬件主框架及后装控制方案开发

在国内&#xff0c;新势力造车影响已经非常之大&#xff0c;整个造车大潮中&#xff0c;新整车企业蔚来汽车、小鹏汽车、理想汽车无一例外选择了CAN FD作为主要的车载通信总线&#xff0c;特斯拉推出了引领汽车EE架构集中化的趋势&#xff0c;即使在车载以太网EE架构快速发展的…

BES 平台 SDK之充电盒与耳塞串口单工通信

本文章是基于BES2700 芯片&#xff0c;其他BESxxx 芯片可做参考&#xff0c;如有不当之处&#xff0c;欢迎评论区留言指出。仅供参考学习用&#xff01; BES 平台 SDK之主从耳组队_谢文浩的博客-CSDN博客 关于系统主从耳组队流程可参考上一篇文章。链接如上所示&#xff01; …

初识集合和背后的数据结构

目录 集合 Java集合框架 数据结构 算法 集合 集合&#xff0c;是用来存放数据的容器。其主要表现为将多个元素置于一个单元中&#xff0c;用于对这些元素进行增删查改。例如&#xff0c;一副扑克牌(一组牌的集合)、一个邮箱(一组邮件的集合&#xff09;。 Java中有很多种集…

捷码低代码|Modal模态框组件详解

知识补充&#xff1a; 模态组件是一种在用户界面中显示的特殊类型的组件。它们被设计为在应用程序的其他部分被屏蔽或暂停的情况下引导用户完成一个特定的任务或交互。 常见的模态组件包括&#xff1a; 1、弹出窗口&#xff08;Popup&#xff09;&#xff1a;弹出窗口是一种常见…

Unity中UGUI的 OnPopulateMesh函数与VertexHelper类

Graphics类 当一个UGUI的UI元素生成顶点数据时会调用Graphics类中的 OnPopulateMesh(VertexHelper vh) 函数&#xff0c;我们可以在这个函数中修改顶点的数据或者获取顶点的数据。 UGUI中与显示相关的控件&#xff0c;例如Image、Text、RawImage等都继承自MaskableGraphic类&a…

正则替换windows文件名禁用的特殊字符

背景&#xff1a; windows文件名中不能出现以下提示的特殊字符&#xff0c;因此需要提前替换处理。 解决&#xff1a; // 替换\/:*?"<>|为空 fileName.replaceAll("[\\\\/:*?\"<>|]", "");

Boost开发指南-3.9object_pool

object_pool object_pool是用于类实例&#xff08;对象&#xff09;的内存池&#xff0c;它的功能与pool类似&#xff0c;但会在析构时对所有已经分配的内存块调用析构函数&#xff0c;从而正确地释放资源。 object_pool位于名字空间boost&#xff0c;为了使用object_pool组件…

千元级入门单板吉他推荐,SAGA萨伽SF700、VEAZEN费森VZ200、布鲁克V12、恩雅X1PRO全方面评测对比,哪一款更值得购买!

很多吉他初学者的预算不多&#xff0c;就想要选购平价又好用的吉他&#xff0c;这个想法是很正确的。初学者要注意的是这种平价且高性价比的吉他需要仔细挑选&#xff0c;太便宜的合板吉他保证不了原材料的品质和制作工艺要求&#xff0c;音准手感都无法保证&#xff0c;那么这…

云主机秘钥泄露及利用

前言&#xff1a; 云平台作为降低企业资源成本的工具&#xff0c;在当今各大公司系统部署场景内已经成为不可或缺的重要组成部分&#xff0c;并且由于各类应用程序需要与其他内外部服务或程序进行通讯而大量使用凭证或密钥&#xff0c;因此在漏洞挖掘过程中经常会遇到一类漏洞&…

时间复杂度、空间复杂度实践练习(力扣OJ)

目录 文章目录 前言 题目一&#xff1a;轮转数组 思路一&#xff1a; 思路二&#xff1a; 思路三&#xff1a; 题目二&#xff1a;消失的数字 思路一&#xff1a; 思路二&#xff1a; 思路三&#xff1a; 题目三&#xff1a;移除元素 思路&#xff1a; 总结 前言 想要编写高效的…

2023年第四届“华数杯”数学建模思路 - 案例:随机森林

## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 什么是随机森林&#xff1f; 随机森林属于 集成学习 中的 Bagging&#xff08;Bootstrap AGgregation 的简称&#xff09; 方法。如果用图来表示他们之…

【技术分享】SSD20X USB摄像头使用

本文主要介绍基于Purple Pi R1演示如何配置USB摄像头&#xff0c;此方法适用于SSD201/202全系列产品。 Purple Pi R1主板&#xff0c;是基于 SigmaStar SSD201 SoC&#xff08;ARM Cortex A7 内核&#xff09;兼容树莓派的开发板&#xff0c;主频高达1.2GHz&#xff0c;256KB …

HR如何提高自己的薪资?或许是一个好选择!

从助理到总监&#xff0c;随着级别的提升&#xff0c;薪资也水涨船高&#xff0c;从4K涨到了24K。值得注意的是&#xff0c;从助理到主管&#xff0c;薪资涨幅较小&#xff0c;而从主管到总监&#xff0c;尤其是经理到总监&#xff0c;薪资有很大的突破。 各行业HR人员薪资水平…

Hutool BeanUtils.copyProperties的四种用法 空不拷贝/忽略拷贝/空不和忽略拷贝/全拷贝

关注公众号&#xff1a;”奇叔码技术“ 回复&#xff1a;“java面试题大全”或者“java面试题” 即可领取资料 一、Hutool BeanUtils.copyProperties的四种用法 空不拷贝/忽略拷贝/空不和忽略拷贝/全拷贝 1、第一种用法&#xff1a; BeanUtils.copyProperties(三个参数) 不为空…

数组指针

数组指针的定义 1.数组指针是指针还是数组&#xff1f; 指针。 int a 10;int* p &a;//指向整型数据的指针 char b w;char* q &b;//指向字符变量的指针 所以数组指针应该是指向数组的指针。 2.数组指针应该怎么定义&#xff1f; int arr[10] { 0 };int(*p)[10] …