大家好,我们开始RocksDB第二课之旅。
这节课的主要内容是介绍RocksDB的基本操作。RocksDB官网的API是C++和JAVA。所以咱们还是用c++来驱动RocksDB吧。
打开一个数据库
RocksDB数据库执行Open之后,就会在一个目录下存放相关数据库的文件。
#include <cassert>#include <rocksdb/db.h>using namespace std;int main(int argc, char** argv) { rocksdb::DB* db; rocksdb::Options options; options.create_if_missing = true; rocksdb::Status status = rocksdb::DB::Open(options, "/tmp/testdb", &db); assert(status.ok());}
这里有个选项 options.create_if_missing
,设置为 true 表示如果数据库不存在则创建它。
g++ -std=c++11 open_rocksdb.cpp -o openrocksdb -lrocksdb
编译成功后直接运行,然后查看/tmp/testdb
中产生的文件。
./openrocksdb[root@copy-of-vm-ee-centos76-v1 testdb]# ls -lrttotal 4240-rw-r--r-- 1 root root 0 Mar 15 14:42 LOCK-rw-r--r-- 1 root root 37 Mar 15 14:42 IDENTITY-rw-r--r-- 1 root root 57 Mar 15 14:42 MANIFEST-000003-rw-r--r-- 1 root root 16 Mar 15 14:42 CURRENT-rw-r--r-- 1 root root 0 Mar 15 14:42 000004.log-rw-r--r-- 1 root root 6058 Mar 15 14:42 OPTIONS-000006-rw-r--r-- 1 root root 18602 Mar 15 14:42 LOG
如果希望在数据库已经存在的时候返回错误,再调用RocksDB.open
,可以增加下列设置。
options.setErrorIfExists(true);
我增加了这一行编译后再次运行直接返回报错。
./openrocksdb openrocksdb: open_rocksdb.cpp:11: int main(int, char**): Assertion `status.ok()' failed.
RocksDB Options
上面创建完数据库之后,有一个OPTIONS-000006
文件,该文件我们可以打开看一下。
首先上面是文件的版本和DBOptions
。

DBOptions 基本就是数据库的一些参数了。接下来还有CFOptions 和 TableOptions/BlockBasedTable

CFOptions
是和列族相关的,TableOptions
和BlockBasedTable
主要是表的属性、RocksDB与磁盘的交互的一些设置。这些参数的含义暂时不多做介绍。
对于RocksDB的Options
文件,我们有三种设置方式:
1.自动持久化Options
当rocksdb成功调用DB::Open()
,SetOptions()
,CreateColumnFamily()
,DropColumnFamily()
都会将option自动持久化到一个文件中,所以你会看到多个 OPTION-XXX
这样的文件。
2.从文件加载Options
执行LoadLatestOptions()
,LoadOptionsFromFile()
函数,开发人员可以从 OPTIONS-XXX
文件中加载选项。
3.兼容性检查
CheckOptionsCompatibility
,文档介绍较为模糊,看了一下源码

意思是如果输入 DBOptions
和 ColumnFamilyDescriptors
与存储在指定路径中的最新 OPTIONS-XXX
文件内容兼容时,则返回 Status::OK
。主要是做兼容性检查的。
那么接下来我写个例子就是第一种和第二种的结合体,直接从最后生成的 OPTION-XXX
文件中获取DBOptions
选项,然后执行打开数据库,在 OPEN 的时候它又会触发生成一个新的 OPTION-XXX
文件。
我们先把老的文件DBOptions
中的一个参数改掉。比如把max_background_flushes
改成6。
[root@copy-of-vm-ee-centos76-v1 testdb]# sed -i 's/max_background_flushes=20/max_background_flushes=6/g' OPTIONS-000061[root@copy-of-vm-ee-centos76-v1 testdb]# cat OPTIONS-000061 | grep -i max_background_flushes max_background_flushes=6
然后执行程序。
#include "rocksdb/cache.h"#include "rocksdb/compaction_filter.h"#include "rocksdb/db.h"#include "rocksdb/options.h"#include "rocksdb/slice.h"#include "rocksdb/table.h"#include "rocksdb/utilities/options_util.h"using namespace ROCKSDB_NAMESPACE; using namespace std;std::string DBPath = "/tmp/testdb";int main(int argc, char** argv) { DBOptions loaded_db_opt; DB* db; Status s; std::vector<ColumnFamilyDescriptor> loaded_cf_descs; //读取最后的OPTIONS配置文件 s = LoadLatestOptions(DBPath, Env::Default(), &loaded_db_opt, &loaded_cf_descs); assert(s.ok()); std::vector<ColumnFamilyHandle*> handles; //打开数据库 s = DB::Open(loaded_db_opt, DBPath, loaded_cf_descs, &handles, &db); assert(s.ok());}
这段程序从OPTION-000061
中读取了DBOptions
的配置,然后执行DB:Open()
又触发了将OPTION自动持久化到一个文件中的动作。

查看OPTIONS-000066
文件,可以看到里面的最新值是6。
我们也可以在数据库打开的时候进行动态设置,每执行一个SetOptions
操作,都会生成一个新的OPTION文件。
rocksdb::Status s;s = db->SetOptions({{"write_buffer_size", "131072"}});assert(s.ok());s = db->SetDBOptions({{"max_background_flushes", "2"}});assert(s.ok());
通过OPTION文件来设置这些选项是最方便的,也还有其他方法可以来设置,一种是选项字符串,另外一种是选项map,这里不多介绍。详细可以参考:选项字符串和选项Map
关闭数据库
完成数据库的操作后,需要正常关闭数据库并释放相关资源和对象。
删除这个数据库对象 delete db
就可以释放资源。但如果在释放资源的过程中出现错误,可能会出现资源丢失的情况。调用 DB::Close()
函数会返回状态,可以通过检查Status
来确定关闭过程中是否存在错误,无论是否出现错误,DB::Close()
都会释放所有资源。
Status s = db->Close();delete db;
以下是打开和关闭例子。
#include <cassert>#include <rocksdb/db.h>#include <iostream>using namespace std;int main(int argc, char** argv) { rocksdb::DB* db; rocksdb::Options options; options.create_if_missing = true;
rocksdb::Status status = rocksdb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());
status= db->Close();
if (!status.ok()) cerr << status.ToString() << endl;
delete db;
}
后记
嵌入式数据库各种操作都需要写代码,有一种从DBA干成研发的感受。
Reference
https://github.com/facebook/rocksdb/wiki/Option-String-and-Option-Map#find-the-supported-options-in-option-string-and-option-map
https://github.com/facebook/rocksdb/wiki/RocksDB-Options-File
https://github.com/facebook/rocksdb/wiki/Basic-Operations




