压缩

压缩是什么?

在每个SST文件中,可以分别压缩数据块和索引块。用户可以指定要使用什么压缩类型。过滤块没有被压缩。

配置

压缩配置为每个列族。

使用options.compression指定要使用的压缩。默认情况下,它很时髦。我们相信LZ4总是比Snappy好。 我们将Snappy保留为默认值,以避免先前用户遇到意外的兼容性问题。 LZ4/Snappy是轻量级压缩,因此它通常在空间和CPU使用之间取得良好的平衡。

如果您想进一步减少内存并有一些空闲CPU可用,可以通过设置options.bottommost_compression在后者中设置一个重量级压缩。 最底层将使用这种压缩样式进行压缩。通常最底层包含大部分数据,因此用户可以获得几乎最佳的空间设置,而无需为压缩所有流到任何级别的数据而支付CPU费用。 我们建议ZSTD。如果不可用,则Zlib是第二选择。

如果你想要有大量的空闲CPU,并且不仅想要减少空间,还想要减少写入放大,请尝试将options.compression设置为heavy weight压缩类型。 我们建议ZSTD。如果Zlib不可用,请使用它。

使用一个反向的遗留设置options.compression_per_level,您可以更好地控制使用的每个级别的压缩样式。 当使用此选项时,options.compression将不再有效,而options.compression将不再有效。 bottommost_compression仍然适用。但是我们相信,很少有用例可以使用这种调优。

请注意,当您将不同的压缩设置为不同的级别时,将不会执行违反压缩样式的压缩”琐碎动作”,并且将使用预期的压缩重写文件。

指定的压缩类型始终适用于索引和数据块。您可以通过设置BlockBasedTableOptions禁用索引块的压缩。enable_index_compression = false。

压缩级别和窗口大小设置

一些压缩类型支持不同的压缩级别和窗口设置。您可以通过options.compression_opts设置它们。如果压缩类型不支持这些设置,则为no-op

字典压缩

用户可以选择使用存储在文件中的字典压缩最底层的每个SST文件。在某些用例中,这可以节省一些空间。查看 字典压缩 (https://github.com/facebook/rocksdb/wiki/Dictionary-Compression)。

压缩库

如果您选择了一个压缩类型,但是它的库不可用,那么RocksDB将返回到no compression。RocksDB会在日志文件的头部打印出压缩类型的可用性,如下所示:

  1. 2017/12/01-17:34:59.368239 7f768b5d0200 Compression algorithms supported:
  2. 2017/12/01-17:34:59.368240 7f768b5d0200 Snappy supported: 1
  3. 2017/12/01-17:34:59.368241 7f768b5d0200 Zlib supported: 1
  4. 2017/12/01-17:34:59.368242 7f768b5d0200 Bzip supported: 0
  5. 2017/12/01-17:34:59.368243 7f768b5d0200 LZ4 supported: 1
  6. 2017/12/01-17:34:59.368244 7f768b5d0200 ZSTDNotFinal supported: 1
  7. 2017/12/01-17:34:59.368282 7f768b5d0200 ZSTD supported: 1

检查日志是否存在潜在的编译问题。