时序数据库连载系列:当SQL遇到时序 TimescaleDB

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 1.概述 TimescaleDB是Timescale Inc.(成立于2015年)开发的一款号称兼容全SQL的 时序数据库 。它的本质是一个基于 PostgreSQL(以下简称 PG )的扩展( Extension ),主打的卖点如下: 全SQL支持 背靠PostgreSQL的高可靠性 时序数据的高写入性能 下文将对TimescaleDB这个产品进行解读。

1.概述

TimescaleDB是Timescale Inc.(成立于2015年)开发的一款号称兼容全SQL的 时序数据库 。它的本质是一个基于 PostgreSQL(以下简称 PG )的扩展( Extension ),主打的卖点如下:

  • 全SQL支持
  • 背靠PostgreSQL的高可靠性
  • 时序数据的高写入性能

下文将对TimescaleDB这个产品进行解读。如无特殊说明,这里所说的TimescaleDB均是指Github上开源的单机版TimescleDB的v1.1版本。

2.数据模型

由于TimescaleDB的根基还是PG,因此它的数据模型与NoSQL的时序数据库(如我们的阿里时序时空TSDB,InfluxDB等)截然不同。

在NoSQL的时序数据库中,数据模型通常如下所示,即一条数据中既包括了时间戳以及采集的数据,还包括设备的元数据(通常以 Tagset 体现)。数据模型如下所示:

influxdb_data_model.png

但是在TimescaleDB中,数据模型必须以一个二维表的形式呈现,这就需要用户结合自己使用时序数据的业务场景,自行设计定义二维表。

在TimescaleDB的官方文档中,对于如何设计时序数据的数据表,给出了两个范式:

  • Narrow Table
  • Wide Table

所谓的 Narrow Table 就是将metric分开记录,一行记录只包含一个 metricValue - timestamp 。举例如下:

metric名 属性1 属性2 属性3 metric名 时间戳
free_mem 设备1属性1值 设备1属性2值 设备3属性3值 xxxxxxx timestamp1
free_mem 设备2属性1值 设备2属性2值 设备2属性3值 xxxxxxx timestamp1
free_mem 设备3属性1值 设备3属性2值 设备3属性3值 xxxxxxx timestamp1
temperature 设备1属性1值 设备1属性2值 设备3属性3值 △△△△△△△ timestamp1
temperature 设备2属性1值 设备2属性2值 设备2属性3值 △△△△△△△ timestamp1
temperature 设备3属性1值 设备3属性2值 设备3属性3值 △△△△△△△ timestamp1

而所谓的 Wide Table 就是以时间戳为轴线,将同一设备的多个metric记录在同一行,至于设备一些属性(元数据)则只是作为记录的辅助数据,甚至可直接记录在别的表(之后需要时通过 JOIN 语句进行查询)

时间戳 属性1 属性2 属性3 metric名1 metric名2 metric名3
timestamp1 设备1属性1值 设备1属性2值 设备1属性3值 metric值1 metric值2 metric值3
timestamp2 设备2属性1值 设备2属性2值 设备2属性3值 metric值1 metric值2 metric值3

基本上可以认为: Narrow Table 对应的就是 单值模型 ,而Wide Table对应的就是 多值模型

由于采用的是传统数据库的关系表的模型,所以TimescaleDB的metric值必然是强类型的,它的类型可以是PostgreSQL中的 数值类型 , 字符串类型 等。

3.TimescaleDB的特性

TimescaleDB在PostgreSQL的基础之上做了一系列扩展,主要涵盖以下方面:

  1. 时序数据表的透明自动分区特性
  2. 提供了若干面向时序数据应用场景的特殊SQL接口
  3. 针对时序数据的写入和查询对PostgreSQL的 Planner 进行扩展
  4. 面向时序数据表的定制化并行查询

其中 3 和 4 都是在PostgreSQL的现有机制上进行的面向时序数据场景的微创新。因此下文将主要对上述的 1 和 2 稍加展开说明

