Influxdb数据压缩

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Influxdb数据压缩相关的知识,希望对你有一定的参考价值。

环境: CentOS6.5_x64
InfluxDB版本:1.1.0

 

数据压缩可以参考:

https://docs.influxdata.com/influxdb/v1.1/concepts/storage_engine/#compression

 

influxdb根据不同的数据类型会采用不同的压缩算法。

  • int

  首先使用ZigZag算法进行编码,如果编码后的值小于 (1 << 60 ) - 1,使用simple8b算法;

  如果大于该值,不压缩;

  • timestamp

  排序后使用差分编码算法进行编码,然后使用simple8b算法压缩。

  • float

  使用 Facebook Gorilla paper提供的浮点数压缩算法

  • bool

  只有1位数据,采用简单的位数据打包策略

  • string

  采用snappy算法

压缩算法介绍

ZigZag算法

这个算法使用的基础就是认为在大多数情况下,我们使用的数字都是不大的数字。 小整数对应的ZigZag码字短,大整数对应的ZigZag码字长。 但是,在特定的场景下,比如,要传输的整数为大整数居多,ZigZag编码的压缩效率就不理想了。

实现代码如下:

// ZigZagEncode converts a int64 to a uint64 by zig zagging negative and positive values
// across even and odd numbers.  Eg. [0,-1,1,-2] becomes [0, 1, 2, 3]
func ZigZagEncode(x int64) uint64 {
    return uint64(uint64(x<<1) ^ uint64((int64(x) >> 63)))
}

// ZigZagDecode converts a previously zigzag encoded uint64 back to a int64
func ZigZagDecode(v uint64) int64 {
    return int64((v >> 1) ^ uint64((int64(v&1)<<63)>>63))
}

simple8b算法

该算法是64位算法,实现将多个整型数据压缩到一个64位的存储结构中, 存储结构中的前4位用于标识Selector的值,后60位用于存储数据,可以压缩0到(1<<60)-1的数字。

使用下表进行编码:

┌──────────────┬─────────────────────────────────────────────────────────────┐
│   Selector   │       0    1   2   3   4   5   6   7  8  9  0 11 12 13 14 15│
├──────────────┼─────────────────────────────────────────────────────────────┤
│     Bits     │       0    0   1   2   3   4   5   6  7  8 10 12 15 20 30 60│
├──────────────┼─────────────────────────────────────────────────────────────┤
│      N       │     240  120  60  30  20  15  12  10  8  7  6  5  4  3  2  1│
├──────────────┼─────────────────────────────────────────────────────────────┤
│   Wasted Bits│      60   60   0   0   0   0  12   0  4  4  0  0  0  0  0  0│
└──────────────┴─────────────────────────────────────────────────────────────┘

Fackbook Gorilla XOR算法

第一个值不压缩; 后面的值是跟第一个值XOR的结果来的,如果结果相同,仅存储一个0; 如果结果不同,存储XOR后的结果。

snappy算法

以下是Google几年前发布的一组测试数据(《HBase: The Definitive Guide》):

Algorithm   % remaining Encoding    Decoding
GZIP            13.4%   21 MB/s     118 MB/s
LZO             20.5%   135 MB/s    410 MB/s
Zippy/Snappy    22.2%   172 MB/s    409 MB/s

其中:

1)GZIP的压缩率最高,但是它是CPU密集型的,对CPU的消耗比其他算法要多,压缩和解压速度也慢;

2)LZO的压缩率居中,比GZIP要低一些,但是压缩和解压速度明显要比GZIP快很多,其中解压速度快的更多;

3)Zippy/Snappy的压缩率最低,而压缩和解压速度要稍微比LZO要快一些。

好,就这些了,希望对你有帮助。

本文github地址:

https://github.com/mike-zhang/mikeBlogEssays/blob/master/2017/20170423_Influxdb数据压缩描述.rst

欢迎补充 

以上是关于Influxdb数据压缩的主要内容,如果未能解决你的问题,请参考以下文章

python 多线程将数据写入 influxDB

python 多线程将数据写入 influxDB

如何看待influxdb集群功能不再开源

再不懂时序就OUT啦!阿里云数据库InfluxDB正式商业化

面向物联网,UCloud 推出高性能时序数据库 UTSDB-InfluxDB

4_InfluxDB学习之InfluxDB的基本概念InfluxDB中独有的概念(Point,series),InfluxDB学习之InfluxDB的基本操作,InfluxDB操作方式,crud(代码