整體架構(gòu)

LevelDB 整體架構(gòu).png
上圖簡單展示了 LevelDB 的整體架構(gòu)。LevelDB 的靜態(tài)結(jié)構(gòu)主要由六個部分組成:
- MemTable:內(nèi)存數(shù)據(jù)結(jié)構(gòu),具體實現(xiàn)是 SkipList。 接受用戶的讀寫請求,新的數(shù)據(jù)修改會首先在這里寫入。
- Immutable MemTable:當(dāng) MemTable 的大小達(dá)到設(shè)定的閾值時,會變成 Immutable MemTable,只接受讀操作,不再接受寫操作,后續(xù)由后臺線程 Flush 到磁盤上。
- SST Files:Sorted String Table Files,磁盤數(shù)據(jù)存儲文件。分為 Level0 到 LevelN 多層,每一層包含多個 SST 文件,文件內(nèi)數(shù)據(jù)有序。Level0 直接由 Immutable Memtable Flush 得到,其它每一層的數(shù)據(jù)由上一層進行 Compaction 得到。
- Manifest Files:Manifest 文件中記錄 SST 文件在不同 Level 的分布,單個 SST 文件的最大、最小 key,以及其他一些 LevelDB 需要的元信息。由于 LevelDB 支持 snapshot,需要維護多版本,因此可能同時存在多個 Manifest 文件。
- Current File:由于 Manifest 文件可能存在多個,Current 記錄的是當(dāng)前的 Manifest 文件名。
- Log Files (WAL):用于防止 MemTable 丟數(shù)據(jù)的日志文件。
粗箭頭表示寫入數(shù)據(jù)的流動方向:
- 先寫入 MemTable。
- MemTable 的大小達(dá)到設(shè)定閾值的時候,轉(zhuǎn)換成 Immutable MemTable。
- Immutable Table 由后臺線程異步 Flush 到磁盤上,成為 Level0 上的一個 sst 文件。
- 在某些條件下,會觸發(fā)后臺線程對 Level0 ~ LevelN 的文件進行 Compaction。
讀操作的流動方向和寫操作類似:
- 讀 MemTable,如果存在,返回。
- 讀 Immutable MemTable,如果存在,返回。
- 按順序讀 Level0 ~ Leveln,如果存在,返回。
- 返回不存在。