1. 程式人生 > >Bitcask:A Log-Structured Hash Table for Fast Key/Value Data 閱讀筆記

Bitcask:A Log-Structured Hash Table for Fast Key/Value Data 閱讀筆記

一個Bitcask例項就是一個目錄,我們保證在一個時刻只有一個系統程序可以開啟Bitcask進行寫操作。
在一個時刻,只有一個檔案是“active”的。當檔案達到一定的大小限制就會關閉,並建立一個新的“active”檔案。
一旦一個檔案關閉了,就視為是不可變的,即不會再開啟來進行寫操作。
在這裡插入圖片描述

“active”file是以追加的方式來進行寫操作,意味著順序寫不會導致磁碟搜尋。

一個key-value entry的結構如下:
在這裡插入圖片描述
一個Bitcask資料檔案的結構如下所示:
在這裡插入圖片描述

當追加完成之後,一個在記憶體中的稱為“keydir”的結構就已經更新了。一個keydir就是一個雜湊表,每一個key

都對映到一個包含檔案、偏移量、大小等資訊的結構體。大概看起來像是這樣:
在這裡插入圖片描述

當一個寫操作發生時,keydir會自動更新資料。雖然舊資料還存在磁碟中,但是新的讀操作將會根據keydir讀取到最新版本的資料。之後會講解merge process來移除舊資料。

讀操作的流程如下:
在這裡插入圖片描述

這個簡單的模型的一個問題是會浪費很多空間。因此要用一個merge process來解決。

這個merge process會遍歷所有non-active在Bitcask中的檔案,然後生成一個只包含每個key最新的值的資料集合。

在合併完後,我們會建立一個稱為hint file放在每個合併資料集合的後面。

讀操作的效能依賴於作業系統的快取,也可以新增一個Bitcask內部的讀快取。