opentsdb 小米正用时序数据库,解决这个“硬核”问题

作者|徐
来源|小米云科技(ID: mi-cloud-tech)
时间序列数据
根据维基百科[1]的定义,时间序列是按照时间顺序排列的一组数据点序列。时间序列数据库(TSDB)是用于存储时间序列数据的数据库。近年来,随着物联网等概念的普及,TSDB已经成为一个相对独立的数据库子领域,广泛应用于物联网、监控系统、金融、医疗和零售等场景。
时间序列数据
除了一般数据的共同特征之外,时间序列数据由于时间因素而具有许多独特的特征:
数据通常按照时间顺序抵达抵达的数据几乎总是作为新条目被记录数据写入QPS通常远远大于读取QPS,而且读操作往往基于指标(即metric)读取与之相关的一簇数据数据写入速度通常比较平稳,无明显的波峰和波谷相邻数据之间通常具有一定的相似性在多数情况下,时序数据的价值会随着时间的推移而迅速下降根据上述特点,时序数据系统的设计有以下考虑因素:
同一指标相关的数据最好分布在一起写操作侧重于高吞吐,读操作侧重于低延时因为时序数据的值都是数值,且前后有较大的相似性,因此数据压缩是有意义的,往往能显著提高读写效率,节约空间和其他成本数据库
如前所述,时间序列数据库目前普遍受到重视,各种TSDBs层出不穷[2]。图一是著名的数据库排名网站DB-Engine近两年的数据库趋势排名,TSDB的增速最为明显。由于其独特的特性,时间序列数据很少直接用于关系数据库或NoSQL数据库,而是独立设计、优化和实现的。

opentsdb 小米正用时序数据库,解决这个“硬核”问题


文章图片

图1过去两年(2019年3月)的数据库趋势排名
OpenTSDB
OpenTSDB是一个可扩展的TSDB,可以存储和处理海量数据而不降低精度,其结构如图2 [4]所示。该图以监控这个常见场景为例,展示了各个部分之间的关系。其中,Server节点是被监控的服务器,通常会公开一个HTTP接口,供OpenTSDB调用和收集状态信息。
TSD就是OpenTSDB的一个例子,它的内部结构用空箭头表示。主要分为两部分,一部分是Netty,用于读取用户的请求,返回用户操作的结果;另一部分是异步回调调用链。这些回调的主要功能是将用户参数转换成hbase客户端的扫描或放入参数,包括参数验证、转换、hbase client参数设置、读取操作时的过滤器设置,最后通过异步客户端读写HBase集群。这两部分是异步的,使得OpenTSDB在相对较低的资源消耗下保证了高吞吐量。此外,OpenTSDB还提供了其他工具,方便用户交互和维护。

opentsdb 小米正用时序数据库,解决这个“硬核”问题


文章图片

图2 OpenTSDB系统架构图
关于OpenTSDB,人们更关注Row key的设计,压缩等等。
RowKey设计
OpenTSDB使用外部NoSQL存储引擎存储数据,支持HBase、BigTable等。由于NoSQL经常以无模式或半模式的键值形式存储,其行键设计对读写性能有非常重要的影响。这里以使用最广泛的HBase存储引擎为例进行分析。
行键的数据模型如图3 [5]所示。第一个字节表示是否启用了盐化,然后三个字节表示度量,接下来的四个字节表示数据时间戳,最后是几个数据标签。默认情况下,OpenTSDB最多允许8个标记键。另外需要注意的是,每个度量和标签的uid实际上都是存储在HbBase数据表中的,也就是OpenTSDB将度量映射到一个固定字节的id(也就是UID)并存储在HbBase的另一个表中,而某个度量或标签是由数据表中的UID来标识的,主要是为了保存空。

opentsdb 小米正用时序数据库,解决这个“硬核”问题

推荐阅读