关于TDengine数据平台的那些事儿

2022-03-22 00:00:00 数据 代码 时序 时间 复制

这里给大家介绍一款名叫TDengine的大数据平台,该数据平台是涛思数据专为物联网、车联网、工业互联网、IT运维等设计和优化的一个较为成熟的平台。在拥有快十倍以上的时序数据库功能外,它还拥有提供缓存、数据、

至于为什么会结识这个平台呢,主要是在很多车联网以及风电数据的处理上给很多企业带来了很不错的体验,我在这里也决定尝试一波。

至于这个平台的优势,我们在它的文档中可以看到:

  • 10 倍以上性能提升。
  • 硬件或云服务成本降至1/5。
  • 全栈时序数据处理引擎。
  • 强大的分析功能。
  • 与第三方工具无缝连接。
  • 零运维成本、零学习成本。

一、开发实践

至于实践,小编这里以Ubuntu20.04来进行开发。 首先我们打开Ubuntu安装所需要的工具,输入如下命令:

sudo apt-get install -y gcc cmake build-essential git
复制代码

接下来安装 OpenJDK 8,命令如下:

sudo apt-get install -y openjdk-8-jdk
复制代码

然后安装 Apache Maven,命令如下:

sudo apt-get install -y  maven
复制代码

然后从Github上获取源码,命令如下:

git clone https://github.com/taosdata/TDengine.git
复制代码

然后使用 cd TDengine 打开TDengine:

构建 TDengine

在Linux系统下,我们得先进入root用户,因为在构建使用到的命令需要root权限,在终端输入 su 再输入密码后进入root账户,再输入如下命令进行构建:

mkdir debug && cd debugcmake .. && cmake --build .
复制代码

在构建完成后,我们再来使用命令进行安装:

sudo make install
复制代码

安装成功后,在终端中启动 TDengine 服务:

sudo systemctl start taosd
复制代码

用户可以使用 TDengine Shell 来连接 TDengine 服务,在终端中,输入:

taos
复制代码

如果 TDengine Shell 连接服务成功,将会打印出欢迎消息和版本信息。如果失败,则会打印出错误消息。

在简单的安装以及使用过程中,个人觉得在版本的迭代升级中,一些的插件包的升级以及版本号还是挺不错的。

当然,如果你觉得自己下载编译源代码是个很繁琐的过程,那么你也可以直接下载安装包进行体验: www.taosdata.com/cn/all-down…

二、操作实践

在下载完成后,我们便来进行体验,在不使用任何参数的情况下,来对taosdemo进行写入测试,在命令框中输入taosdemo命令,输出如下:

$ taosdemotaosdemo is simulating data generated by power equipment monitoring...host:                       196.168.0.169:6030user:                       rootpassword:                   taosdataconfigDir:resultFile:                 ./output.txtthread num of insert data:  8thread num of create table: 8top insert interval:        0number of records per req:  30000max sql length:             1048576database count:             1database[0]:  database[0] name:      test  drop:                  yes  replica:               1  precision:             ms  super table count:     1  super table[0]:      stbName:           meters      autoCreateTable:   no      childTblExists:    no      childTblCount:     10000      childTblPrefix:    d      dataSource:        rand      iface:             taosc      insertRows:        10000      interlaceRows:     0      disorderRange:     1000      disorderRatio:     0      maxSqlLen:         1048576      timeStampStep:     1      startTimestamp:    2022-01-14 10:40:00.000      sampleFormat:      sampleFile:      tagsFile:      columnCount:       3column[0]:FLOAT column[1]:INT column[2]:FLOAT      tagCount:            2        tag[0]:INT tag[1]:BINARY(16)         Press enter key to continue or Ctrl-C to stop
复制代码

上面显示的是taosdemo进行数据写入的各项参数。即模拟生成一个电力行业的场景数据,建立一个名为test的数据库,并创建一个名为 meters 的超级表,超级表的结构为:

taos> describe test.meters;             Field              |         Type         |   Length    |   Note   |================================================================================= ts                             | TIMESTAMP            |           8 |          | current                        | FLOAT                |           4 |          | voltage                        | INT                  |           4 |          | phase                          | FLOAT                |           4 |          | groupid                        | INT                  |           4 | TAG      | location                       | BINARY               |          64 | TAG      |Query OK, 6 row(s) in set (0.002972s)taos> describe test.meters;             Field              |         Type         |   Length    |   Note   |================================================================================= ts                             | TIMESTAMP            |           8 |          | current                        | FLOAT                |           4 |          | voltage                        | INT                  |           4 |          | phase                          | FLOAT                |           4 |          | groupid                        | INT                  |           4 | TAG      | location                       | BINARY               |          64 | TAG      |Query OK, 6 row(s) in set (0.002972s)
复制代码

按回车键后 taosdemo 将建立数据库 test 和超级表 meters,并按照 TDengine 数据建模的佳实践,以 meters 超级表为模板生成一万个子表,代表一万个独立上报数据的电表设备。

taos> use test;Database changed.taos> show stables;              name              |      created_time       | columns |  tags  |   tables    |============================================================================================ meters                         | 2021-08-27 11:21:01.209 |       4 |      2 |       10000 |Query OK, 1 row(s) in set (0.001740s)
复制代码

