分析rocksdb 打开,关闭流程中,都做了什么,有哪些相关类及技术点;本篇文章从总体上进行阐述,对相关概念进行初步解释和整体流程理解,后续文章会分别就Options,MANIFEST等关键概念进行单独解读。
在空目录下,执行DB::Open操作及关闭操作
//创建rocks目录
DB* db;
Options options;
options.create_if_missing = true;
std::string dirPath = "/home/rocksdata";
Status s = DB::Open(options, dirPath, &db);
assert(s.ok());
delete db;
空目录下执行后产生的文件
-rw-r--r--. 1 root root 0 Sep 15 06:40 000005.log
-rw-r--r--. 1 root root 16 Sep 15 06:40 CURRENT
-rw-r--r--. 1 root root 37 Sep 15 06:40 IDENTITY
-rw-r--r--. 1 root root 0 Sep 15 06:40 LOCK
-rw-r--r--. 1 root root 22098 Sep 15 06:41 LOG
-rw-r--r--. 1 root root 57 Sep 15 06:41 MANIFEST-000004
-rw-r--r--. 1 root root 6209 Sep 15 06:40 OPTIONS-000007
(base) [root@node194 rocksdata]# cat CURRENT
MANIFEST-000004
在系统(重新)启动的时候,最新的manifest日志文件会包含一个一致的ROCKSDB的状态。任何对RocksDB状态修改的子序列都会被记录到manifest日志文件中。当一个manifest日志超过特定的大小,一个新的manifest日志文件会更新,且保证刷盘到文件系统。成功更新CURRENT文件之后,就的manifest文件就会被删掉。 MANIFEST的基本文件组成:
MANIFEST={CURRENT, MANIFEST-<seq-no>*}
CURRENT = 指向当前manifest日志的文件指针
MANIFEST-<seq-no> = 包含RocksDB状态的快照以及后续的修改
MANIFEST-000004,大小57B
(base) [root@node194 rocksdata]# cat MANIFEST-000004
V??leveldb.BytewiseComparatorˉX|Q?
IDENTITY 存放当前rocksdb的唯一标识,创建之后不会变化;
LOCK LOCK 进程的全局锁,DB一旦被open, 其他进程将无法修改,报类似以下错误。
Open rocksdb ../data/fansnum_rocksdb/ failed, reason: IO error: while open a file for lock: ../data/fansnum_rocksdb//LOCK: Permission deniedCommand init, costtime: 0.946000 ms
LOG rocksdb的操作日志文件, 可配置定期的统计信息写入LOG. 可通过info_log_level调整日志输出级别; 通过keep_log_file_num限制文件数量 等等。
000005.log WAL文件。 rocksdb在写数据时, 先会写WAL,再写memtable。为了避免crash时, memtable的数据丢失。服务重启时会从该文件恢复memtable。 在Open/Close测试中,因为没有进行Put,所以该文件为空;如果添加如下代码,.log文件将会产生内容,并在程序下次启动时,将数据写入到sst中;
s =db->Put(WriteOptions(), "key1", "value");
assert(s.ok());
多线程读
原文:https://www.cnblogs.com/yanhuiw/p/15303015.html