百度时序数据库——存储的省钱之道

640?wx_fmt=gif

作者简介

任杰    百度高级研发工程师

640?wx_fmt=png

负责百度智能运维产品(Noah)的分布式时序数据存储设计研发工作,在大规模分布式存储、NoSQL数据库方面有大量实践经验。



干货概览

百度Noah平台的TSDB,是百度最大规模的时序数据库,它为Noah监控系统提供时序数据存储与查询服务,每天承接多达数万亿次的数据点写入请求,以及数十亿次的查询请求。作为监控系统的后端服务,在如此大规模的写入情况下,保证快速的查询响应非常重要,这对系统提出了巨大挑战。通过对用户日常查询行为进行分析,用户的查询需求与数据的时间轴有强关联,用户更加关心最近产生的数据。因此Noah的TSDB在架构上,利用百度BDRP(百度的Redis平台)构建缓存层,缓存最近几小时的数据,极大提升查询性能,有效降低查询平响。

同样Facebook为了提高其ODS TSDB读写性能,设计了基于内存的Gorilla时序数据库,用作ODS的write-through cache方案缓存数据。可以看出在缓存这层,我们都采用基于内存的方式做数据缓存。采用内存最大的优势是其数据读写速度远快于磁盘速度,然而缺点是需要占用较大的内存空间资源。为了有效节约内存空间,Gorilla设计了时序数据压缩算法对时序数据进行实时压缩。在Gorilla论文[1]中表明,利用其压缩算法,在Facebook的生产环境下平均压缩数据10倍。

我们在对缓存层数据存储设计的时候,结合Noah TSDB的具体情况,借鉴了Gorilla数据压缩算法对数据进行压缩,存储空间资源占用降低了70%,有效降低资源成本。因此本文简单和大家分享一下该压缩算法的基本原理,没准儿也能节约下不少钱呢。

基础介绍

典型的时序数据,是由Key-Value组成的二元组, Key中可能包含如Cluster、Tag、Metric、Timestamp等信息。为了便于理解,这里将时序数据简单理解为Key是时间戳(Timestamp),Value是在该时间戳时的具体数据值。

假设这是某CPU在不同时间的利用率:

640?wx_fmt=png

以这份数据为例,在后续介绍中我们一边介绍算法,一边采用Gorilla的压缩方法对这个测试数据进行压缩,观察该算法压缩效果。

压缩思想


1基本原则

Gorilla压缩算法,其核心思想建立在时序数据场景下,相邻的时序数据相似度很大这一特点之上。基于这个基本的原则,尽量只保留数据差异的部分,去除相同的部分,来达到压缩数据的目的。

2数据结构

Gorilla将数据组织成一个个数据块(Block),一个Block保存连续一段时间且经过压缩的时序数据。每次查询的时候会直接读取目标数据所属的Block,对Block解压后返回查询结果。Facebook经验表明,如果一个Block的时间跨度超过2小时,由于解压Block所消耗的资源增加,其压缩收益会逐渐降低,因此将单个Block的时间跨度设置为2小时。

每个Block的Header保存其起始时间戳(Timebase),例如如果某时序数据产生时间点是2019/2/24 14:30,则以2小时为单位向上取整,该数据所属的Block的Timebase为2019/2/24 14:00,时间戳为1550944800如下图所示。然后以KV的形式依次保存属于该Block的时序数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值