LevelDb實現原理

2021-07-31 07:41:23 字數 2272 閱讀 7284

leveldb本質上是一套儲存系統以及在這套儲存系統上提供的一些操作介面。為了便於理解leveldb的儲存結構以及工作流程,我們可以從兩個不同的角度來分析一下levledb的原理:靜態角度和動態角度。靜態角度:主要了解系統如何對資料進行儲存的,其資料是如何組織管理的;動態角度,主要是了解系統是如何對資料進行操作的,其操作流程是怎麼回事,系統是如何運轉起來的。

memtable是乙個跳躍表為了便於快速查詢,immutable memtable是乙個唯讀memtable,結構完全一樣。可以認為它倆是乙個雙緩衝的典型用法,當memtable滿了的時候就變為immutable memtable,然後建立乙個新的memtable,這樣原先的memtable就可以在後台用於幹其他事情了。

log檔案用於順序記錄寫入的key-value記錄,主要用於系統崩潰時恢復資料使用,不至於大批量丟失資料(依賴於fsync)

manifest檔案用於記錄每個sst檔案中key的分布情況,按照key排序後進行分段索引,在sst檔案進行合併時會更新

current檔案用於指示當前正在使用的manifest,current檔案的內容就是正在使用manifest檔名

sst檔案是資料檔案,檔案中有兩部分資料:key-value資料、索引資料用於快速查詢key

在物理磁碟上的組織結構如下圖所示(7level):

資料夾sst_0 … sst_6分別是7級level資料的存放資料夾,裡面每個檔案是乙個資料檔案,每一級比上一級的儲存容量增大10倍,當超出容量時會觸發compaction操作,與下一級進行合併並儲存到下一級中,騰出本級的儲存空間。

在leveldb中本質上只存在寫入,並不存在所謂的更新與刪除機制;更新與刪除操作是通過寫入變相來實現的。我們通過下面的操作例子進行說明:

add key:張三

update key:李四

update key:王五

上面三個操作先增加乙個key,然後更新兩次,最終的值應該是『王五』;在獲取的時候按照操作流水優先查詢最新的操作,可以獲取到最新值是『王五』。

同理刪除的時候在操作流水中標記此key已經刪除,這樣在獲取的時候得知key已經被刪也就不存在了。也就是說leveldb以最後的一次操作為最終值。

理解了上面的例子就基本算是理解了leveldb的工作原理,leveldb幹的活就是對上面流程進行優化再優化。

從上圖可以看出leveldb的一次更新操作有兩個步驟:順序寫log檔案、更新memtable;leveldb的寫入就是如此的簡單,所以說他的寫入是非常高效的,真正麻煩的是讀取操作;這也就是別人常說的leveldb適用於寫多讀少的場景。

其實一次寫入還是會觸發很多一系列後期操作的,檔案儲存的組織結構都是由這一次寫入觸發的。

通過上面的寫入流程我們可以看出資料的新舊情況:

memtable > immutable memtable > level0 > level1 > level2 …

上面對資料新舊情況的定論是下面將要討論的讀取流程的理論基礎

leveldb的讀取流程如上圖所示;按照上面的結論,優先讀取最新的結構,讀到則返回,查詢到最後還是找不到說明key不存在,所以說經常讀取不存在的資料是最耗資源的,讀取越懶惰的資料越慢,讀取越新的資料越快。

在memtable、immutable memtable查詢時就是對跳躍表的查詢,記憶體操作比較快。

在sst檔案中查詢時,先從manifest檔案中查詢是否有符合條件的分段索引,符合條件的有可能在好幾個level資料夾中都有,甚至每個資料夾中都有,優先從最新的level中進行查詢;在sst檔案中查詢時先在sst的索引資料中找到資料儲存位置,然後讀出真實資料

cache是為了快速讀取準備,主要有兩個:tablecache、blockcac

深入leveldb 初步認識leveldb

1.leveldb簡介 leveldb是google兩位工程師實現的單機版k v儲存系統,具有以下幾個特點 1.key和value都是任意的位元組陣列,支援記憶體和持久化儲存 2.資料都是按照key排序 3.使用者可以重寫排序函式 4.包含基本的資料操作介面,put key,value get ke...

levelDB簡單認識

leveldb是乙個google實現的非常高效的kv資料庫。它是乙個c c 程式語言的庫,不包含網路服務封裝,無法像一般的儲存伺服器 如mysql 那樣用客戶端來連線它,使用者應該自己封裝自己的網路伺服器。leveldb是單程序的服務,能夠支援billion級別的資料量,而且具有非常高的效能。寫資料...

leveldb文章列表

leveldb原始碼分析之可寫檔案 一 writablefile leveldb原始碼分析之可寫檔案 二 posixwritablefile leveldb原始碼分析之可寫檔案 三 datafile leveldb原始碼分析之可寫檔案 四 manifestfile leveldb原始碼分析之可寫檔案...