跳转至

通过 DB::CompactRange 或者 DB::CompactFiles,可以手动触发压缩。这是给高级用户开发自定义压缩策略使用的,包括但不限于以下使用方法:

  • 通过在读取大量数据之后,把文件压缩到最底层,来优化读多写少的工作压力。
  • 强制数据进入压缩过滤器,以固定数据。
  • 迁移到一个新的压缩配置。例如,如果修改了层数量,可以调用 CompactRange 来把数据压缩到最底层,然后把文件移动到目标层。

下面的例子展现如何使用这些 API。

Options dbOptions;

DB* db;
Status s = DB::Open(dbOptions, "/tmp/rocksdb",  &db);

// Write some data
...
Slice begin("key1");
Slice end("key100");
CompactRangeOptions options;

s = db->CompactRange(options, &begin, &end);

或者

CompactionOptions options;
std::vector<std::string> input_file_names;
int output_level;
...
Status s = db->CompactFiles(options, input_file_names, output_level);

CompactRange

begin 和 end 参数定义需要压缩的 key 的范围。根据 db 使用的压缩风格而有不同的行为。在 universal 和 FIFO 压缩风格,begin 和 end 参数会被忽略,所有文件都会被压缩。另外,每一层的文件都会被压缩,并且留在本层。对于 leveled 压缩风格,所有包含有 key 范围的文件都会被压缩到最底层。如果 begin 或者 end 为 NULL,这意味着使用第一个的 key 或者最后一个的 key。

如果多于一个线程调用了人工压缩,只有一个会真正被调度,而其他线程会等待已经调度的压缩完成。如果 CompactRangeOptions::exclusive_manual_compaction 被设置为 true,调用会禁止自动压缩工作的调度,然后等待已经开始的自动压缩工作停止。

CompactRangeOptions 支持以下选项:

  • CompactRangeOptions::exclusive_manual_compaction。 为 true 时,如果人工压缩开始了,就不会有其他压缩进行了。默认为 true
  • CompactRangeOptions::change_level,CompactRangeOptions::target_level。 两个选项一起决定压缩后的文件会放在那一层。如果 target_level 为 -1,压缩文件会移动到层号最小的,max_bytes 能满足放下所有文件的层。中间的层必须为空。例如,如果文件初始化被压缩到 L5,然后 L2 是最小的、能存放所有数据的层,那么如果 L3 和 L4 是空的,他们会被放在 L2,或者如果 L3 不是空的,就放在 L4。如果 target_level 为正,压缩后的文件会放在那个层,并且中间层为空。如果中间的层没有空的,那么压缩的文件会被放在他们原来的层。
  • CompactRangeOptions::target_path_id 压缩输出会被放在 options.db_paths[target_path_id] 目录。
  • CompactRangeOptions::bottommost_level_compaction,当设置为 BottommostLevelCompaction::kSkip,或者设置为 BottommostLevelCompaction::kIfHaveCompactionFilter ,并且这个列族有压缩过滤器被定义,那么最底层的文件不会被压缩

CompactFiles

这个接口会压缩所有输入文件到一系列输出文件,然后放在 output_level 中。输出文件的大小取决于数据的大小以及 CompactionOptions::output_file_size_limit 的设定。这个 API 在 ROCKSDB_LITE 里面不支持。