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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM