在介绍时序数据库之前,我们先来看看什么是时序数据。时序数据就是基于时间排序的数据,再通过时间坐标将这些数据连接起来,形成一个折线图,直观地展示一个指标在过去一段时间内的走势和规律,帮助定位数据异常点。
时序数据库就是用来存储这些时序数据的数据库。与传统数据库相比,时序数据库需要能够长时间保存数据,且需要实时展示,这就要求时序数据库能做到持久化存储,以及数据读写的高性能。此外,对于一些复杂的场景,比如广告业务的多维度多指标,时序数据库还需要做到多维查询、指标聚合等。
一、时序数据库的特点
- 数据写入
- 数据实时写入。
- 高并发写入。
- 无须更新或删除操作(除了修复数据)。
- 连续性:时序数据会按照指定的时间粒度持续写入。
- 数据读取
- 写多读少:时序数据的写入是持续的,但是一般并不会持续地读取数据,只有在需要的时候才会查询最近一段时间内的指定维度指标。
- 多时间粒度读取:一般来说,我们会对最近7天的数据以一个比较细的时间粒度来存储一个相对精确的值,而对于7天或者一个月以前的数据,通常会把它们聚合成一个比较粗的时间粒度存储,比如按照小时或者天来存储,以便节省磁盘空间,提高读取历史数据的效率。
- 指定维度读取:在广告业务中,时序数据存储的维度可能有成百上千个,那么在读取数据时不会把所有的维度都读取出来,因为这样做不仅没必要,而且对系统的I/O也是一个极大的考验。所以,只会选择读取所需要的维度和指标。
- 实时聚合:通常实时的时序数据存储的是不同维度下的一个比较细的时间粒度数据,查询时需要在不同维度下对一个或多个指标进行各种聚合的操作,如 sum、max、avg等。
- 数据存储
- 按列存储:通过数据的查询特征,可以发现时序数据更适合将一个指标放在一起存储,任何列都能被作为索引。在读取数据时,只会读取所需要的维度所在的列,这样就可以大大减小I/O的损耗和内存的使用,提高执行效率。
- 以不同的时间粒度存储:数据的读取特征决定了可以将历史数据聚合成一个比较粗的粒度存储,将最近的数据以一个比较细的粒度存储,这样可以大大减少磁盘的使用空间。
- 冷热存储:通常我们只会查询最近一天或者7天的数据,而半年或一年以前的数据使用率很低,因此可以把历史的冷数据和最近的热数据分开存储,以提高读取数据的效率,减少磁盘的使用空间。
二、时序数据库的特性
上面介绍的时序数据库的这些特点,决定了时序数据库具有以下特性。
- 高并发、高吞吐量,实时写入和读取数据。
- 高可用性、高可靠性,分布式架构、数据分片。
- 支持海量数据存储,一般时序数据都是TB或PB级别的体量。
- 支持数据聚合分析,满足实时的多维聚合分析。
三、时序数据库的组成
- Timestamp:这是时序数据库的关键所在,因为是以时间排序的数据,所以需要记录所有数据的时间。
- Metric:需要存储的指标数据有很多,比如在广告业务中,分析用到的指标更是成千上万,那么在时序数据库中就需要通过Metric字段来标识每个指标数据,如QPS、Status等。
- Dimension:数据的属性,比如数据类型、地域、年龄、性别等。而一般指标的结果都是基于单维度或多维度分析得到的。比如在广告业务中,一个指标有时需要上百个维度经过不同的组合得到不同的结果。
四、时序数据库的模型
下图显示了在同一个时间、不同维度下QPS的变化情况。其中地域和性别就是Dimension,北京、上海等就是地域维度的类别,QPS就是Metric,QPS列的数据就是QPS指标每秒钟在地域和性别组合维度下的值。