从RocksDB4.3开始,我们加了一系列功能来简化RocksDB的设置。
通过上面这些选项文件的支持,开发者再也不用维护以前的RocksDB数据库对象的配置集。另外,如果需要修改选项,CheckOptionsCompatibility可以保证新的配置集可以在不损坏已有数据的情况下打开同一个RocksDB数据库。
这里有一个可以运行的示例,用于展示新的功能是如何让管理RocksDB选项更简单的。一个更加完整的例子可以在examples/options_file_example.cc 里找到。
假设我们打开一个RocksDB数据库,然后在运行过程中创建一个新的列族,然后关闭数据库:
s = DB::Open(rocksdb_options, path_to_db, &db);
...
// 创建列族,然后rocksdb会保存这些选项。
ColumnFamilyHandle* cf;
s = db->CreateColumnFamily(ColumnFamilyOptions(), "new_cf", &cf);
...
// 关闭 DB
delete cf;
delete db;
从RocksDB4.3之后,每个RocksDB实例都会自动将最新的配置存储在一个配置文件,下次打开数据库的时候,我们可以利用这个配置文件来构造新的选项对象。这跟RocksDB 4.2以及更老的版本不同,我们再也不用为了打开一个数据库而记住所有列族的选项了。我们看看要如何做。
首先,我们使用LoadLatestOptions加载目标DB最新的设置:
DBOptions loaded_db_opt;
std::vector<ColumnFamilyDescriptor> loaded_cf_descs;
LoadLatestOptions(path_to_db, Env::Default(), &loaded_db_opt,
&loaded_cf_descs);
由于c++没有反射机制,以下需要使用用户定义的函数以及指针类型的配置项,只能被初始化为默认值。详细信息可以参考rocksdb/utilities/options_util.h:
对于那些不支持的用户定义函数,开发者需要手动指定他们。在这个例子,我们初始化BlockBasedTableOptions里的缓存和CompactionFilter:
for (size_t i = 0; i < loaded_cf_descs.size(); ++i) {
auto* loaded_bbt_opt = reinterpret_cast<BlockBasedTableOptions*>(
loaded_cf_descs[0].options.table_factory->GetOptions());
loaded_bbt_opt->block_cache = cache;
}
loaded_cf_descs[0].options.compaction_filter = new MyCompactionFilter();
现在我们执行安全性检查,确保新的选项可以安全打开目标数据库:
Status s = CheckOptionsCompatibility(
kDBPath, Env::Default(), db_options, loaded_cf_descs);
如果返回的值是OK,我们就可以继续使用加载起来的选项来打开目标数据库了:
s = DB::Open(loaded_db_opt, kDBPath, loaded_cf_descs, &handles, &db);
RocksDB选项文件是一个 INI文件格式 的text文件。每个RocksDB配置文件都一个版本号段,一个DBOptions段以及对每个列族,有一个CFOptions和TableOptions段。以下是一个示例的RocksDB选项文件。一个完整的示例可以在 examples/rocksdb_option_file_example.ini找到
[Version]
rocksdb_version=4.3.0
options_file_version=1.1
[DBOptions]
stats_dump_period_sec=600
max_manifest_file_size=18446744073709551615
bytes_per_sync=8388608
delayed_write_rate=2097152
WAL_ttl_seconds=0
...
[CFOptions "default"]
compaction_style=kCompactionStyleLevel
compaction_filter=nullptr
num_levels=6
table_factory=BlockBasedTable
comparator=leveldb.BytewiseComparator
compression_per_level=kNoCompression:kNoCompression:kNoCompression:kSnappyCompression:kSnappyCompression:kSnappyCompression
...
[TableOptions/BlockBasedTable "default"]
format_version=2
whole_key_filtering=true
skip_table_builder_flush=false
no_block_cache=false
checksum=kCRC32c
filter_policy=rocksdb.BuiltinBloomFilter
....