然后 taosdemo 为每个电表设备模拟生成一万条记录:

...====thread[3] completed total inserted rows: 6250000, total affected rows: 6250000. 347626.22 records/second====[1]:====thread[1] completed total inserted rows: 6250000, total affected rows: 6250000. 347481.98 records/second====[4]:====thread[4] completed total inserted rows: 6250000, total affected rows: 6250000. 347149.44 records/second====[8]:====thread[8] completed total inserted rows: 6250000, total affected rows: 6250000. 347082.43 records/second====[6]:99%[6]:====thread[6] completed total inserted rows: 6250000, total affected rows: 6250000. 345586.35 records/second====Spent 18.0863 seconds to insert rows: 100000000, affected rows: 100000000 with 16 thread(s) into test.meters. 5529049.90 records/secondinsert delay, avg:      28.64ms, max:     112.92ms, min:       9.35ms
复制代码

以上信息是在一台具备 8 个 CPU 64G 内存的普通 PC 服务器上进行实测的结果。数据显示 taosdemo 用了 18 秒的时间插入了 100000000 (不用数了,一亿条)记录,平均每秒钟插入 552 万 9 千零 49 条记录。

在经过一些测试后,总的来说,TDengine作为物联网、车联网、工业互联网、IT运维等场景设计和优化的大数据平台,由于在数据库内核中创新的数据存储和查询引擎设计,其展现出了远超同类产品的高效性能。

三、注意事项

后在使用的过程中,小编这里给大家简单的简述一下一些需要注意的地方。

我想大家应该都注意到它的主打是时序数据库,那么我们来讲讲TDengine如何从时间维度去对数据进行管理。

首先,先看看官网的相关描述:

TDengine除vnode分片之外,还对时序数据按照时间段进行分区。每个数据文件只包含一个时间段的时序数据,时间段的长度由DB的配置参数days决定。这种按时间段分区的方法还便于高效实现数据的保留策略,只要数据文件超过规定的天数(系统配置参数keep),将被自动删除。而且不同的时间段可以存放于不同的路径和存储介质,以便于大数据的冷热管理,实现多级存储。

可以看出,时序数据的保留策略是由keep和days这两个参数牢牢把控的。但是,如果我们想更加深入地理解TDengine时序数据的存储逻辑,从而优化性能的话,只知道上面这些是不够的。

官方文档关于keep和days的描述是这样的:

keep:数据库中数据保留的天数,单位为天,默认值:3650
days:一个数据文件存储数据的时间跨度,单位为天,默认值:10

TDengine通过keep和days严格控制插入数据的时间戳范围:对于过去的数据,不可以超出当前时间减去keep的时间戳值;对于未来的数据,不可以超出当前时间加上days的时间戳值。

可以看出,时序数据的保留策略是由keep和days这两个参数牢牢把控的。但是,如果我们想更加深入地理解TDengine时序数据的存储逻辑,从而优化性能的话,只知道上面这些是不够的。

官方文档关于keep和days的描述是这样的:

keep:数据库中数据保留的天数,单位为天,默认值:3650
days:一个数据文件存储数据的时间跨度,单位为天,默认值:10

TDengine通过keep和days严格控制插入数据的时间戳范围:对于过去的数据,不可以超出当前时间减去keep的时间戳值;对于未来的数据,不可以超出当前时间加上days的时间戳值。

我们假设某数据库的keep参数为7,days参数为3,当前时间为某月9日的0点0分。

由于keep为7,所以2日(9-7)之前的数据一定是不可以写入的。再加上限制未来时间数据的插入,12日(9+3)之后的数据也是不可以插入的。通过这样的方式,就有了TDengine当前可处理数据的时间范围time range(彩色范围),当你试图写入位于灰色时间区域的数据时——就会看到“timestamp out of time range”的提示了。

这组图代表了随着当前时间轴的移动,数据文件的分布情况和可写入数据范围的变化。

随着时间的推移,数据的时间戳会与系统时间做计算,一旦超过keep天数,就会被识别为过期数据,等到这个数据文件内的所有数据都过期后,这个数据文件才会被从计算机上清除。

以上述组图为例,由于2日和4日的数据是在同一个数据文件(Data File 1)中,4日的数据多可以保留到11日结束,所以2日的数据同样也要保留到11日结束。所以我们可以看到,12日的时候,Data File 1已经被删除掉了。

虽然在物理层面上,数据仍然是以数据文件为单位删除的。但是除了对存储空间有极其精细要求的用户,绝大多数用户都是没有感知的。本次优化过后,用户不再需要为删除粒度的粗细而产生顾虑。只要安心根据自己的业务类型,灵活设置days参数的大小以找到性能优的状况就好了。

此外,由于给定了可写入数据的时间范围(now-keep到now+days),给定了数据切分的时间范围(days),所以只要vnode目录下面的数据文件组数量小于等于keep/days向上取余+1,就可以认为自动删除机制是在正常工作的。

以上也我个人对于TDengine数据平台的一些大致了解以及分析,其中还有很多不足的地方希望大家能给与改正。

相关文章