RocksDB 之Write Ahead Log(WAL)

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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章