浅谈时序数据库(TSDB)

  • 一、什么是时序数据库
  • 二、时序数据库特点
    • 基本特点
    • 核心特性
  • 三、补充知识
    • LSM树(LSM tree vs B tree)
      • B tree
      • LSM tree
      • 总结
  • 四、常见的时序数据库
  • 参考:

一、什么是时序数据库

时序数据库全称时间序列数据库,主要分为时间戳(timestamp)、标签(tag)、存档(filed)三大部分,按照时间顺序记录数据。

物联网时代的兴星,万物互联的的思想,利用物联网设备的传感器传输设备的实时数据到时序数据库,对设备的异常、IO等数据进行记录。

二、时序数据库特点

时序数据库包含:监控业务(哨兵),采集服务器的指标数据(IO指标、CPU指标、带宽内存指标等等)、业务相关数据(方法调用异常次数、响应延迟、JVM GC相关数据等等)、数据库相关数据(读取延迟、写入延迟等等)。

基本特点

1.便于存储持续产生的海量数据;(哨兵的监控系统会持续产生海量的数据,如监控1w台服务器的各项指标,每台服务器每秒采集100种metrics,每秒就会产生100w的TPS)

2.对插入有较高性能的体现,对更新、删除的性能较为底下(时效业务产生的数据很少会有更新、删除的操作,基于这个特性,在时效数据库的架构设计时能有很大的简化)

3.近期数据关注度更高,时间久远的数据甚至可以考虑丢弃;(哨兵系统种我们通常关系的都是最近一小时的数据,最多关注最近三天的数据,很少会去关注三天前甚至更久远的数据,可以根据具体业务考虑丢弃过于久远的数据,以达到节约存储资源的目的)

4.多维度聚合统计查询功能。(比如业务需要统计最近一小时广告主google发布的USA地区的广告点击率和总收入分别是多少,这里需要利用多维度聚合统计查询,这种需求虽然对于时效性要求不高,但是对查询聚合性能有比较高的要求,我们可以采用时序数据的多维度聚合统计查询功能)

核心特性

1、高吞吐量写入能力;(系统具有水平扩展性和单机LSM体系结构。水平扩展性是为了实现集群式的系统,而且容易加节点扩展,实现扩容的时候业务无感知;LSM体系结构是为了加快单机的高吞吐量写入)

2、数据分级存储/TTL;(针对时序数据的冷热性质定制的技术特性。近几小时级别的数据存入内存中,最近天级的数据存入SSD(固态硬盘),更久远的数据放到HDD(机械硬盘)或者直接使用TTL过期淘汰)

3、高压缩率;(一方面是为了节约成本,另一方面是压缩后能将更多的数据放入内存,降低查询开销)

4、多维度查询能力;(时序数据通常会有多个维度的标签来刻画一条数据)

5、高效聚合能力;(使用预聚合技术,就是在数据写进来的时候就完成基本的聚合操作)

6、未来技术点。(异常实时检测、未来预期等等)

三、补充知识

LSM树(LSM tree vs B tree)

将数据的修改增量保存在内存中,达到指定大小后将这些批修改写入到磁盘中。读取时合并磁盘的历史数据和内存中最近修改的操作。 规避了磁盘的随机写入,但是读取时可能会访问较多的磁盘文件。

B tree

主流关系型数据库均以B/B+ tree作为其构建索引的数据结构,这是因为B tree提供了理论上最高的查询效率O(log2n),但由于其对于查询性能的追求造成了B tree每次插入或删除一条数据时,均需要更新索引,从而造成一次磁盘IO。这一特性决定了B tree只适合需要频繁读较少写的场景。如果在频繁写的场景下,将造成大量的磁盘IO,从而导致性能骤减。这种应用场景在传统的关系型数据库中比较常见。

LSM tree

LSM tree避免了频繁写场景下的磁盘IO开销,尽管其查询效率无法达到理想的O(log2n),但是依旧非常快,可以接受。所以冲本质上来说,LSM tree相当于牺牲了部分查询性能,换取了可观的写入性能,这对于key-value型或日志型数据库是非常重要的。

总结

1.写数据时,首先将数据缓存到内存中的一个有序树结构中(称为memtable)。同时触发相关结构的更新,例如布隆过滤器(bloom filter)、稀疏索引(sparse index);
2.当memtable积累到足够大时,会一次性写入磁盘中,生成一个内部有序的segment文件。该过程为连续写,因此效率极高;
3.进行查询时,首先检查布隆过滤器。如果布隆过滤器报告数据不存在,则直接返回不存在。否则按照从新到老的顺序依次查询每个segment;
4.在查询每个segment时,首先使用二分搜索检索对应的稀疏索引,找到数据所在的offset范围。然后读取磁盘上该范围内的数据,再次进行二分查找并获得结果;
5.对于大量的segment文件,定期在后台执行compaction操作,将多个文件合并为更大的文件,以保证查询效率不衰减。

稀疏索引(sparse index)对应的是全量索引(dense index)。
稀疏索引是指将有序数据切分成(固定大小的)块,仅对各个块开头的一条数据做索引。
全量索引对全部数据进行编制索引,其中的任意一条数据发生增删均需要更新索引。
全量索引查询效率更高,达到了理论极限O(log2n),但写入和删除效率低,每次数据增删均需要更新索引而消耗一次IO操作。通常关系型数据库,如MySQL等,其内部采用B tree作为索引结构,即全量索引。

布隆过滤器内部依赖哈希算法,当检测到莫一条数据是否见过时,有一定概率出现假阳性(False Positive),但一定不会出现假阴性(False Negative)。简而言之,布隆过滤器认为一条数据出现过,那么该条数据很可能出现过;但如果布隆过滤器认为一条数据没有出现过,那么该条数据一定没有出现过。这种特性刚好与此处的需求相契合,即检验某条数据是否缺失。

四、常见的时序数据库

InfluxDB、Kdb+、Prometheus、Graphite、OpenTSDB…

参考:

时序数据库介绍.
时序数据库(TSDB).
LSM 算法的原理(通俗,详细).
排名前十的时序数据库.