初识时序数据库和TDengine

452 阅读6分钟

提到数据库,大家肯定都不陌生了。像Oracle、SQL Server、MySQL,大部分人应该都接触过。一般来说,我们聊数据库,聊的都是关系数据库。但是数据库是个很大的范畴,除了关系数据库,还有很多不同的类型,比如:

  • 文档数据库:如MongoDB、CouchDB等
  • 键值存储:如Redis、etcd、LevelDB、Memcached等
  • 搜索引擎数据库:最典型的如Elasticsearch,再如Splunk、Solr等
  • 时序数据库:如InfluxDB、OpenTSDB,还有国产的比较有影响力的TDengine
  • 图数据库:如Neo4j、GraphDB,还有国产的NebulaGraph

可谓种类繁多。世界知名的数据库排行网站DB-engines上收录了383个数据库管理系统,可以分成10多个类型。

2_round.png

图片来源:db-engines.com/en/ranking_…

数据库流行趋势

我们看看过去24个月的流行度趋势,时序数据库可谓是异军突起。

2.png

何谓时序数据库

关于时序数据库,我们先来看看维基百科上的定义:

A time series database (TSDB) is a software system that is optimized for storing and serving time series through associated pairs of time(s) and value(s).In some fields, time series may be called profiles, curves, traces or trends.Several early time series databases are associated with industrial applications which could efficiently store measured values from sensory equipment (also referred to as data historians), but now are used in support of a much wider range of applications.

In many cases, the repositories of time-series data will utilize compression algorithms to manage the data efficiently.

从中可以看出,时序数据库(TSDB)是会将值和时间戳关联起来,为存储和服务时间序列数据专门进行了优化。早期主要是工业类应用,保存传感器设备测量的数据。通常会利用压缩算法来高效管理数据。

初识TDengine

前面已经提到几款时序数据库,今天我们就要看看由国内的技术团队开源的TDengine。先扫了一眼其GitHub网站,几个数据是很亮眼的,比如有17.6k的star,4.2k的fork,issue上的各种讨论也比较活跃。

开发者也比较多,有160多人,不过看了下贡献记录,主力应该还是核心开发团队的人。不知道是不是和选择用C语言开发有关,数据库内核开发本身对编程技能要求比较高,而目前用C语言的人确实也相对较少了。不像一些Java开发的项目,动辄两三百人的贡献团队。

TDengine选择的是AGPL 3.0开源协议,这一点还比较友好,毕竟我们大多数情况下只是使用这个时序数据库,而不会修改或者直接利用其源代码,所以一般来说不用担心相关代码是否也必须开源的问题。

TDengine对自己的定位是“专为物联网、车联网、工业互联网、IT运维等设计和优化的大数据平台”。结合前面引用的时序数据库的定义,也不难理解,像物联网、车联网、工业互联网等,需要处理的就是典型的传感器类设备收集的时间序列数据,而IT运维,比如我们要监控CPU、内存、网络等各种状态,需要处理的就是各种软件代理收集的时间序列数据。从这一点来看,TDengine的适用场景还是挺广泛的,不管是传统企业还是现在比较热的互联网企业,需要处理时序数据的话都可以试试。

从TDengine官网发布的一些用户案例来看,也很有代表性,比如顺丰科技的场景是大数据监控平台,浙商银行的场景是微服务调用的监控,而像理想汽车和领跑汽车,则是比较典型的车联网场景。智能汽车也是近年来非常热门的方向,时序数据库在这个领域也大有可为。

时序数据库领域,目前排名比较领先的是InfluxData开发的InfluxDB,国内外很多用户在用。企业版本才提供集群功能。所以有意思的是,很多用户在使用的时候,可能因为预算不足等原因,不少选择了用高性能单机来跑InfluxDB,或者干脆自研集群功能。而TDengine直接开源了集群功能,竞争的意味不言而喻了。

TDengine的核心设计特色

时序数据库和我们熟悉的MySQL、Oracle等传统关系型数据库还是很不一样的,比如不支持事务,有限支持删除和更新等操作。看过很多讨论,不熟悉的人认为这是设计缺陷,很不方便,而从很多设计资料来看,这反而是设计者有意的选择,这是从时序数据的特点出发的。时序数据大多是采集类的数据,传感器或者软件代理负责收集,然后写入数据库,不像商品价格之类的数据,需要经常修改。有限支持修改功能,可以保证读写的性能。删除也有点类似,一般监控类数据,会有个保存期限,比如半年或者几个月,到期自动删除就好了,很少有人为需求说,我就要删除两天前的某条数据。

TDengine最核心的特色,应该是其数据模型,“一个数据采集点一张表”和“超级表”。

文档中说:

如果采用传统的方式,将多个设备的数据写入一张表,由于网络延时不可控,不同设备的数据到达服务器的时序是无法保证的,写入操作是要有锁保护的,而且一个设备的数据是难以保证连续存储在一起的。采用一个数据采集点一张表的方式,能最大程度的保证单个数据采集点的插入和查询的性能是最优的。

由于一个数据采集点一张表,导致表的数量巨增,难以管理,而且应用经常需要做采集点之间的聚合操作,聚合的操作也变得复杂起来。为解决这个问题,TDengine 引入超级表(Super Table,简称为 STable)的概念。

超级表是指某一特定类型的数据采集点的集合。

没有传统关系型数据库的事务概念,再加上这种模型设计,读写性能高这一点就很容易定性理解了。

TDengine的架构也非常清晰,在设计时就考虑到了节点虚拟化和自动负载均衡。因为代码是开源的,我们也可以结合代码来理解文档中提到的各种核心设计,这就是开源的魅力吧。

3.png

作者:Mikey