Overview
RocksDB 中有三個基本的數據結構概念:memtable, sstfile 和 logfile
- memtable 是個內存數據結構,新寫入會插入memtable 切回選擇性地寫入logfile。
- logfile 是一個順序寫入磁盤的文件。
- 當memtable 寫滿后,會flush 至盤上的sstfile,告知logfile 可以被安全地刪除了。 為了讓查找keys 有更好的性能,sstfile 中的數據已排序。
對RocksDB 的每次寫操作都必寫到兩個地方:
1)基於內存的數據結構memtable(達到quota 后會flush 至SST file)。
2)預寫日志-Write Ahead Log(WAL)。
如果出現異常情況,WAL 可以用來完整恢復memtable 中的數據,恢復db 的原有的狀態。默認配置下,RocksDB 通過每次用戶寫之后flush WAL,來保證進程crash 后的一致性。
WAL 的生命周期
舉例說明:RocksDB 實例db 由兩個 Column Families: "new_cf"、"default" 創建,Column Families 在RocksDB 3.0 時創建,每個key-value pair 至少對應一個Column Families,未指定則對應"default"。Column Families 提供了一種邏輯分隔db 的途徑。
當db open 后,就會創建一個新的WAL 用戶持久化所有的寫入。
DB* db;
std::vector<ColumnFamilyDescriptor> column_families;
column_families.push_back(ColumnFamilyDescriptor(
kDefaultColumnFamilyName, ColumnFamilyOptions()));
column_families.push_back(ColumnFamilyDescriptor(
"new_cf", ColumnFamilyOptions()));
std::vector<ColumnFamilyHandle*> handles;
s = DB::Open(DBOptions(), kDBPath, column_families, &handles, &db);