暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Rocksdb 第二课 打开关闭数据库和设置OPTION

TiDB之路 2022-03-17
3589

大家好,我们开始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:11int main(intchar**): 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

关闭数据库

完成数据库的操作后,需要正常关闭数据库并释放相关资源和对象。

  1. 删除这个数据库对象 delete db
    就可以释放资源。但如果在释放资源的过程中出现错误,可能会出现资源丢失的情况。
  2. 调用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


文章转载自TiDB之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论