06.时序数据库

时序数据库

什么是时间序列数据库,最简单的定义就是数据格式里包含 Timestamp 字段的数据,比如某一时间环境的温度,CPU 的使用率等。维基百科对于时序数据库的定义如下:

A time series database (TSDB) is a software system that is optimized for handling time series data, arrays of numbers indexed by time (a datetime or a datetime range).

时间序列数据的更重要的一个属性是如何去查询它,包括数据的过滤,计算等等。一般时间序列数据都具备如下两个特点:

  • 数据结构简单,所谓的结构简单,可以理解为某一度量指标在某一时间点只会有一个值,没有复杂的结构(嵌套、层次等)和关系(关联、主外键等)。

  • 数据量大,数据量大则是另一个重要特点,这是由于时间序列数据由所监控的大量数据源来产生、收集和发送,比如主机、物联网设备、终端或 App 等。

背景特性

可以把它拆解成 3 个方面来看:时序特性,数据特性,数据库特性。

时序特性

  • 时间戳:通用的业务场景内以秒和毫秒精度为主,在一些遥感等高频采集领域,时间戳可以达到纳秒级别。时间戳种类包括 unix 系统时间戳和 Calendar, 并且支持时区的自动适配。

  • 采样频率:采集频率一般有 2 种,一种是周期性的时间采样频率,比如服务器性能相关的定期汇总指标。另外一种是离散型的采样,比如网站的访问等等

数据特性

  • 数据顺序追加

  • 数据可多维关联

  • 通常高频访问热数据

  • 冷数据需要降维归档

  • 数据主要覆盖数值,状态,事件

数据库特性

  • 写入速率稳定并且远远大于读取

  • 按照时间窗口访问数据

  • 极少更新,存在一定窗口期的覆盖写

  • 批量删除

  • 具备通用数据库要求的高可用,高可靠,可伸缩特性

  • 通常不需要具备事务的能力

发展简史

  • 第一代时序数据存储系统 虽然通用关系数据库可以存储时序数据,但是由于缺乏针对时间的特殊优化,比如按时间间隔存储和检索数据等等,因此在处理这些数据时效率相对不高。第一代时序数据典型来源于监控领域,直接基于平板文件的简单存储工具成为这类数据的首先存储方式。以 RRDTool,Wishper 为代表,通常这类系统处理的数据模型比较单一,单机容量受限,并且内嵌于监控告警方案。

  • 基于通用存储的时序数据库 伴随着大数据和 Hadoop 的发展,时序数据量开始迅速增长,系统业务对于处理时序数据的扩展性等方面提出更多的要求。基于通用存储而专门构建的时间序列数据库开始出现,它可以按时间间隔高效地存储和处理这些数据。像 OpenTSDB,KairosDB 等等。这类时序数据库在继承通用存储优势的基础上,利用时序的特性规避部分通用存储的劣势,并且在数据模型,聚合分析方面做了贴合时序的大量创新。比如 OpenTSDB 继承了 HBase 的宽表属性结合时序设计了偏移量的存储模型,利用 salt 缓解热点问题等等。然而它也有诸多不足之处,比如低效的全局 UID 机制,聚合数据的加载不可控,无法处理高基数标签查询等等。

  • 垂直型时序数据库的出现 随着 docker,kubernetes, 微服务等技术的发展,以及对于 IoT 的发展预期越来越强烈。在数据随着时间而增长的过程中,时间序列数据成为增长最快的数据类型之一。高性能,低成本的垂直型时序数据库开始诞生,以 InfluxDB 为代表的具有时序特征的数据存储引擎逐步引领市场。它们通常具备更加高级的数据处理能力,高效的压缩算法和符合时序特征的存储引擎。比如 InfluxDB 的基于时间的 TSMT 存储,Gorilla 压缩,面向时序的窗口计算函数 p99,rate,自动 rollup 等等。同时由于索引分离的架构,在膨胀型时间线,乱序等场景下依然面临着很大的挑战。