Timestamp压缩
gorilla的数据timestamp数据的特点是单调增加和近似的fixed interval,类似等差数列,因此使用delta of delta压缩。gorilla以固定时间窗口组织数据,称为span,span也称为block,在正常情况下,block大小相同(因为每个span产生的数据量相同)。压缩的基本单位为block,在block的头部,会存储一个基线timestamp,按2小时对齐(原因见压缩效果的figure 6),便于delta of delta计算。
具体细节如下:


02:01:02与基线时间02:00:00的delta为62,02:02:02与02:01:02的delta为60,delta of deltas的结果为-2,因此符合情况©,使用2个bits ‘10’ flags和7个bits存储delta value -2。
其中2中的编码delta的方式为: 控制位 + Delta value, 控制位分别为’0’, ‘10’, ‘110’, ‘1110’, ‘1111’,是常见的一种无歧义的编码方式。另外Delta value的存储存在负数,除了示例中时间记录偏差外,另一种可能是数据存在缺失,例如每分钟产生一个监控数据,但在第4分钟因故障丢失了数据,delta可能是0, 60, (miss), 121, 59, 计算delta of delta为0, 61, -62,即出现较大的负数,范围在[-interval, 0)内,因此设计编码区间为对称区间。其实再抠一点,对于情况©可以表示的范围应该是**[-64, 0), (0, 64],因为0是不可能取到,否则的话即为情况(b),不能为情况©,其他同理。
gorilla根据业务数据delta of delta的分布确定了(b) ~ (f) 五种情况,如figure 3所示,96.39(1)表示96.39%的delta of delta结果为0, 符合情况(b)只需要1 bit表示,按比例可以计算出平均使用1.40 bits**可存储一个timestamp,压缩比为45.71(= 64 / 1.40)。

Floating point value压缩
IEEE754规定了float在内存中的存储方法,以 num * 2^n 来描述(num为二进制的1.xxxxx )。

gorilla中,浮点数的压缩设计为编码存储delta value,delta使用按位XOR计算。floating point number的来源是监控数据,期望是大多数情况是较为稳定,因此XOR结果会有较多的0。具体编码算法的细节如下:



该例子中XOR结果为0x0010000000000000其中leading zeros bits为11,有效位为1个bit 1, 符合情况3.(b),存储2bits 的control flags为’11’,使用5 bits表示leading zeros长度5, 6个bits表示有效位数为1,1个bit存储有效位1
figure 4的上表中可以看到对于整数数据,XOR的结果具有较多相同的leading zeros和trailing zeros,因此可以利用上一次XOR的结果,只存储有效的位数。
figure 4的下表可以发现对于有规律的数据(例子较为特殊是2进制可以无损表示的小数),XOR结果有效位较少,需要存储的有效位少,达到压缩的目的。

类似timestamp,gorilla根据实际业务数据统计了2和3(a), 3(b)三种情况的数据分布,可以算得平均需要13.12个bits存储一个floating point value, 因此压缩比为4.88。





