行业现状
时间序列数据库(TSDB)是近年来逐渐受到关注的数据库类型。随着物联网、金融、医疗等行业的发展,对时间序列数据的存储和查询需求日益增加。传统的关系型数据库在处理大量时间序列数据时,可能会面临性能瓶颈,而时间序列数据库则专门为此类数据设计,能够提供高效的存储和查询能力。
与传统数据库的区别/核心技术
- 数据模型:时间序列数据库通常使用时间作为主键,而传统数据库则可能使用其他字段作为主键。
- 存储优化:TSDB针对时间序列数据的特点进行了存储优化,例如数据压缩、分区等。
- 查询优化:TSDB提供了针对时间序列数据的查询语言和函数,如滑动窗口、聚合等。
技术原理
下面以 TDengine 的具体实现为例介绍一下 TSDB 的技术原理。
存储模型与数据分区、分片
存储模型
时间序列数据库如TDengine的存储模型分为三部分:
-
时序数据:这部分数据主要存放在vnode中,由data、head和last三个文件组成。数据量大,查询量取决于应用场景。它允许乱序写入,但不支持删除操作。通过采用一个采集点一张表的模型,一个时间段的数据是连续存储,从而确保了高效的插入和查询操作。
-
数据表元数据:这部分数据包括标签信息和Table Schema信息,存放在vnode的meta文件中。支持标签数据的索引,能够实现毫秒级的查询响应。
-
数据库元数据:这部分数据存放在mnode中,包括系统节点、用户、DB、STable Schema等信息。
与典型的NoSQL存储模型相比,时间序列数据库将标签数据与时序数据完全分离存储,这样可以降低标签数据存储的冗余度,并实现高效的多表之间的聚合查询。
数据分片
时间序列数据库通过vnode来实现数据分片,以及通过一个时间段一个数据文件来实现时序数据分区。vnode(虚拟数据节点)负责为采集的时序数据提供写入、查询和计算功能。对于单独一个数据采集点,无论其数据量多大,一个vnode有足够的计算资源和存储资源来处理。
数据分区
除了vnode分片之外,时间序列数据库还对时序数据按照时间段进行分区。每个数据文件只包含一个时间段的时序数据,时间段的长度由DB的配置参数duration决定。这种按时间段分区的方法还便于高效实现数据的保留策略。
负载均衡
每个dnode都定时向mnode报告其状态,基于整体状态,当mnode发现某个dnode负载过重,它会将dnode上的一个或多个vnode挪到其他dnode。
缓存与持久化
时间序列数据库采用时间驱动缓存管理策略,又称为写驱动的缓存管理机制。这种策略有别于读驱动的数据缓存模式。TDengine充分利用这一特性,将最近到达的(当前状态)数据保存在缓存中。
持久化存储方面,TDengine采用数据驱动的方式让缓存中的数据写入硬盘进行持久化存储。为充分利用时序数据特点,TDengine将一个vnode保存在持久化存储的数据切分成多个文件,每个文件只保存固定天数的数据。