Gorilla及论文简介
关于TSDB gorrilla: facebook团队结合实时分析时序数据的业务需求和现有的业务系统,将gorilla设计为数据系统ODS的write-throught cache部分(ODS是facebook用于分析监控和告警的数据系统, gorrilla作为in memory database部分)。论文提出了针对业务数据的压缩算法,达到10倍压缩比,因此得以把数据放在内存里,相比baseline,时延减少73x,吞吐提升10x。
文章发表时(2015),gorrila已部署在facebook的生产环境,用于工程师日常故障分析、实时告警和配合Hive/Scuba进行debug、detect and diagnose problems.
严格来说,论文提出了针对特定场景的timestamp和floating point的压缩算法,并不通用,这表明了对于清晰且稳定的业务,高效压缩算法的选择和设计仍是一个case study问题。

压缩算法介绍
业务数据分析
如何实现数据的高效压缩,达到解压速度和压缩比的一个平衡,是case study问题,通常需要人工的介入针对数据进行个案分析,Gorilla中的压缩也不例外。
论文首先分析gorilla面临的workload,其写入主要是来自各项监控数据输入,而读取则是告警、图表以及来自开发运维人员的debug查询,其特点包括:
- 写入为主, 且负载较高
- 监控报警,读近期写入数据
- 以aggergate聚合为主,对实时性有一定要求
- 可用性要求高
本文我们主要关注压缩算法的设计,为满足前3点,论文选择将gorilla设计为in memory database,将近期数据尽可能存储在内存中,因此需要设计实现高效的轻量压缩。论文分析了业务数据的特点,gorilla需要存储的数据成为data point其实较为简单,是一个3元组的形式,(string key, timestamp, floating point number), 包含以下特点:
- string key,用于sharding
- timestamp数据
- 单调增加
- 近似fixed interval
- Floating point number
- 包含较多整数型数据
- 几乎为constant,变化小
Timestamp和Floating point number主要来源于监控采集生成,具有一定的连续性和局部性,因此gorilla设计的压缩方式主要基于delta encoding的改进。其中timestamp特征类似等差数列,因此选择存储delte of delta,因为理想情况下等差数列的delta of delta为0;而floating point number使用xor计算delta value,且当前的delta value会与上一个delta value进行比较,存储其中的有效的(不同的)部分。
下图是gorilla的一个压缩的block格式示例,我们将在后两节详细描述针对这两种类型数据的编码方式。





