LevelDB:整體架構(gòu)

整體架構(gòu)

LevelDB 整體架構(gòu).png

上圖簡單展示了 LevelDB 的整體架構(gòu)。LevelDB 的靜態(tài)結(jié)構(gòu)主要由六個部分組成:

  1. MemTable:內(nèi)存數(shù)據(jù)結(jié)構(gòu),具體實現(xiàn)是 SkipList。 接受用戶的讀寫請求,新的數(shù)據(jù)修改會首先在這里寫入。
  2. Immutable MemTable:當(dāng) MemTable 的大小達(dá)到設(shè)定的閾值時,會變成 Immutable MemTable,只接受讀操作,不再接受寫操作,后續(xù)由后臺線程 Flush 到磁盤上。
  3. SST Files:Sorted String Table Files,磁盤數(shù)據(jù)存儲文件。分為 Level0 到 LevelN 多層,每一層包含多個 SST 文件,文件內(nèi)數(shù)據(jù)有序。Level0 直接由 Immutable Memtable Flush 得到,其它每一層的數(shù)據(jù)由上一層進行 Compaction 得到。
  4. Manifest Files:Manifest 文件中記錄 SST 文件在不同 Level 的分布,單個 SST 文件的最大、最小 key,以及其他一些 LevelDB 需要的元信息。由于 LevelDB 支持 snapshot,需要維護多版本,因此可能同時存在多個 Manifest 文件。
  5. Current File:由于 Manifest 文件可能存在多個,Current 記錄的是當(dāng)前的 Manifest 文件名。
  6. Log Files (WAL):用于防止 MemTable 丟數(shù)據(jù)的日志文件。

粗箭頭表示寫入數(shù)據(jù)的流動方向:

  1. 先寫入 MemTable。
  2. MemTable 的大小達(dá)到設(shè)定閾值的時候,轉(zhuǎn)換成 Immutable MemTable。
  3. Immutable Table 由后臺線程異步 Flush 到磁盤上,成為 Level0 上的一個 sst 文件。
  4. 在某些條件下,會觸發(fā)后臺線程對 Level0 ~ LevelN 的文件進行 Compaction。

讀操作的流動方向和寫操作類似:

  1. 讀 MemTable,如果存在,返回。
  2. 讀 Immutable MemTable,如果存在,返回。
  3. 按順序讀 Level0 ~ Leveln,如果存在,返回。
  4. 返回不存在。

參考文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容