1. 程式人生 > >rocksdb引擎簡析

rocksdb引擎簡析

rocksdb簡介

Rocksdb是facebook開源的key-value儲存系統,其設計是基於Google開源的Leveldb,因此應用了LSM (Long Structure Merge Tree)策略。

leveldb 構架

在這裡插入圖片描述 從圖中可以看出,構成LevelDb靜態結構的包括六個主要部分:記憶體中的MemTable和Immutable MemTable以及磁碟上的幾種主要檔案:Current檔案,Manifest檔案,log檔案以及SSTable檔案。

當應用寫入一條Key:Value記錄的時候,LevelDb會先往log檔案裡寫入,成功後將記錄插進Memtable中,這樣基本就算完成了寫入操作,因為一次寫入操作只涉及一次磁碟順序寫和一次記憶體寫入,所以這是為何說LevelDb寫入速度極快的主要原因。

Log檔案在系統中的作用主要用於系統崩潰時恢復資料。當系統崩潰時,如果記憶體中的資料還沒有來得及Dump到磁碟,可以從Log檔案的記錄恢復記憶體中的Memtable。

當Memtable插入的資料佔用記憶體到了一個界限後,需要將記憶體的記錄匯出到外存檔案中,LevleDb會生成新的Log檔案和Memtable,原先的Memtable就成為Immutable Memtable,顧名思義,就是說這個Memtable的內容是不可更改的,只能讀不能寫入或者刪除。新到來的資料被記入新的Log檔案和Memtable,LevelDb後臺排程會將Immutable Memtable的資料匯出到磁碟,形成一個新的SSTable檔案。SSTable就是由記憶體中的資料不斷匯出並進行Compaction操作後形成的,而且SSTable的所有檔案是一種層級結構,第一層為Level 0,第二層為Level 1,依次類推,層級逐漸增高,這也是為何稱之為LevelDb的原因。

rockdb構架

在這裡插入圖片描述

上圖就是Rocksdb的基礎架構。Rocksdb中引入了ColumnFamily(列族, CF)的概念,所謂列族也就是一系列kv組成的資料集。所有的讀寫操作都需要先指定列族。寫操作先寫WAL,再寫memtable,memtable達到一定閾值後切換為Immutable Memtable,只能讀不能寫。後臺Flush執行緒負責按照時間順序將Immu Memtable刷盤,生成level0層的有序檔案(SST)。後臺合併執行緒負責將上層的SST合併生成下層的SST。Manifest負責記錄系統某個時刻SST檔案的檢視,Current檔案記錄當前最新的Manifest檔名。 每個ColumnFamily有自己的Memtable, SST檔案,所有ColumnFamily共享WAL、Current、Manifest檔案。

rocksdb 所做的主要優化

  1. 增加了column family,有了列簇的概念,可把一些相關的key儲存在一起
  2. 可支援多執行緒同時compation,理論上多執行緒同時comaption會比一個執行緒compation要快
  3. 增加了merge operator,也就是原地更新,優化了modify的效率
  4. 支援DB級的TTL
  5. flush與compation分開不同的執行緒池來排程,並具有不同的優先順序,flush要優於compation,這樣可以加快flush,防止stall
  6. 對SSD儲存做了優化,可以以in-memory方式執行
  7. 增加了對 write ahead log(WAL)的管理機制,更方便管理

SST檔案結構

寫流程

rocksdb寫入時,直接以append方式寫到log檔案以及memtable,隨即返回,因此非常快速。 memtable/immute memtable觸發閾值後, flush 到Level0 SST; Level0 SST觸發閾值後,經合併操作(compaction)生成level1 SST; level1 SST 合併操作生成level2 SST,以此類推,生成leveln SST.

FLUSH

Memtable --> level0 SST 每一個的column family分別有一個memtable與sstablle. 當某一coloumn family記憶體中的memory table超過閾值時,轉換成immute memtable並建立新的memtable,immute memtable由一系列的memtable組成,它們是隻讀的,可供查詢,不能更新資料。當immute memtable的數目超過設定的數值時,會觸發flush,DB會排程後臺執行緒將多個memtable合併後再dump到磁碟生成Level0中一個新的sstable檔案。

COMPACTION

Level 0 SST --> Level 1 SST -->… -->Level n SST Level0中的sstable檔案不斷累積,會觸發compaction,DB會排程後臺compaction執行緒將Level0中的sstable檔案根據key與Level1中的sstable合併並生成新的sstable,依次類推,根據key的空間從低層往上compact,最終形成了一層層的結構,層級數目是由使用者設定的。 :Level0 SST檔案中 可能有重複的key,Level1及以上level SST 中的key是唯一的。這是因為flush操作時,沒有和其他SST檔案作去重處理;而compaction時,與上級SST檔案有作merge操作

讀流程

按照 memtable --> Level 0 SST–> Level 1 SST --> … -> Level n SST的順序讀取資料。 這和記錄的新舊順序是一致的。因此只要在當前級別找到記錄,就可以返回。

查詢SST檔案時,如果SST檔案不在快取中,通常並不需要把整個SST檔案讀入記憶體。因為每個SST都有一個布隆過濾器,通過它可以快速判斷一個key不在SST中,從而節約大量的I/O操作。 注意 在LEVEL 0 SST檔案中,因同一key可能會出現在多個檔案中,需要找出所有記錄,再按時間順序取最後的記錄。