透明自动分区特性

在时序数据的应用场景下,其记录数往往是非常庞大的,很容易就达到 数以billion计 。而对于PG来说,由于大量的还是使用B+tree索引,所以当数据量到达一定量级后其写入性能就会出现明显的下降(这通常是由于索引本身变得非常庞大且复杂)。这样的性能下降对于时序数据的应用场景而言是不能忍受的,而TimescaleDB最核心的 自动分区 特性需要解决就是这个问题。这个特性希望达到的目标如下:

  • 随着数据写入的不断增加,将时序数据表的数据分区存放,保证每一个分区的索引维持在一个较小规模,从而维持住写入性能
  • 基于时序数据的查询场景,自动分区时以时序数据的时间戳为分区键,从而确保查询时可以快速定位到所需的数据分区,保证查询性能
  • 分区过程对用户透明,从而达到Auto-Scalability的效果

TimescaleDB对于自动分区的实现,主要是基于PG的表继承机制进行的实现。TimescaleDB的自动分区机制概要可参见下图:

742b14cba02008d9f532eee41bc77f5e1b711449

在这个机制下, 用户创建了一张普通的时序表后,通过TimescaleDB的接口进行了hyper table注册后,后续的数据写入和查询操作事实上就由TimescaleDB接手了。上图中,用户创建的原始表一般被称为“主表”(main table), 而由TimescaleDB创建出的隐藏的子表一般被称为“chunk”

需要注意的是,chunk是伴随着数据写入而自动创建的,每次创建新的chunk时会计算这个chunk预计覆盖的时间戳范围(默认是 一周 )。且为了考虑到不同应用场景下,时序数据写入速度及密度都不相同,对于创建新分区时,新分区的时间戳范围会经过一个自适应算法进行计算,以便逐渐计算出某个应用场景下最适合的时间戳范围。与PG 10.0

自适应算法的详细实现位于TimescaleDB的chunk_adaptive.cts_calculate_chunk_interval(),其基本思路就是基于历史chunk的 时间戳填充因子 以及 文件尺寸填充因子 进行合理推算下一个chunk应该按什么时间戳范围来进行界定。

借助 透明化自动分区 的特性,根据官方的测试结果,在同样的数据量级下,TimescaleDB的写入性能与PG的 传统单表 写入场景相比,即使随着数量级的不断增大,性能也能维持在一个比较稳定的状态。

d966d27de546ae2eca98930cca17cd9dea8e980e

注: 上述Benchmark测试结果摘自Timescale官网

面向时序场景的定制功能

TimescaleDB的对外接口就是SQL,它100%地继承了PG所支持的全部SQL特性。除此之外,面向时序数据库的使用场景,它也定制了一些接口供用户在应用中使用,而这些接口都是通过 SQL函数(标准名称为 User-defined Function)予以呈现的。以下列举了一些这类接口的例子:

  • time_bucket()函数

    该函数用于 降采样 查询时使用,通过该函数指定一个时间间隔,从而将时序数据按指定的间隔降采样,并辅以所需的聚合函数从而实现降采样查询。一个示例语句如下:

    SELECT time_bucket('5 minutes', time)
      AS five_min, avg(cpu)
      FROM metrics
      GROUP BY five_min
      ORDER BY five_min DESC LIMIT 10;
    

    将数据点按5分钟为单位做降采样求均值


  • 新增的聚合函数

    为了提供对时序数据进行多样性地分析查询,TimescaleDB提供了下述新的聚合函数。

    • first() 求被聚合的一组数据中的第一个值
    • last() 求被聚合的一组数据中的最后一个值
    • histogram() 求被聚合的一组数据中值分布的直方图

    注: 新增的聚合函数在非时序场景也可以使用


  • drop_chunks()
    删除指定时间点之前/之后的数据chunk. 比如删除三个月时间前的所有chunk等等。这个接口可以用来类比 InfluxDB 的 Retention Policies 特性,但是目前TimescaleDB尚未实现自动执行的chunk删除。若需要完整的 Retention Policies 特性,需要使用系统级的定时任务(如 crontab)加上drop_chunks()语句来实现。

    drop_chunks()的示例语句如下。含义是删除conditions表中所有距今三个月之前以及四个月之后的数据分区:

    SELECT drop_chunks(older_than => interval '3 months', newer_than => interval '4 months', table_name => 'conditions');
    

除此之外,TimescaleDB定制的一些接口基本都是方便数据库管理员对元数据进行管理的相关接口,在此就不赘述。包括以上接口在内的定义和示例可参见官方的API文档

4.TimescaleDB的存储机制

TimescaleDB对PG的存储引擎未做任何变更,因此其索引数据和表数据的存储都是沿用的PG的存储。而且,TimescaleDB给chunk上索引时,都是使用的默认的B+tree索引,因此每一个chunk中数据的存储机制可以参见下图:

a1cb47fab01f62cde7a288142e26b75a5ae6211d

关于这套存储机制本身不用过多解释,毕竟TimescaleDB对其没有改动。不过考虑到时序数据库的使用场景,可以发现TimescaleDB的Chunk采用这套机制是比较合适的:

  • PG存储的特征是 只增不改 ,即无论是数据的插入还是变更。体现在Heap Tuple中都是Tuple的Append操作。因此这个存储引擎在用于OLTP场景下的普通数据表时,会存在表膨胀问题;而在时序数据的应用场景中,时序数据正常情况下不会被更新或删除,因此可以避免表膨胀问题(当然,由于时序数据本身写入量很大,所以也可以认为海量数据被写入的情况下单表实际上仍然出现了膨胀,但这不是此处讨论的问题)

  • 在原生的PG中,为了解决表膨胀问题,所以PG内存在 AUTOVACUUM 机制,即自动清理表中因更新/删除操作而产生的“Dead Tuple”,但是这将会引入一个新的问题,即AUTOVACUUM执行时会对表加共享锁从而对写入性能的影响。但是在时序数据的应用场景中,由于没有更新/删除的场景,也就不会存在“Dead Tuple“,因此这样的Chunk表就不会成为AUTOVACUUM的对象,因此INSERT性能便不会受到来自这方面的影响。

至于对海量数据插入后表和索引增大的问题,这正好通过上述的 自动分区 特性进行了规避。

此外,由于TimescaleDB完全基于PG的存储引擎,对于 WAL 也未做任何修改。因此TimescaleDB的高可用集群方案也可基于PG的流复制技术进行搭建。TimescaleDB官方也介绍了一些基于开源组件的HA方案

5.小结

综上所述,由于TimescaleDB完全基于PostgreSQL构建而成,因此它具有若干与生俱来的 优势 :

  • 100%继承PostgreSQL的生态。且由于完整支持SQL,对于未接触过时序数据的初学者反而更有吸引力
  • 由于PostgreSQL的品质值得信赖,因此TimescaleDB在质量和稳定性上拥有品牌优势
  • 强ACID支持

当然,它的 短板 也是显而易见的

  • 由于只是PostgreSQL的一个Extension,因此它不能从内核/存储层面针对时序数据库的使用场景进行极致优化。
  • 当前的产品架构来看仍然是一个单机库,不能发挥分布式技术的优势。而且数据虽然自动分区,但是由于时间戳决定分区,因此很容易形成I/O热点。
  • 在功能层面,面向时序数据库场景的特性还比较有限。目前更像是一个 传统OLTP数据库 + 部分时序特性 。

不管怎样,TimescaleDB也算是面向时序数据库从另一个角度发起的尝试。在当前时序数据库仍然处于新兴事物的阶段,它未来的发展方向也是值得我们关注并借鉴的。


阿里云时序时空数据库TSDB 1元购!立即体验:https://promotion.aliyun.com/ntms/act/tsdbtry.html?spm=5176.149792.775960.1.dd9e34e2zgsuEM&wh_ttid=pc

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
14天前
|
SQL 数据库 Python
数据库 SQL常用语句
这篇文章是数据库SQL的常用语句指南,涵盖了查询格式、WHERE子句查询条件、多表连接查询、嵌套查询、字符匹配查询以及其他指令如排序、聚集函数、GROUP BY分组、EXIST子查询和外连接等知识点。
|
11天前
|
存储 SQL 安全
【数据库高手的秘密武器:深度解析SQL视图与存储过程的魅力——封装复杂逻辑,实现代码高复用性的终极指南】
【8月更文挑战第31天】本文通过具体代码示例介绍 SQL 视图与存储过程的创建及应用优势。视图作为虚拟表,可简化复杂查询并提升代码可维护性;存储过程则预编译 SQL 语句,支持复杂逻辑与事务处理,增强代码复用性和安全性。通过创建视图 `high_earners` 和存储过程 `get_employee_details` 及 `update_salary` 的实例,展示了二者在实际项目中的强大功能。
10 1
|
8天前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
19 0
|
11天前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
27 0
|
11天前
|
SQL 数据处理 数据库
|
11天前
|
Java 数据库连接 数据库
告别繁琐 SQL!Hibernate 入门指南带你轻松玩转 ORM,解锁高效数据库操作新姿势
【8月更文挑战第31天】Hibernate 是一款流行的 Java 持久层框架,简化了对象关系映射(ORM)过程,使开发者能以面向对象的方式进行数据持久化操作而无需直接编写 SQL 语句。本文提供 Hibernate 入门指南,介绍核心概念及示例代码,涵盖依赖引入、配置文件设置、实体类定义、工具类构建及基本 CRUD 操作。通过学习,你将掌握使用 Hibernate 简化数据持久化的技巧,为实际项目应用打下基础。
30 0
|
11天前
|
SQL 存储 监控
|
11天前
|
API Java 数据库连接
从平凡到卓越:Hibernate Criteria API 让你的数据库查询瞬间高大上,彻底告别复杂SQL!
【8月更文挑战第31天】构建复杂查询是数据库应用开发中的常见需求。Hibernate 的 Criteria API 以其强大和灵活的特点,允许开发者以面向对象的方式构建查询逻辑,同时具备 SQL 的表达力。本文将介绍 Criteria API 的基本用法并通过示例展示其实际应用。此 API 通过 API 构建查询条件而非直接编写查询语句,提高了代码的可读性和安全性。无论是简单的条件过滤还是复杂的分页和连接查询,Criteria API 均能胜任,有助于提升开发效率和应用的健壮性。
20 0
|
11天前
|
JSON 数据格式 Java
化繁为简的魔法:Struts 2 与 JSON 联手打造超流畅数据交换体验,让应用飞起来!
【8月更文挑战第31天】在现代 Web 开发中,JSON 成为数据交换的主流格式,以其轻量、易读和易解析的特点受到青睐。Struts 2 内置对 JSON 的支持,结合 Jackson 库可便捷实现数据传输。本文通过具体示例展示了如何在 Struts 2 中进行 JSON 数据的序列化与反序列化,并结合 AJAX 技术提升 Web 应用的响应速度和用户体验。
29 0
|
11天前
|
Java 开发者 前端开发
Struts 2:如何在大型项目中力挽狂澜,成就企业级应用开发的巅峰之作!
【8月更文挑战第31天】在本案例研究中,我们探讨了Struts 2框架在国际贸易管理系统(ITMS)中的应用,展示了其在大型项目中的优势与实践经验。Struts 2凭借其强大的表单处理、灵活的Action配置、拦截器机制及国际化支持,成为构建可扩展、高性能Web应用的理想选择。文章详细介绍了RESTful URL设计、Ajax集成、文件上传与下载等功能实现,并分享了性能优化、安全措施及遇到的问题与解决方案,为开发者提供了宝贵的参考。通过持续集成与新技术的应用,我们不断优化系统,提升开发效率与竞争力。
22 0

相关产品

  • 云原生多模数据库 Lindorm