导读:高性能时间序列数据库(High-PerformanceTimeSeriesDatabase,简称HiTSDB)是一种高性能,低成本,稳定可靠的在线时序数据库服务,提供高效读写,高压缩比存储、时序数据插值及聚合计算,时间线多维分析,主要服务于监控系统和IoT领域。目前已在阿里巴巴集团多项内部业务中获得广泛运用,稳定服务于年双11、年双11,
背景
HiTSDB时序数据库引擎在服务于阿里巴巴集团内的客户时,根据集团业务特性做了很多针对性的优化。然而在HiTSDB云产品的打磨过程中逐渐发现,很多针对性的优化很难在公有云上针对特定用户去实施。
于此同时,在公有云客户使用HiTSDB的过程中,发现了越来越多由于聚合查询导致的问题,比如:返回数据点过多会出现栈溢出等错误,聚合点过多导致OOM,或者无法完成聚合,实例完全卡死等等问题。这些问题主要由于原始的聚合引擎架构上的缺陷导致。
因此HiTSDB开发团队评估后决定围绕新的聚合引擎架构对HiTSDB引擎进行升级,包含:存储模型的改造,索引方式的升级,实现全新的流式聚合,数据迁移,性能评测。本文主要围绕这5个方面进行梳理,重点在“全新的流式聚合部分”。
1.时序数据存储模型:
1.1时序的数据存储格式。
一个典型的时序数据由两个维度来表示,一个维度表示时间轴,随着时间的不断流入,数据会不断地追加。另外一个维度是时间线,由指标和数据源组成,数据源就是由一系列的标签标示的唯一数据采集点。例如指标cpu.usage的数据来自于机房,应用,实例等维度组合成的采集点。这样大家逻辑上就可以抽象出来一个id+{timestamp,value}的时序数据模型。这种数据模型的存储是如何呢。一般有两种典型的数据存储思路:
一种按照时间窗口维度划分数据块,同一段自然时间窗口内的连续数据放到相邻的位置,比如{1:00,2:00}-(id1,id2,id3,......,idN)。采用这种方式的典型时序数据库包含InfluxDB,Promethues等等TSMT结构的数据库。OpenTSDB有些特殊,因为OpenTSDB是单值模型,指标这个维度在查询的时候是必带的。所以可以先按照指标做了一级划分,再根据时间窗口做二级的划分,本质上还是同一时间窗口内的连续数据。按照时间窗口切分的方式,优势是写入的时候可以很天然的按照窗口去落盘,对于高纬度的标签查询基本上是一些连续Scan.这种方式有个比较难解的问题就是outoforder乱序问题,对于时间窗口过期后再来的时间点,Promethues直接采用丢弃的方式,InfluxDB在这种情况下性能会有损耗。另外一种按照时间线维度划分数据块,同一时间线的数据放到相邻的位置,比如(id1)-(1:00,2:00,3:00,......,23:00)。HiTSDB采用时间线维度划分的方式:目前落盘数据存储于HBASE,底层Rowkey由指标+标签+自然窗口的方式组合而成.Rowkey按照大小顺序合并某个时间线的数据点是连续相邻的。因此对于一些低维的查询效率是非常高效的。根据目前接触的一些物联网服务,更多的是一些低维的访问。对于中等维度的查询采用流式scan。对于极高纬度标签的查询HiTSDB采用预聚合的服务(不在本文讨论范围内)。
1.2时序模型的热点问题处理
生产环境中业务方采集的指标类型多种多样,对指标的采集周期各不相同。比如cpu.usage这个指标的变化频率比较快,业务方