手动 压缩

可以通过调用DB::CompactRange或DB::CompactFiles方法手动触发压缩。 这意味着高级用户可以使用它来实现定制的压缩策略,包括但不限于以下用例

  1. 通过在摄入大量数据后压缩到最低级别,优化读取繁重工作负载
  2. 强制数据通过压缩过滤器以合并它
  3. 迁移到新的压缩配置。例如,如果更改级别的数量,可以调用CompactRange将其压缩到最底层,然后将文件移动到目标级别

下面的示例代码展示了如何使用这些api

  1. Options dbOptions;
  2. DB* db;
  3. Status s = DB::Open(dbOptions, "/tmp/rocksdb", &db);
  4. // Write some data
  5. ...
  6. Slice begin("key1");
  7. Slice end("key100");
  8. CompactRangeOptions options;
  9. s = db->CompactRange(options, &begin, &end);

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

CompactRange

开始和结束参数定义要压缩的键范围。根据db使用的压缩样式的不同,行为也会有所不同。 对于通用压缩和FIFO压缩样式,将忽略开始和结束参数,并压缩所有文件。此外,每个级别的文件都被压缩并保留在同一级别。 对于水平压缩样式,在给定范围内包含键的所有文件都被压缩到包含文件的最后一级。 如果begin或end为NULL,则分别表示db中所有键之前的键或所有键之后的键。

如果有多个线程调用手动压缩,则只有一个线程会实际调度它,而其他线程只会等待调度的手动压缩完成。 如果CompactRangeOptions::exclusive_manual_compaction设置为true,则调用将禁用自动压缩作业的调度,并等待现有的自动压缩作业完成。

CompactRangeOptions支持以下选项-

  • 如果将CompactRangeOptions::exclusive_manual_compaction设置为true,则在运行此手动压缩时不会运行其他压缩。默认值为true
  • 将CompactRangeOptions::change_level,CompactRangeOptions::target_level Together,这些选项控制将放置压缩文件的级别。 如果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

这个API将所有输入文件压缩到output_level中的一组输出文件中。 输出文件的数量由数据的大小和CompactionOptions::output_file_size_limit的设置决定。 ROCKSDB_LITE不支持此API。