Gorilla: A fast, scalable, in-memory time series database
作者: Pelkonen T, Franklin S, Teller J, et al
出处: VLDB(CCF A)
年份: 2015
链接:https://dl.acm.org/doi/pdf/10.14778/2824032.2824078
简介:
- Gorila是Facebook在2015年介绍的内存型时序数据库并开源实现了Beringei。当前较为流行的时序数据库例如InfluxDB、loTDB、Prometheus的压缩算法也参考了Gorilla的相关实现。
- 大规模互联网面对每秒监控和分析千万次的测量当中,往往不太重视单个数据点,而是强调聚合分析。并且最近数据点比旧数据点更具备价值。面对写入和读取的高可用性要求,利用增量时间戳和XOR浮点值将数据压缩存储在内存中,减少查询延迟提升,查询吞吐量。监测系统性能读取存在问题,HBase时间序列存储系统无法扩展处理未来数据量下的读取负载,希望从查询延迟与效率上作为切入点,关注内存中缓存部分。
- 基于现有的浮点压缩,以流式处理的方式解决存储开销问题。介绍了时间戳与数值型的压缩方案,在不同服务器之间提供读取服务,以及如何部署在开源数据库当中。
关键算法:
- 时间戳的存储上,不是完整存储时间戳,而是存储时间戳的增量,利用可变长度编码对增量进行编码。浮点数的压缩上,利用时间序列中相邻数据点不会显著变化,将当前值与先前值进行比较,值相近则利用尾数符号、指数与前几位数据相同的特点计算简单异或,对XOR值进行编码。
1.第一个值不压缩的情况下存储;2.如果与前一个值XOR为零,即值相同,存储单个位’0’;3.当XOR不为0时,计算XOR中前导零和尾随零的数量,存储位’1’,后面跟情况a或b。
(a)控制位 ‘0’: 如果有意义位块落在前一个有意义位的块内,(有意义的位少于上一个有意义的位),即至少存在与前一个值一样多的前导零和尾随零将该信息用于块位置(前一个前导零和尾随零信息可以复用),并仅存储有意义的 XOR 值。
(b)控制位 ‘1’: 将前导零的长度存储在接下来的 5 位中,然后将有意义的 XOR 值的长度存储在接下来的 6 位中。最后,存储 XOR 值的有意义的位。
存在的问题/后续方向:
- 前导零和尾随零长度的表示位可以再进一步压缩(Chimp);
- Gorilla方法是与上一个数进行比较,还可以与先前的多个数据进行比较(Chimp、AFC);
- 与预测的算法结合(AFC);
- Goriila是基于相似数据具有很多相同的前导位,那么存在很多可省略的前导零部分,尾随零的部分可以通过抹除的方法进一步省略(Elf)。
- 存储基于XOR异或进行的,调整为记录差值,压缩数据进而可以记录数据变化情况。
代码复现链接:
https://github.com/burmanm/gorilla-tsc(Java)
https://github.com/pidb/Gorilla(C++)