Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
d0b332ed
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
d0b332ed
编写于
4月 16, 2022
作者:
陶建辉(Jeff)
提交者:
GitHub
4月 16, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Update 02-concept.md
上级
c0fe41d8
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
133 addition
and
36 deletion
+133
-36
docs-cn/02-concept/02-concept.md
docs-cn/02-concept/02-concept.md
+133
-36
未找到文件。
docs-cn/02-concept/02-concept.md
浏览文件 @
d0b332ed
---
title
:
基本概念
title
:
数据模型和
基本概念
---
## 物联网典型场景
在典型的物联网、车联网、运维监测场景中,往往有多种不同类型的数据采集设备,采集一个到多个不同的物理量。而同一种采集设备类型,往往又有多个具体的采集设备分布在不同的地点。大数据处理系统就是要将各种采集的数据汇总,然后进行计算和分析。对于同一类设备,其采集的数据类似如下的表格:
| Device ID | Time Stamp | Value 1 | Value 2 | Value 3 | Tag 1 | Tag 2 |
| :-------: | :-----------: | :-----: | :-----: | :-----: | :---: | :---: |
| D1001 | 1538548685000 | 10.3 | 219 | 0.31 | Red | Tesla |
| D1002 | 1538548684000 | 10.2 | 220 | 0.23 | Blue | BMW |
| D1003 | 1538548686500 | 11.5 | 221 | 0.35 | Black | Honda |
| D1004 | 1538548685500 | 13.4 | 223 | 0.29 | Red | Volvo |
| D1001 | 1538548695000 | 12.6 | 218 | 0.33 | Red | Tesla |
| D1004 | 1538548696600 | 11.8 | 221 | 0.28 | Black | Honda |
每一条记录都有设备 ID,时间戳,采集的物理量,还有与每个设备相关的静态标签。每个设备是受外界的触发,或按照设定的周期采集数据。采集的数据点是时序的,是一个数据流。
**数据特征**
除时序特征外,仔细研究发现,物联网、车联网、运维监测类数据还具有很多其他明显的特征。
在典型的物联网、车联网、运维监测场景中,往往有多种不同类型的数据采集设备或采集点,采集一个到多个不同的物理量。而同一种采集设备类型,往往又有多个具体的采集设备分布在不同的地点。采集的物理量都带有时间标签,而且数据量随时间不断增长,但每个数据采集设备或采集点还有自身的静态属性。对于同一类设备,其采集的数据以及静态属性都是很规则的。以智能电表为例,假设每个智能电表采集电流、电压、相位三个量,其采集的数据类似如下的表格:
<table>
<thead><tr>
<th
>
设备ID
</th>
<th
>
时间戳
</th>
<th
colspan=
"3"
>
采集量
</th>
<th
colspan=
"2"
>
标签
</th>
</tr>
<tr>
<th
>
Device ID
</th>
<th
>
Time Stamp
</th>
<th
>
current
</th>
<th
>
voltage
</th>
<th
>
phase
</th>
<th
>
location
</th>
<th
>
groupId
</th>
</tr>
</thead>
<tbody>
<tr>
<td
>
d1001
</td>
<td
>
1538548685000
</td>
<td
>
10.3
</td>
<td
>
219
</td>
<td
>
0.31
</td>
<td
>
Beijing.Chaoyang
</td>
<td
>
2
</td>
</tr>
<tr>
<td
>
d1002
</td>
<td
>
1538548684000
</td>
<td
>
10.2
</td>
<td
>
220
</td>
<td
>
0.23
</td>
<td
>
Beijing.Chaoyang
</td>
<td
>
3
</td>
</tr>
<tr>
<td
>
d1003
</td>
<td
>
1538548686500
</td>
<td
>
11.5
</td>
<td
>
221
</td>
<td
>
0.35
</td>
<td
>
Beijing.Haidian
</td>
<td
>
3
</td>
</tr>
<tr>
<td
>
d1004
</td>
<td
>
1538548685500
</td>
<td
>
13.4
</td>
<td
>
223
</td>
<td
>
0.29
</td>
<td
>
Beijing.Haidian
</td>
<td
>
2
</td>
</tr>
<tr>
<td
>
d1001
</td>
<td
>
1538548695000
</td>
<td
>
12.6
</td>
<td
>
218
</td>
<td
>
0.33
</td>
<td
>
Beijing.Chaoyang
</td>
<td
>
2
</td>
</tr>
<tr>
<td
>
d1004
</td>
<td
>
1538548696600
</td>
<td
>
11.8
</td>
<td
>
221
</td>
<td
>
0.28
</td>
<td
>
Beijing.Haidian
</td>
<td
>
2
</td>
</tr>
<tr>
<td
>
d1002
</td>
<td
>
1538548696650
</td>
<td
>
10.3
</td>
<td
>
218
</td>
<td
>
0.25
</td>
<td
>
Beijing.Chaoyang
</td>
<td
>
3
</td>
</tr>
<tr>
<td
>
d1001
</td>
<td
>
1538548696800
</td>
<td
>
12.3
</td>
<td
>
221
</td>
<td
>
0.31
</td>
<td
>
Beijing.Chaoyang
</td>
<td
>
2
</td>
</tr>
</tbody>
</table>
<center>
<a
href=
"#model_table1"
>
表 1:智能电表数据示例
</a></center>
每一条记录都有设备 ID,时间戳,采集的物理量(如上图中的电流、电压、相位),还有与每个设备相关的静态标签(如上述表 1 中的位置 location 和分组 groupId)。每个设备是受外界的触发,或按照设定的周期采集数据。采集的数据点是时序的,是一个数据流。
## 数据特征
除时序特征外,仔细研究发现,物联网、车联网、运维监测类数据及其应用还具有很多其他明显的特征。
1.
数据是结构化的;
2.
数据极少有更新或删除操作;
...
...
@@ -30,41 +115,53 @@ title: 基本概念
6.
用户关注的是一段时间的趋势,而不是某一特点时间点的值;
7.
数据是有保留期限的;
8.
数据的查询分析一定是基于时间段和地理区域的;
9.
除存储查询外,还往往需要各种统计和实时计算
操作;
9.
系统需要各种实时计算和统计操作,包括降采样、插值等特种
操作;
10.
数据量巨大,一天采集的数据就可以超过 100 亿条。
充分利用上述特征,TDengine 采取了一特殊的优化的存储和计算设计来处理时序数据,能将系统处理能力显著提高。
## 数据采集点
## 采集量(Metric)
采集量是指传感器、设备或其他类型采集点采集的物理量,比如电流、电压、温度、压力、GPS位置等,是随时间变化的,数据类型可以是整型、浮点型、布尔型,也可是字符串。随着时间的推移,存储的采集量的数据量越来越大。
## 标签(Label/Tag)
标签是指传感器、设备或其他类型采集点的静态属性,不是随时间变化的,比如设备型号、颜色、设备的所在地等,数据类型可以是任何类型。虽然是静态的,但TDengine容许用户修改、删除或增加标签值。与采集量不一样的是,随时间的推移,存储的标签的数据量不会有什么变化。
## 数据采集点(Data Colletion Point)
持续按照预设频率生成数据的软件或硬件设备称为数据采集点。TDengine中推荐一个数据采集点生成的数据存储在对应的一个或若干个表中。采集点产生的数据通常是包括时间戳、测量值、标签等必要信息构成的元组
。
数据采集点是指按照预设时间周期或受事件触发采集物理量的硬件或软件。一个数据采集点可以采集一个或多个物理量,
**但这些物理量都是同一时刻采集的,具有相同的时间戳**
。对于复杂的设备,往往有多个数据采集点,每个采集点采集的周期都可能不一样,而且完全独立,不同步。比如对于一台汽车,有数据采集点专门采集GPS位置,有数据采集点专门采集发动机状态,有数据采集点专门采集车内的环境,这样一台汽车就有三个数据采集点
。
##
采集量
##
关系型数据库模型
数据采集点生成的具有时间、测量值、标签的元组信息。除了时间戳、标签信息以外的测量值称为采集量
。
因为采集的数据一般是结构化数据,同时为降低学习门槛,TDengine 采用传统的关系型数据库模型管理数据。用户需要先创建库,然后创建表,之后才能插入或查询数据。TDengine 采用的是结构化存储,而不是 NoSQL 的 key-value 存储
。
## 标签
与通用数据库相比,TDengine通过一个数据采集点一张表,来大幅提高单个数据采集点的插入和查询速度。同时TDengine引入了超级表的概念,让每个表都带有标签,解决多个数据采集点之间的聚合分析问题。
表的结构化描述信息,以一维数组形式存在。标签模式需要在创建超级表的时候指定,后续可动态调整。只有基于超级表创建的子表才具有标签。标签信息的内容首次创建子表的时候指定,并可按需调整。可以看到,TDengine中标签信息是表级别,而不是记录级别。
## 一个数据采集点一张表
## 数据库
为充分利用其数据的时序性和其他数据特点,TDengine 要求
**对每个数据采集点单独建表**
(比如有一千万个智能电表,就需创建一千万张表,上述表格中的 d1001,d1002,d1003,d1004 都需单独建表),用来存储这个采集点所采集的时序数据。这种设计有几大优点:
TDengine中数据库与普通数据库管理系统中的数据库语义和行为相同,但是结合应用需求增加了若干配置参数用以控制其行为。
1.
能保证一个采集点的数据在存储介质上是以块为单位连续存储的。如果读取一个时间段的数据,它能大幅减少随机读取操作,成数量级的提升读取和查询速度。
2.
由于不同采集设备产生数据的过程完全独立,每个设备的数据源是唯一的,一张表也就只有一个写入者,这样就可采用无锁方式来写,写入速度就能大幅提升。
3.
对于一个数据采集点而言,其产生的数据是时序的,因此写的操作可用追加的方式实现,进一步大幅提高数据写入速度。
## 超级表
如果采用传统的方式,将多个设备的数据写入一张表,由于网络延时不可控,不同设备的数据到达服务器的时序是无法保证的,写入操作是要有锁保护的,而且一个设备的数据是难以保证连续存储在一起的。
**采用一个数据采集点一张表的方式,能最大程度的保证单个数据采集点的插入和查询的性能是最优的。**
超级表(Super Table, STable)是TDengine中一个重要的概念。超级表是面向相同数据模式的数据表,提供(数据+标签)模式管理和查询处理的逻辑抽象。通常将基于超级表创建的表称为该超级表的子表,并在系统内部建立逻辑关联。超级表与(基于其创建的)子表的关系体现在以下几个方面:
TDengine 建议用数据采集点的名字(如上表中的 D1001)来做表名。每个数据采集点可能同时采集多个物理量(如上表中的 curent,voltage,phase),每个物理量对应一张表中的一列,数据类型可以是整型、浮点型、字符串等。除此之外,表的第一列必须是时间戳,即数据类型为 timestamp。对采集的数据,TDengine 将自动按照时间戳建立索引,但对采集的物理量不建任何索引。数据用列式存储方式保存。
超级表的子表共享其数据模式和标签模式。因此,不能通过子表调整数据或标签的模式。对于超级表的数据模式修改立即对所有的子表生效
。
对于复杂的设备,比如汽车,它有多个数据采集点,那么就需要为一台汽车建立多张表
。
超级表自身不能存储任何数据或标签信息。因此,不能向一个超级表写入数据,只能将数据写入子表中。
### 超级表:同一类型数据采集点的集合
针对超级表的查询,将所有子表中的数据视为一个整体数据集进行处理。但是可以直接发起针对某个或若干个子表的查询,此时查询请求将该子表视为一个普通的表进行处理
。
由于一个数据采集点一张表,导致表的数量巨增,难以管理,而且应用经常需要做采集点之间的聚合操作,聚合的操作也变得复杂起来。为解决这个问题,TDengine 引入超级表(Super Table,简称为 STable)的概念
。
## 表
超级表是指某一特定类型的数据采集点的集合。同一类型的数据采集点,其表的结构是完全一样的,但每个表(数据采集点)的静态属性(标签)是不一样的。描述一个超级表(某一特定类型的数据采集点的集合),除需要定义采集量的表结构之外,还需要定义其标签的 schema,标签的数据类型可以是整数、浮点数、字符串,标签可以有多个,可以事后增加、删除或修改。如果整个系统有 N 个不同类型的数据采集点,就需要建立 N 个超级表。
一系列二维数组的集合,用来代表和储存数据对象之间的关系,由纵向的列和横向的行组成。TDengine中的表与普通数据库中的表没有差别。
在 TDengine 的设计里,
**表用来代表一个具体的数据采集点,超级表用来代表一组相同类型的数据采集点集合**
。当为某个具体数据采集点创建表时,用户使用超级表的定义做模板,同时指定该具体采集点(表)的标签值。与传统的关系型数据库相比,表(一个数据采集点)是带有静态标签的,而且这些标签可以事后增加、删除、修改。超级表与与基于超级表建立的子表之间的关系表现在:
但是,对于通过超级表创建的子表,还具有额外的标签数据信息。不能针对某个子表调整数据模式。每个子表具有与其关联的标签数据,并可按需调整内容。但是模式调整必须要通过超级表模式调整来完成。
1:一张超级表包含有多张子表,这些子表具有相同的采集量 schema,但带有不同的标签值。
2:不能通过子表调整数据或标签的模式,对于超级表的数据模式修改立即对所有的子表生效。
3:超级表只定义一个模板,自身不存储任何数据或标签信息。因此,不能向一个超级表写入数据,只能将数据写入子表中。
使用TDengine存储和管理物联网数据的时候,推荐使用一个子表存储一个数据采集点生成的数据,而使用超级表用来代表一组相同类型的数据采集点的集
合。
针对超级表的查询,TDengine将把所有子表中的数据视为一个整体数据集进行处理,会先把满足标签过滤条件的表从超级表中找出来,然后再扫描这些表的时序数据,进行聚合操作,这样需要扫描的数据集会大幅减少,从而显著提高查询的性能。本质上,TDengine通过对超级表查询的支持,实现了多个同类数据采集点的高效聚
合。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录