Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
9ace35a8
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
9ace35a8
编写于
4月 17, 2022
作者:
陶建辉(Jeff)
提交者:
GitHub
4月 17, 2022
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #11580 from taosdata/docs/jtao1735-doc2
Update 01-arch.md
上级
07a78a7c
500feceb
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
2 addition
and
148 deletion
+2
-148
docs-cn/13-tdinternal/01-arch.md
docs-cn/13-tdinternal/01-arch.md
+2
-148
未找到文件。
docs-cn/13-tdinternal/01-arch.md
浏览文件 @
9ace35a8
---
sidebar_label
:
数据模型和
整体架构
title
:
数据模型和
整体架构
sidebar_label
:
整体架构
title
:
整体架构
---
## 数据模型
### 物联网典型场景
在典型的物联网、车联网、运维监测场景中,往往有多种不同类型的数据采集设备,采集一个到多个不同的物理量。而同一种采集设备类型,往往又有多个具体的采集设备分布在不同的地点。大数据处理系统就是要将各种采集的数据汇总,然后进行计算和分析。对于同一类设备,其采集的数据都是很规则的。以智能电表为例,假设每个智能电表采集电流、电压、相位三个量,其采集的数据类似如下的表格:
<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.
数据极少有更新或删除操作;
3.
无需传统数据库的事务处理;
4.
相对互联网应用,写多读少;
5.
流量平稳,根据设备数量和采集频次,可以预测出来;
6.
用户关注的是一段时间的趋势,而不是某一特定时间点的值;
7.
数据有保留期限;
8.
数据的查询分析一定是基于时间段和空间区域;
9.
除存储、查询操作外,还需要各种统计和实时计算操作;
10.
数据量巨大,一天可能采集的数据就可以超过 100 亿条。
充分利用上述特征,TDengine 采取了经特殊优化的存储和计算设计来处理时序数据,它将系统处理能力显著提高,同时大幅降低了系统运维的复杂度。
### 关系型数据库模型
因为采集的数据一般是结构化数据,同时为降低学习门槛,TDengine 采用传统的关系型数据库模型管理数据。用户需要先创建库,然后创建表,之后才能插入或查询数据。TDengine 采用的是结构化存储,而不是 NoSQL 的 key-value 存储。
### 一个数据采集点一张表
为充分利用其数据的时序性和其他数据特点,TDengine 要求
**对每个数据采集点单独建表**
(比如有一千万个智能电表,就需创建一千万张表,上述表格中的 d1001,d1002,d1003,d1004 都需单独建表),用来存储这个采集点所采集的时序数据。这种设计有几大优点:
1.
能保证一个采集点的数据在存储介质上是以块为单位连续存储的。如果读取一个时间段的数据,它能大幅减少随机读取操作,成数量级的提升读取和查询速度。
2.
由于不同采集设备产生数据的过程完全独立,每个设备的数据源是唯一的,一张表也就只有一个写入者,这样就可采用无锁方式来写,写入速度就能大幅提升。
3.
对于一个数据采集点而言,其产生的数据是时序的,因此写的操作可用追加的方式实现,进一步大幅提高数据写入速度。
如果采用传统的方式,将多个设备的数据写入一张表,由于网络延时不可控,不同设备的数据到达服务器的时序是无法保证的,写入操作是要有锁保护的,而且一个设备的数据是难以保证连续存储在一起的。
**采用一个数据采集点一张表的方式,能最大程度的保证单个数据采集点的插入和查询的性能是最优的。**
TDengine 建议用数据采集点的名字(如上表中的 D1001)来做表名。每个数据采集点可能同时采集多个物理量(如上表中的 curent,voltage,phase),每个物理量对应一张表中的一列,数据类型可以是整型、浮点型、字符串等。除此之外,表的第一列必须是时间戳,即数据类型为 timestamp。对采集的数据,TDengine 将自动按照时间戳建立索引,但对采集的物理量不建任何索引。数据用列式存储方式保存。
### 超级表:同一类型数据采集点的集合
由于一个数据采集点一张表,导致表的数量巨增,难以管理,而且应用经常需要做采集点之间的聚合操作,聚合的操作也变得复杂起来。为解决这个问题,TDengine 引入超级表(Super Table,简称为 STable)的概念。
超级表是指某一特定类型的数据采集点的集合。同一类型的数据采集点,其表的结构是完全一样的,但每个表(数据采集点)的静态属性(标签)是不一样的。描述一个超级表(某一特定类型的数据采集点的集合),除需要定义采集量的表结构之外,还需要定义其标签的 schema,标签的数据类型可以是整数、浮点数、字符串,标签可以有多个,可以事后增加、删除或修改。如果整个系统有 N 个不同类型的数据采集点,就需要建立 N 个超级表。
在 TDengine 的设计里,
**表用来代表一个具体的数据采集点,超级表用来代表一组相同类型的数据采集点集合**
。当为某个具体数据采集点创建表时,用户使用超级表的定义做模板,同时指定该具体采集点(表)的标签值。与传统的关系型数据库相比,表(一个数据采集点)是带有静态标签的,而且这些标签可以事后增加、删除、修改。
**一张超级表包含有多张表,这些表具有相同的时序数据 schema,但带有不同的标签值**
。
当对多个具有相同数据类型的数据采集点进行聚合操作时,TDengine 会先把满足标签过滤条件的表从超级表中找出来,然后再扫描这些表的时序数据,进行聚合操作,这样需要扫描的数据集会大幅减少,从而显著提高聚合计算的性能。
## 集群与基本逻辑单元
TDengine 的设计是基于单个硬件、软件系统不可靠,基于任何单台计算机都无法提供足够计算能力和存储能力处理海量数据的假设进行设计的。因此 TDengine 从研发的第一天起,就按照分布式高可靠架构进行设计,是支持水平扩展的,这样任何单台或多台服务器发生硬件故障或软件错误都不影响系统的可用性和可靠性。同时,通过节点虚拟化并辅以自动化负载均衡技术,TDengine 能最高效率地利用异构集群中的计算和存储资源降低硬件投资。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录