LevelDB源碼解析4. 架構設計

通過LevelDB源碼解析3. 基本思路 已經知道了LevelDB的基本思路。接下來把具體的架構進行相應的設計。

LevelDB架構

寫流程

有了整體架構,資料庫的寫入順序如下:

  1. 先寫Log文件。也就是WAL Log。
  2. 再把數據更新到Memtable。Memtable是一個內存實現的KV表。
  3. 當Memtable size超過一定限制的時候,把Memtable整理成一個ImuTable。也就是不可更改的KV表。
  4. 把不可更改的KV表寫入到磁碟。然後釋放相應的Log文件的空間。
  5. 當Level0 SST文件大小太多的時候,Level 0 SST會與後面的層級進行合併,保證有序性。
  6. Level 1 SST與更高的層次的合併也是這樣。

需要注意的是,大多數時候,寫入流程進行到1和2就可以結束了。但是當數據量特別大的時候,後台有可能是在進行數據的合併操作。這個時候對於寫入速度會打一定的折扣。

數據寫入的流程

圖中的GFS應該換成levelDB。

讀流程

讀KV的流程也是類似。

  1. 先去Memtable中查找相應的鍵值,看一下是否存在。如果存在。那麼返回相應的Value。這個時候讀是最快的。
  2. 不過運氣一般都沒有那麼好。讀的時候數據不一定在這個活躍的內存裡面。這個時候就需要去ImuTable這個不可變的內存塊裡面碰運氣了。如果運氣好,如果能夠直接找到。那麼這個時候速度還算是夠快的。因為都是在內存裡面進行操作。
  3. 如果在Memtable和imuTable裡面都沒有找到。那麼這個時候就需要去磁碟塊裡面查找了。
  4. 從數據的新舊程度上來說。Level 0裡面的數據塊是最新的。Level 1其次。所以在查找的時候,也是照著這個順序查找。一個一個翻文件,如果翻到了就返回。如果沒有翻到,那麼就只能說讀取失敗。

LevelDB的讀取流程

Manifest

如果看最頂上的架框,會發現除了Log/Memtable/ImuTable/SST這四個模塊之外,還有其他什麼CURRENT, Manifest文件。這兩個文件又是做什麼用的呢?

所有涉及到SSTable的文件的操作都會在這裡做上相應的記錄。

  1. MANIFEST 文件中記錄了 LevelDB 中所有層級中的表、每一個 SSTable 的 Key 範圍和其他重要的元數據,
  2. 它以日誌的格式存儲
  3. 所有對文件的增刪操作都會追加到這個日誌中。

Current

Current文件是幹什麼的呢?這個文件的內容只有一個信息,就是記載當前的manifest文件名。

引用

  • 淺析 Bigtable 和 LevelDB 的實現
  • leveldb之MANIFEST

推薦閱讀:

又見Rx——Rx via UniRx
Dive Into Code: VSCode 源碼閱讀(一)
TiDB 源碼閱讀系列文章(三)SQL 的一生
ROS導航包源碼學習4 --- 全局規劃

TAG:LevelDB | 資料庫 | 源碼閱讀 |