TDEngine学习笔记

前言

对于TDEngine从2019年4月,团队就在开始研究,场景是需要获取大量的交易所数据,但是之前使用的influxdb和elasticsearch在同时并发写入大量的ohlcv数据的时候,卡死了,我们一直在寻找好的存储引擎来替代这个大量并发写入和能够进行实时计算的解决方案。 正好这时候TDEngine开源并且发布了1.6x版本,看解决场景中,也有部分金融场景,所以本次我特别针对金融场景下TDEngine的使用,进行了记录,虽然TDengine主要是用在IoT方向上,但是我感觉金融方向更需要一个强大的时序数据库来解决存储和计算的问题。

作为深入学习TDEngine的过程,本次,从白皮书,到代码,到编译安装以及到实战场景下,来对TDEngine进行深入的了解和试用。

读文档

大数据场景主要问题及解决方案

大数据时代的挑战,源源不断的产生海量的实时数据发往云端。 这些数据是企业的宝贵财富,帮助企业实时监控业务或设备运行情况,生成各种报表,通过大数据分析和机器学习,对业务进行预测和预警,帮助企业进行科学决策,节约成本并创造新的价值。

不管是IoT还是金融交易系统,所产生的数据都是时序的,很多带有位置信息。 有明显的特征如下:

  1. 数据是时序的,一定带有时间戳

  2. 数据是结构化的

  3. 数据极少的更新或删除

  4. 无需传统的数据库的事务处理

  5. 互联网应用写多读少

  6. 用户公主一段时间的趋势,而不是某一特定时间点的值

  7. 数据是有保存期限的

  8. 数据查询分析一定是基于时间段和位置区域的。

  9. 存储查询外,还需要各种统计和实时计算

  10. 数据量大,每天采集超过100亿条。

TDEngine解决的问题:

  1. 10X以上的性能提升: 定义创新数据存储,单核每秒就处理2万次请求,插入数百万个数据点,读一千万以上数据点,是现有通用数据库的10倍以上。
  2. 硬件或云服务成本降低1/5: 不到通用大数据存储方案的1/5,通过列式存储和先进的压缩算法,存储空间不到通用数据库的1/10.
  3. 全栈时序数据处理引擎: 将数据库,消息队列,缓存和流式计算等功能融合,降低开发和维护成本。
  4. 强大的分析功能: 时间范围查询,数据在时间轴和多个维度进行聚合,通过多客户端查询。 并于第三方工具无缝集成。
  5. 零运维成本,零学习成本: 安装集群,快速搞定,无需分库分表,实时备份。 标准SQL,支持多客户端,类似MYSQL,零学习成本。

对于传统的网络爬虫,微博,微信,电商,DRP,CRM等通用类型数据,不适合用TDEngine来存储。

数据模型

采用关系数据库模型,通过创建多个库表。 但是有显著不同点。

一个数据采集点一张表: 这里对应到金融上,比如一个SYMBOL,1M 的K线数据,一, 能够保证存储介质上是一块一块连续的。 读取的时候大幅减少随机操作,提高查询速度。二,不同的维度数据产生过程完全独立,数据源唯一, 一张表只有一个写入者,采用无锁方式,大幅提升写入速度。 三,对于时序数据,写的操作可用追加的方式实现,提高写入速度和查询速度。

超级表:(STable)业务需要不同的维度之间聚合操作,聚合的操作也变得复杂,使用超级表,将特定类型的数据集合,同一个维度,结构是一样的,但是每个维度名字和静态属性(标签)是不一样的。 超级表用来代表一组相同类型的数据采集点, 表带有静态标签。

存储结构

在内存,使用SkipList建立索引,按照First In First Out的方式进行管理,在存储时,使用列式存储,提高压缩率和数据读取速度,并且每个数据块都有预计算,提高数据分析速度。

数据写入WAL日志,同时回维护表索引,保证数据块在文件中的偏移量,起始时间,数据点数,压缩算法等。

通过数据分区,将新旧数据分开存放,减少一盘随机读取,也能够在廉价的存储设备上有超强性能。

一个表数据会按照时间段分区,不会跨节点存储,以便于单张表快速高效的插入,查询和计算。 一个节点,一秒产生100字节数据,一年才3G,压缩之后是300M,处理问题不大。

分布式存储

按照分布式高可靠架构进行设计的,是完全去中心化的。

<插入图集群>

数据节点 dnode: 是运行实例,一个工作系统必须至少有一个数据节点,dnode包含0 to N个 vnode 虚拟节点, 0 to n个 mnode 管理节点。

虚拟节点的数据以异步复制的方式进行实时同步,并实现数据最终一致性,保证在堕胎物理机上有copy,保证系统高可靠性。

mnnode 存储节点运行状态及节点负载均衡以及所有的Meta data等信息, 容许多到5个多mnode来管理,无需人工干预。

TAOSC

负责处理应用与集群的接口交互,内嵌于JDBC,C,PYTHON,GO等连接库中,模块负责缓存元数据,插入和查询正确节点,把结果返回时,需要负责最后一级的聚合,排序,过滤等操作。

数据分片,水平扩展

整个系统水平扩展,手动添加和移除节点,需要人工干预,其他的系统自动完成,使用vnode设计,可以更好的支持硬件异构环境,恢复节点,裁撤节点和新增节点都可以快速迁移。

高可靠性

多个虚拟数据节点组成,Replication Factor > 2, vnode之间通过心跳包来通知对方状态,通过连接器去获取 fqdn,保证连接的可靠。 采用Master-Slave异步复制的方式实现多个副本之间的实时数据同步,采取的是最终一致性,而不是强一致性。 当一台主机重启时,版本低的节点停止对外服务,同时进行同步流程。 同步复制的模式实现虚拟管理节点的数据同步,写的操作,只有Slave节点写入成功后,master节点才会返回成功。 Meta数据基本完全保存在哪吃,提高查询效率。 同时也会缓存在本地,

高效的多表聚合

先创建超级表,在以超级表为模版,创建具体表,

1
create table m1 (ts timestamp, pressure int, rpm int) tags (model binary(8), color binary(8))

创建了STable M1 带有标签model和标签color, 在创建具体表t1.

1
create table t1 using m1 tags('apple', 'red')

插入数据时支持多插入,查询时候,可以基于标签对STable进行聚合查询或者统计

1
select avg(pressure) from m1 where model='apple' interval(5m) group by color

实现流程:

App –> taosc –> mnode –> dnode0, dnode1, dnoden —> app

先在内存中扫描数据,之后在存储中聚合数据。 最后返回给应用。

实时流式计算

a v g, dev, count, first, last, least squares , max, min, percentile, sum, diff, div, scale , +-*/

1
create table d1 as select avg(presure) from t1 interval(60s) sliding(10s)

更多亮点

数据订阅,本身是一个消息队列中间件。 异步插入API,大幅度提高性能。

参数指标

数据类型: tinyint, smallint, int ,bigint, float, double,binary, nchar, bool

单记录最大长度,16K字节, 最大记录条数,仅受存储空间限制,最大表个数,仅受节点个数限制, 最大数据备份数5,单点插入速度 2万/s(单核),节点查询速度: 2000万/s (全内存情况)

应用场景

作为一个基础性软件,典型场景如下:

设备监控, 电力行业,出行行业,通讯行业,金融行业(交易记录,存取记录,ATM,POS机监测),交通行业,石油石化,互联网, 物流行业,环境监测,军工行业,制造页, 公共安全等。

安装使用

了解了原理和应用,接下来到安装和具体使用的环节。

坚持原创技术分享,您的支持将鼓励xinqiyang继续创作!