LevelDB源碼解析4. 架構設計
05-12
通過LevelDB源碼解析3. 基本思路 已經知道了LevelDB的基本思路。接下來把具體的架構進行相應的設計。
寫流程
有了整體架構,資料庫的寫入順序如下:
- 先寫Log文件。也就是WAL Log。
- 再把數據更新到Memtable。Memtable是一個內存實現的KV表。
- 當Memtable size超過一定限制的時候,把Memtable整理成一個ImuTable。也就是不可更改的KV表。
- 把不可更改的KV表寫入到磁碟。然後釋放相應的Log文件的空間。
- 當Level0 SST文件大小太多的時候,Level 0 SST會與後面的層級進行合併,保證有序性。
- Level 1 SST與更高的層次的合併也是這樣。
需要注意的是,大多數時候,寫入流程進行到1和2就可以結束了。但是當數據量特別大的時候,後台有可能是在進行數據的合併操作。這個時候對於寫入速度會打一定的折扣。
圖中的GFS應該換成levelDB。
讀流程
讀KV的流程也是類似。
- 先去Memtable中查找相應的鍵值,看一下是否存在。如果存在。那麼返回相應的Value。這個時候讀是最快的。
- 不過運氣一般都沒有那麼好。讀的時候數據不一定在這個活躍的內存裡面。這個時候就需要去ImuTable這個不可變的內存塊裡面碰運氣了。如果運氣好,如果能夠直接找到。那麼這個時候速度還算是夠快的。因為都是在內存裡面進行操作。
- 如果在Memtable和imuTable裡面都沒有找到。那麼這個時候就需要去磁碟塊裡面查找了。
- 從數據的新舊程度上來說。Level 0裡面的數據塊是最新的。Level 1其次。所以在查找的時候,也是照著這個順序查找。一個一個翻文件,如果翻到了就返回。如果沒有翻到,那麼就只能說讀取失敗。
Manifest
如果看最頂上的架框,會發現除了Log/Memtable/ImuTable/SST這四個模塊之外,還有其他什麼CURRENT, Manifest文件。這兩個文件又是做什麼用的呢?
所有涉及到SSTable的文件的操作都會在這裡做上相應的記錄。
- MANIFEST 文件中記錄了 LevelDB 中所有層級中的表、每一個 SSTable 的 Key 範圍和其他重要的元數據,
- 它以日誌的格式存儲
- 所有對文件的增刪操作都會追加到這個日誌中。
Current
Current文件是幹什麼的呢?這個文件的內容只有一個信息,就是記載當前的manifest文件名。
引用
- 淺析 Bigtable 和 LevelDB 的實現
- leveldb之MANIFEST
推薦閱讀:
※又見Rx——Rx via UniRx
※Dive Into Code: VSCode 源碼閱讀(一)
※TiDB 源碼閱讀系列文章(三)SQL 的一生
※ROS導航包源碼學習4 --- 全局規劃