RocksDB选项文件

从RocksDB4.3开始,我们加了一系列功能来简化RocksDB的设置。

  • 每次成功调用DB::Open(),SetOptions(),以及CreateColumnFamily和DropColumnFamily被调用的时候,RocksDB的数据库都会自动将当前的配置持久化到一个文件里。
  • LoadLatestOptions() / LoadOptionsFromFile() :用于从一个选项文件构造RocksDB选项。
  • CheckOptionsCompatibility :一个用于检查两个RocksDB选项的兼容性。

通过上面这些选项文件的支持,开发者再也不用维护以前的RocksDB数据库对象的配置集。另外,如果需要修改选项,CheckOptionsCompatibility可以保证新的配置集可以在不损坏已有数据的情况下打开同一个RocksDB数据库。

示例

这里有一个可以运行的示例,用于展示新的功能是如何让管理RocksDB选项更简单的。一个更加完整的例子可以在examples/options_file_example.cc 里找到。

假设我们打开一个RocksDB数据库,然后在运行过程中创建一个新的列族,然后关闭数据库:

  1. s = DB::Open(rocksdb_options, path_to_db, &db);
  2. ...
  3. // 创建列族,然后rocksdb会保存这些选项。
  4. ColumnFamilyHandle* cf;
  5. s = db->CreateColumnFamily(ColumnFamilyOptions(), "new_cf", &cf);
  6. ...
  7. // 关闭 DB
  8. delete cf;
  9. delete db;

从RocksDB4.3之后,每个RocksDB实例都会自动将最新的配置存储在一个配置文件,下次打开数据库的时候,我们可以利用这个配置文件来构造新的选项对象。这跟RocksDB 4.2以及更老的版本不同,我们再也不用为了打开一个数据库而记住所有列族的选项了。我们看看要如何做。

首先,我们使用LoadLatestOptions加载目标DB最新的设置:

  1. DBOptions loaded_db_opt;
  2. std::vector<ColumnFamilyDescriptor> loaded_cf_descs;
  3. LoadLatestOptions(path_to_db, Env::Default(), &loaded_db_opt,
  4. &loaded_cf_descs);

不支持的选项

由于c++没有反射机制,以下需要使用用户定义的函数以及指针类型的配置项,只能被初始化为默认值。详细信息可以参考rocksdb/utilities/options_util.h:

  • env
  • memtable_factory
  • compaction_filter_factory
  • prefix_extractor
  • comparator
  • merge_operator
  • compaction_filter
  • BlockBasedTableOptions里的缓存
  • table_factory, 除了 BlockBasedTableFactory

对于那些不支持的用户定义函数,开发者需要手动指定他们。在这个例子,我们初始化BlockBasedTableOptions里的缓存和CompactionFilter:

  1. for (size_t i = 0; i < loaded_cf_descs.size(); ++i) {
  2. auto* loaded_bbt_opt = reinterpret_cast<BlockBasedTableOptions*>(
  3. loaded_cf_descs[0].options.table_factory->GetOptions());
  4. loaded_bbt_opt->block_cache = cache;
  5. }
  6. loaded_cf_descs[0].options.compaction_filter = new MyCompactionFilter();

现在我们执行安全性检查,确保新的选项可以安全打开目标数据库:

  1. Status s = CheckOptionsCompatibility(
  2. kDBPath, Env::Default(), db_options, loaded_cf_descs);

如果返回的值是OK,我们就可以继续使用加载起来的选项来打开目标数据库了:

  1. s = DB::Open(loaded_db_opt, kDBPath, loaded_cf_descs, &handles, &db);

RocksDB选项文件格式

RocksDB选项文件是一个 INI文件格式 的text文件。每个RocksDB配置文件都一个版本号段,一个DBOptions段以及对每个列族,有一个CFOptions和TableOptions段。以下是一个示例的RocksDB选项文件。一个完整的示例可以在 examples/rocksdb_option_file_example.ini找到

  1. [Version]
  2. rocksdb_version=4.3.0
  3. options_file_version=1.1
  4. [DBOptions]
  5. stats_dump_period_sec=600
  6. max_manifest_file_size=18446744073709551615
  7. bytes_per_sync=8388608
  8. delayed_write_rate=2097152
  9. WAL_ttl_seconds=0
  10. ...
  11. [CFOptions "default"]
  12. compaction_style=kCompactionStyleLevel
  13. compaction_filter=nullptr
  14. num_levels=6
  15. table_factory=BlockBasedTable
  16. comparator=leveldb.BytewiseComparator
  17. compression_per_level=kNoCompression:kNoCompression:kNoCompression:kSnappyCompression:kSnappyCompression:kSnappyCompression
  18. ...
  19. [TableOptions/BlockBasedTable "default"]
  20. format_version=2
  21. whole_key_filtering=true
  22. skip_table_builder_flush=false
  23. no_block_cache=false
  24. checksum=kCRC32c
  25. filter_policy=rocksdb.BuiltinBloomFilter
  26. ....