在每个SST文件里,数据块和索引块会被分别压缩。用户可以指定压缩类型。过滤块不会被压缩
压缩配置是针对每个列族的。
使用options.compression来指定使用的压缩方法。默认是Snappy。我们相信LZ4总是比Snappy好的。我们之所以把Snappy作为默认的压缩方法,是为了与之前的用户保持兼容。LZ4/Snappy是轻量压缩,所以在CPU使用率和存储空间之间能取得一个较好的平衡。
如果你想要进一步减少存储的使用并且你有一些空闲的CPU,你可以尝试设置options.bottommost_compression来使用一个更加重量级的压缩。最底层会使用这个方式进行压缩。通常最底层会保存大部分的数据,所以用户通常会选择偏向空间的设定,而不是花费cpu在各个层压缩所有数据。我们推荐使用ZSTD。如果没有,Zlib是第二选择。
如果你有大量空闲CPU并且希望同时减少空间和写放大,把options.compression设置为重量级的压缩方法。我们推荐ZSTD,如果没有就用Zlib
通过一个已经撤销的遗留选项options.compression_per_level,你可以有更好的控制每一层的压缩方式。当这个选项被使用的时候,options.compression不会再被使用,但是options.bottommost_compression仍旧有效。但是我们相信很少有这个选项有用的情况。
请注意,当你针对不同不同的层设定不同的压缩方式,一些压缩里的“不那么重要的移动”,会跟压缩方式有冲突的操作,将不会被执行,文件会被改写为新的压缩方式。
指定的压缩方式总是同时应用在索引和数据块。你可以通过把BlockBasedTableOptions.enable_index_compression设置为false来关闭索引的压缩。
有些压缩类型支持不同的压缩层和窗口设定。你可以通过options.compression_opts设定他们。如果设定的类型不支持这些设定,他们不会生效
用户可以选择使用一个存储在文件里的字典对每个最底层的SST文件进行压缩。在某些情况下,这可以省下一些空间。参考 字典压缩
如果你选择一个库里面不存在的压缩方式,RocksDB会后退到无压缩。RocksDB会在日志的头部打印出支持的压缩方式:
2017/12/01-17:34:59.368239 7f768b5d0200 Compression algorithms supported:
2017/12/01-17:34:59.368240 7f768b5d0200 Snappy supported: 1
2017/12/01-17:34:59.368241 7f768b5d0200 Zlib supported: 1
2017/12/01-17:34:59.368242 7f768b5d0200 Bzip supported: 0
2017/12/01-17:34:59.368243 7f768b5d0200 LZ4 supported: 1
2017/12/01-17:34:59.368244 7f768b5d0200 ZSTDNotFinal supported: 1
2017/12/01-17:34:59.368282 7f768b5d0200 ZSTD supported: 1
通过检查日志,来发现可能出现的兼容性问题。