时间序列数据库初识 | 青训营

164 阅读3分钟

行业现状

时间序列数据库(TSDB)是近年来逐渐受到关注的数据库类型。随着物联网、金融、医疗等行业的发展,对时间序列数据的存储和查询需求日益增加。传统的关系型数据库在处理大量时间序列数据时,可能会面临性能瓶颈,而时间序列数据库则专门为此类数据设计,能够提供高效的存储和查询能力。

与传统数据库的区别/核心技术

  • 数据模型:时间序列数据库通常使用时间作为主键,而传统数据库则可能使用其他字段作为主键。
  • 存储优化:TSDB针对时间序列数据的特点进行了存储优化,例如数据压缩、分区等。
  • 查询优化:TSDB提供了针对时间序列数据的查询语言和函数,如滑动窗口、聚合等。

技术原理

下面以 TDengine 的具体实现为例介绍一下 TSDB 的技术原理。

存储模型与数据分区、分片

存储模型

时间序列数据库如TDengine的存储模型分为三部分:

  1. 时序数据:这部分数据主要存放在vnode中,由data、head和last三个文件组成。数据量大,查询量取决于应用场景。它允许乱序写入,但不支持删除操作。通过采用一个采集点一张表的模型,一个时间段的数据是连续存储,从而确保了高效的插入和查询操作。

  2. 数据表元数据:这部分数据包括标签信息和Table Schema信息,存放在vnode的meta文件中。支持标签数据的索引,能够实现毫秒级的查询响应。

  3. 数据库元数据:这部分数据存放在mnode中,包括系统节点、用户、DB、STable Schema等信息。

与典型的NoSQL存储模型相比,时间序列数据库将标签数据与时序数据完全分离存储,这样可以降低标签数据存储的冗余度,并实现高效的多表之间的聚合查询。

数据分片

时间序列数据库通过vnode来实现数据分片,以及通过一个时间段一个数据文件来实现时序数据分区。vnode(虚拟数据节点)负责为采集的时序数据提供写入、查询和计算功能。对于单独一个数据采集点,无论其数据量多大,一个vnode有足够的计算资源和存储资源来处理。

数据分区

除了vnode分片之外,时间序列数据库还对时序数据按照时间段进行分区。每个数据文件只包含一个时间段的时序数据,时间段的长度由DB的配置参数duration决定。这种按时间段分区的方法还便于高效实现数据的保留策略。

负载均衡

每个dnode都定时向mnode报告其状态,基于整体状态,当mnode发现某个dnode负载过重,它会将dnode上的一个或多个vnode挪到其他dnode。

缓存与持久化

时间序列数据库采用时间驱动缓存管理策略,又称为写驱动的缓存管理机制。这种策略有别于读驱动的数据缓存模式。TDengine充分利用这一特性,将最近到达的(当前状态)数据保存在缓存中。

持久化存储方面,TDengine采用数据驱动的方式让缓存中的数据写入硬盘进行持久化存储。为充分利用时序数据特点,TDengine将一个vnode保存在持久化存储的数据切分成多个文件,每个文件只保存固定天数的数据。