add new document

This commit is contained in:
Jeff Tao 2020-07-31 08:16:39 +00:00
parent 7cf4430ae1
commit 1a2ba1e01b
5 changed files with 160 additions and 43 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View File

@ -1,33 +1,35 @@
#系统管理
# 系统管理
## 容量规划
一个系统的处理能力是有限的但通过对TDengine配置参数的调整可以做到资源的最佳配置
使用TDengine来搭建一个物联网大数据平台计算资源、存储资源需要根据业务场景进行规划。下面分别讨论系统运行所需要的内存、CPU以及硬盘空间
###内存需求
### 内存需求
每个Database可以创建固定数目的Vnode默认与CPU核数相同可通过maxVgroupsPerDb配置每个vnode会占用固定大小的内存大小与数据库的配置参数blocks和cache有关)每个Table会占用与Tag总大小有关的内存此外系统会有一些固定的内存开销。因此每个Database需要的系统内存可通过如下公式计算:
每个DB可以创建固定数目的vnode默认与CPU核数相同可通过maxVgroupsPerDb配置每个vnode会占用固定大小的内存大小与数据库的配置参数blocks和cache有关)每个Table会占用与Tag总大小有关的内存此外系统会有一些固定的内存开销。因此每个DB需要的系统内存可通过如下公式计算:
```
Memory Size = maxVgroupsPerDb * (blocks * cache + 10Mb) + numOfTables * (tagSizePerTable + 0.5Kb)
```
示例假设是4核机器cache是缺省大小16M, blocks是缺省值6假设有10万张表标签总长度是256字节则从的内存需求为4\*(16\*6+10) + 100000*(0.25+0.5)/1000 = 499M
示例假设是4核机器cache是缺省大小16M, blocks是缺省值6假设有10万张表标签总长度是256字节则总的内存需求为4\*(16\*6+10) + 100000*(0.25+0.5)/1000 = 499M。
实际运行的系统往往会根据数据特点的不同将数据存放在不同的DB里。因此做规划时也需要考虑。
如果内存充裕可以加大Blocks的配置这样更多数据将保存在内存里提高查询速度。
###CPU需求
### CPU需求
CPU的需求取决于如下两方面
- 数据插入TDengine单核每秒能至少处理一万个插入请求。每个插入请求可以带多条记录。条数越大插入效率越高。但对前端数据采集的要求越高因为需要缓存记录然后一批插入。
- 数据插入TDengine单核每秒能至少处理一万个插入请求。每个插入请求可以带多条记录一次插入一条记录与插入10条记录消耗的计算资源差别很小因此没次插入,条数越大,插入效率越高。如果一个插入请求带200条以上记录单核就能达到每秒插入100万条记录的速度。但对前端数据采集的要求越高,因为需要缓存记录,然后一批插入。
- 查询需求TDengine提供高效的查询但是每个场景的查询差异很大查询频次变化也很大难以给出客观数字。需要用户针对自己的场景写一些查询语句才能确定。
因此仅对数据插入而言CPU是可以估算出来的但查询所耗的计算资源无法估算。在实际运营过程中不建议CPU使用率超过50%,超过后,需要增加新的节点,以获得更多计算资源。
###存储需求
### 存储需求
TDengine相对于通用数据库有超高的压缩比在绝大多数场景下TDengine的压缩比不会低于5倍有的场合压缩比可达到10倍以上取决于数据特征。压缩前的原始数据大小可通过如下方式计算
TDengine相对于通用数据库有超高的压缩比在绝大多数场景下TDengine的压缩比不会低于5倍有的场合压缩比可达到10倍以上取决于实际场景的数据特征。压缩前的原始数据大小可通过如下方式计算:
```
Raw DataSize = numOfTables * rowSizePerTable * rowsPerTable
@ -39,6 +41,12 @@ Raw DataSize = numOfTables * rowSizePerTable * rowsPerTable
为提高速度,可以配置多快硬盘,这样可以并发写入或读取数据。
### 物理机或虚拟机台数
根据上面的内存、CPU、存储的预估就可以知道整个系统需要多少核、多少内存、多少存储空间。如果数据副本数不为1总需求量再乘以副本数。
根据总量,再根据单个物理机或虚拟机的资源,就可以轻松决定需要购置多少台机器了。
## 容错和灾备
### 容错
@ -47,15 +55,16 @@ TDengine支持**WAL**Write Ahead Log机制实现数据的容错能力
TDengine接收到应用的请求数据包时先将请求的原始数据包写入数据库日志文件等数据成功写入数据库数据文件后再删除相应的WAL。这样保证了TDengine能够在断电等因素导致的服务重启时从数据库日志文件中恢复数据避免数据的丢失。
涉及的系统配置参数有两个.
涉及的系统配置参数有两个
walLevelWAL级别0不写wal; 1写wal, 但不执行fsync; 2写wal, 而且执行fsync。
- walLevelWAL级别0不写wal; 1写wal, 但不执行fsync; 2写wal, 而且执行fsync。
- fsync当walLevel设置为2时执行fsync的周期。设置为0表示每次写入立即执行fsync。
fsync当walLevel设置为2时执行fsync的周期。设置为0表示每次写入立即执行fsync
如果要100%的保证数据不丢失需要将walLevel设置为2fsync设置为0。这时写入速度将会下降。但如果应用侧启动的写数据的线程数达到一定的数量(超过50)那么写入数据的性能也会很不错只会比fsync设置为3000毫秒下降30%左右
**灾备**
### 灾备
TDengine的集群通过多个副本的机制来提供系统的高可性,实现灾备能力。
TDengine的集群通过多个副本的机制来提供系统的高可性,实现灾备能力。
TDengine集群是由mnode负责管理的为保证mnode的高可靠可以配置多个mnode副本副本数由系统配置参数numOfMnodes决定为了支持高可靠需要设置大于1。为保证元数据的强一致性mnode副本之间通过同步方式进行数据复制保证了元数据的强一致性。
@ -63,33 +72,7 @@ TDengine集群中的时序数据的副本数是与数据库关联的一个集
TDengine集群的节点数必须大于等于副本数否则创建表时将报错。
当TDengine集群中的节点部署在不同的物理机上比如不同的机架、或不同的IDC并设置多个副本数时就实现了异地容灾从而提供系统的高可靠性无需再使用其他软件或工具。
## 文件目录结构
安装TDengine后默认会在操作系统中生成下列目录或文件
| 目录/文件 | 说明 |
| ---------------------- | :------------------------------------------------|
| /usr/local/taos/bin | TDengine可执行文件目录。其中的执行文件都会软链接到/usr/bin目录下。 |
| /usr/local/taos/connector | TDengine各种连接器目录。 |
| /usr/local/taos/driver | TDengine动态链接库目录。会软链接到/usr/lib目录下。 |
| /usr/local/taos/examples | TDengine各种语言应用示例目录。 |
| /usr/local/taos/include | TDengine对外提供的C语言接口的头文件。 |
| /etc/taos/taos.cfg | TDengine默认[配置文件] |
| /var/lib/taos | TDengine默认数据文件目录,可通过[配置文件]修改位置. |
| /var/log/taos | TDengine默认日志文件目录,可通过[配置文件]修改位置 |
**可执行文件**
TDengine的所有可执行文件默认存放在 _/usr/local/taos/bin_ 目录下。其中包括:
- _taosd_TDengine服务端可执行文件
- _taos_ TDengine Shell可执行文件
- _taosdump_:数据导入导出工具
- remove.sh卸载TDengine的脚本, 请谨慎执行,链接到/usr/bin目录下的rmtaos命令。会删除TDengine的安装目录/usr/local/taos但会保留/etc/taos、/var/lib/taos、/var/log/taos。
您可以通过修改系统配置文件taos.cfg来配置不同的数据目录和日志目录。
当TDengine集群中的节点部署在不同的物理机上并设置多个副本数时就实现了系统的高可靠性无需再使用其他软件或工具。TDengine企业版还可以将副本部署在不同机房从而实现异地容灾。
## 服务端配置
@ -97,8 +80,8 @@ TDengine系统后台服务由taosd提供可以在配置文件taos.cfg里修
下面仅仅列出一些重要的配置参数,更多的参数请看配置文件里的说明。各个参数的详细介绍及作用请看前述章节。**注意:配置修改后,需要重启*taosd*服务才能生效。**
- first: taosd启动时主动连接的集群中第一个dnode的end point, 缺省值为 localhost:6030。
- second: taosd启动时如果first连接不上尝试连接集群中第二个dnode的end point, 缺省值为空。
- firstEp: taosd启动时主动连接的集群中第一个dnode的end point, 缺省值为 localhost:6030。
- secondEp: taosd启动时如果first连接不上尝试连接集群中第二个dnode的end point, 缺省值为空。
- fqdn数据节点的FQDN。如果为空将自动获取操作系统配置的第一个, 缺省值为空。
- serverPorttaosd启动后对外服务的端口号默认值为6030。
- httpPort: RESTful服务使用的端口号所有的HTTP请求TCP都需要向该接口发起查询/写入请求。
@ -313,3 +296,31 @@ TDengine启动后会自动创建一个监测数据库SYS并自动将服务
这些监测信息的采集缺省是打开的但可以修改配置文件里的选项enableMonitor将其关闭或打开。
## 文件目录结构
安装TDengine后默认会在操作系统中生成下列目录或文件
| 目录/文件 | 说明 |
| ------------------------- | :----------------------------------------------------------- |
| /usr/local/taos/bin | TDengine可执行文件目录。其中的执行文件都会软链接到/usr/bin目录下。 |
| /usr/local/taos/connector | TDengine各种连接器目录。 |
| /usr/local/taos/driver | TDengine动态链接库目录。会软链接到/usr/lib目录下。 |
| /usr/local/taos/examples | TDengine各种语言应用示例目录。 |
| /usr/local/taos/include | TDengine对外提供的C语言接口的头文件。 |
| /etc/taos/taos.cfg | TDengine默认[配置文件] |
| /var/lib/taos | TDengine默认数据文件目录,可通过[配置文件]修改位置. |
| /var/log/taos | TDengine默认日志文件目录,可通过[配置文件]修改位置 |
**可执行文件**
TDengine的所有可执行文件默认存放在 _/usr/local/taos/bin_ 目录下。其中包括:
- _taosd_TDengine服务端可执行文件
- _taos_ TDengine Shell可执行文件
- _taosdump_:数据导入导出工具
- remove.sh卸载TDengine的脚本, 请谨慎执行,链接到/usr/bin目录下的rmtaos命令。会删除TDengine的安装目录/usr/local/taos但会保留/etc/taos、/var/lib/taos、/var/log/taos。
您可以通过修改系统配置文件taos.cfg来配置不同的数据目录和日志目录。

View File

@ -0,0 +1,106 @@
# TDengine 2.0 执行代码taosd的设计
逻辑上TDengine系统包含dnode, taosc和Appdnode是服务器侧执行代码taosd的一个运行实例因此taosd是TDengine的核心本文对taosd的设计做一简单的介绍模块内的实现细节请见其他文档。
## 系统模块图
taosd包含rpc, dnode, vnode, tsdb, query, cq, sync, wal, mnode, http, monitor等模块具体如下图
<center> <img src="../assets/modules.png"> </center>
taosd的启动入口是dnode模块dnode然后启动其他模块包括可选配置的http, monitor模块。taosc或dnode之间交互的消息都是通过rpc模块进行dnode模块根据接收到的消息类型将消息分发到vnode或mnode的消息队列或由dnode模块自己消费。dnode的工作线程(worker)消费消息队列里的消息交给mnode或vnode进行处理。下面对各个模块做简要说明。
## RPC模块
该模块负责taosd与taosc, 以及其他数据节点之间的通讯。TDengine没有采取标准的HTTP或gRPC等第三方工具而是实现了自己的通讯模块RPC。
考虑到物联网场景下数据写入的包一般不大因此除支持TCP链接之外RPC还支持UDP链接。当数据包小于15K时RPC将采用UDP方式进行链接否则将采用TCP链接。对于查询类的消息RPC不管包的大小总是采取TCP链接。对于UDP链接RPC实现了自己的超时、重传、顺序检查等机制以保证数据可靠传输。
RPC模块还提供数据压缩功能如果数据包的字节数超过系统配置参数compressMsgSize, RPC在传输中将自动压缩数据以节省带宽。
为保证数据的安全和数据的integrity, RPC模块采用MD5做数字签名对数据的真实性和完整性进行认证。
## DNODE模块
该模块是整个taosd的入口它具体负责如下任务
- 系统的初始化,包括
- 从文件taos.cfg读取系统配置参数从文件dnodeCfg.json读取数据节点的配置参数
- 启动RPC模块并建立起与taosc通讯的server链接与其他数据节点通讯的server链接
- 启动并初始化dnode的内部管理, 该模块将扫描该数据节点已有的vnode并打开它们
- 初始化可配置的模块如mnode, http, monitor等。
- 数据节点的管理,包括
- 定时的向mnode发送status消息报告自己的状态
- 根据mnode的指示创建、改变、删除vnode
- 根据mnode的指示修改自己的配置参数
- 消息的分发、消费,包括
- 为每一个vnode和mnode的创建并维护一个读队列、一个写队列
- 将从taosc或其他数据节点来的消息根据消息类型将其直接分发到不同的消息队列或由自己的管理模块直接消费
- 维护一个读的线程池消费读队列的消息交给vnode或mnode处理。为支持高并发一个读线程(Worker)可以消费多个队列的消息一个读队列可以由多个worker消费
- 维护一个写的线程池消费写队列的消息交给vnode或mnode处理。为保证写操作的序列化一个写队列只能由一个写线程负责但一个写线程可以负责多个写队列。
taosd的消息消费由dnode通过读写线程池进行控制是系统的中枢。该模块内的结构体图如下
<center> <img src="../assets/dnode.png"> </center>
## VNODE模块
vnode是一独立的数据存储查询逻辑单元但因为一个vnode只能容许一个DB因此vnode内部没有account, DB, user等概念。为实现更好的模块化、封装以及未来的扩展它有很多子模块包括负责存储的TSDB负责查询的Query, 负责数据复制的sync负责数据库日志的的wal, 负责连续查询的cq(continuous query), 负责事件触发的流计算的event等模块这些子模块只与vnode模块发生关系与其他模块没有任何调用关系。模块图如下
<center> <img src="../assets/vnode.png"> </center>
vnode模块向下与dnodeVReaddnodeVWrite发生互动向上与子模块发生互动。它主要的功能有
- 协调各个子模块的互动。各个子模块之间都不直接调用都需要通过vnode模块进行
- 对于来自taosc或mnode的写操作vnode模块将其分解为写日志(wal), 转发(sync), 本地存储(tsdb)子模块的操作;
- 对于查询操作分发到query模块进行。
一个数据节点里有多个vnode, 因此vnode模块是有多个运行实例的。每个运行实例是完全独立的。
vnode与其子模块是通过API直接调用而不是通过消息队列传递。而且各个子模块只与vnode模块有交互不与dnode, rpc等模块发生任何直接关联。
## MNODE模块
mnode是整个系统的大脑负责整个系统的资源调度负责meta data的管理与存储。
一个运行的系统里只有一个mnode但它有多个副本由系统配置参数numOfMpeers控制。这些副本分布在不同的dnode里目的是保证系统的高可靠运行。副本之间的数据复制是采用同步而非异步的方式以确保数据的一致性确保数据不会丢失。这些副本会自动选举一个Master其他副本是slave。所有数据更新类的操作都只能在master上进行而查询类的可以在slave节点上进行。代码实现上同步模块与vnode共享但mnode被分配一个特殊的vgroup ID: 1而且quorum大于1。整个集群系统是由多个dnode组成的运行的mnode的副本数不可能超过dnode的个数但不会超过配置的副本数。如果某个mnode副本宕机一段时间只要超过半数的mnode副本仍在运行运行的mnode会自动根据整个系统的资源情况在其他dnode里再启动一个mnode, 以保证运行的副本数。
各个dnode通过信息交换保存有mnode各个副本的End Point列表并向其中的master节点定时间隔由系统配置参数statusInterval控制发送status消息消息体里包含该dnode的CPU、内存、剩余存储空间、vnode个数以及各个vnode的状态(存储空间、原始数据大小、记录条数、角色等。这样mnode就了解整个系统的资源情况如果用户创建新的表就可以决定需要在哪个dnode创建如果增加或删除dnode, 或者监测到某dnode数据过热、或离线太长就可以决定需要挪动那些vnode以实现负载均衡。
mnode里还负责account, user, DB, stable, table, vgroup, dnode的创建、删除与更新。mnode不仅把这些entity的meta data保存在内存还做持久化存储。但为节省内存各个表的标签值不保存在mnode保存在vnode)而且子表不维护自己的schema, 而是与stable共享。为减小mnode的查询压力taosc会缓存table、stable的schema。对于查询类的操作各个slave mnode也可以提供以减轻master压力。
## TSDB模块
TSDB模块是VNODE中的负责快速高并发地存储和读取属于该VNODE的表的元数据及采集的时序数据的引擎。除此之外TSDB还提供了表结构的修改、表标签值的修改等功能。TSDB提供API供VNODE和Query等模块调用。TSDB中存储了两类数据1元数据信息2时序数据
### 元数据信息
TSDB中存储的元数据包含属于其所在的VNODE中表的类型schema的定义等。对于超级表和超级表下的子表而言又包含了tag的schema定义以及子表的tag值等。对于元数据信息而言TSDB就相当于一个全内存的KV型数据库属于该VNODE的表对象全部在内存中方便快速查询表的信息。除此之外TSDB还对其中的子表按照tag的第一列取值做了全内存的索引大大加快了对于标签的过滤查询。TSDB中的元数据的最新状态在落盘时会以追加append-only的形式写入到meta文件中。meta文件只进行追加操作即便是元数据的删除也会以一条记录的形式写入到文件末尾。TSDB也提供了对于元数据的修改操作如表schema的修改tag schema的修改以及tag值的修改等。
### 时序数据
每个TSDB在创建时都会事先分配一定量的内存缓冲区且内存缓冲区的大小可配可修改。表采集的时序数据在写入TSDB时首先以追加的方式写入到分配的内存缓冲区中同时建立基于时间戳的内存索引方便快速查询。当内存缓冲区的数据积累到一定的程度时达到内存缓冲区总大小的1/3则会触发落盘操作将缓冲区中的数据持久化到硬盘文件上。时序数据在内存缓冲区中是以行row的形式存储的。
而时序数据在写入到TSDB的数据文件时是以列column的形式存储的。TSDB中的数据文件包含多个数据文件组每个数据文件组中又包含.head、.data和.last三个文件v2f1801.head、v2f1801.data、v2f1801.last数据文件组。TSDB中的数据文件组是按照时间跨度进行分片的默认是10天一个文件组且可通过配置文件及建库选项进行配置。分片的数据文件组又按照编号递增排列方便快速定位某一时间段的时序数据高效定位数据文件组。时序数据在TSDB的数据文件中是以块的形式进行列式存储的每个块中只包含一张表的数据且数据在一个块中是按照时间顺序递增排列的。在一个数据文件组中.head文件负责存储数据块的索引及统计信息如每个块的位置压缩算法时间戳范围等。存储在.head文件中一张表的索引信息是按照数据块中存储的数据的时间递增排列的方便进行折半查找等工作。.head和.last文件是存储真实数据块的文件若数据块中的数据累计到一定程度则会写入.data文件中否则会写入.last文件中等待下次落盘时合并数据写入.data文件中从而大大减少文件中块的个数避免数据的过度碎片化。
## Query模块
该模块负责整体系统的查询处理。客户端调用该该模块进行SQL语法解析并将查询或写入请求发送到vnode同时负责针对超级表的查询进行二阶段的聚合操作。在Vnode端该模块调用TSDB模块读取系统中存储的数据进行查询处理。Query模块还定义了系统能够支持的全部查询函数查询函数的实现机制与查询框架无耦合可以在不修改查询流程的情况下动态增加查询函数。详细的设计请参见《TDengine 2.0查询模块设计》。
## SYNC模块
该模块实现数据的多副本复制包括vnode与mnode的数据复制支持异步和同步两种复制方式以满足meta data与时序数据不同复制的需求。因为它为mnode与vnode共享系统为mnode副本预留了一个特殊的vgroup ID:1。因此vnode的ID是从2开始的。
每个vnode/mnode模块实例会有一对应的sync模块实例他们是一一对应的。详细设计请见《TDengine 2.0 数据复制模块设计》
## WAL模块
该模块负责将新插入的数据写入write ahead log(WAL), 为vnode, mnode共享。以保证服务器crash或其他故障能从WAL中恢复数据。
每个vnode/mnode模块实例会有一对应的wal模块实例是完全一一对应的。WAL的落盘操作由两个参数walLevel, fsync控制。看具体场景如果要100%保证数据不会丢失需要将walLevel配置为2fsync设置为0每条数据插入请求都会实时落盘后才会给应用确认
## HTTP模块
该模块负责处理系统对外的RESTful接口可以通过配置由dnode启动或停止。
该模块将接收到的RESTful请求做了各种合法性检查后将其变成标准的SQL语句通过taosc的异步接口将请求发往整个系统中的任一dnode。收到处理后的结果后再翻译成HTTP协议返回给应用。
如果HTTP模块启动就意味着启动了一个taosc的实例。任一一个dnode都可以启动该模块以实现对RESTful请求的分布式处理。
## Monitor模块
该模块负责检测一个dnode的运行状态可以通过配置由dnode启动或停止。原则上每个dnode都应该启动一个monitor实例。
Monitor采集TDengine里的关键操作比如创建、删除、更新账号、表、库等而且周期性的收集CPU、内存、网络等资源的使用情况采集周期由系统配置参数monitorInterval控制。获得这些数据后monitor模块将采集的数据写入系统的日志库(DB名字由系统配置参数monitorDbName控制
Monitor模块使用taosc来将采集的数据写入系统因此每个monitor实例都有一个taosc运行实例。