leveldb深度剖析 儲存結構 2

2021-09-24 22:43:42 字數 3055 閱讀 7080

關於ldb檔案說明:

1)ldb檔案是按照block儲存,乙個block預設大小為4kb,當記憶體資料增長到4kb則進行寫檔案操作。

2)從leveldb v1.14版本開始,資料儲存到了字尾名為ldb檔案中,不在儲存到sst檔案中。

3)乙個ldb檔案包含:data block,filter block,meta index block,data index block以及footer。其中filter block是可選的。

儲存格式整體如下:

所有的block格式都是相同的,乙個block預設大小為4kb,當block所佔記憶體空間大於4kb則flush到檔案中。乙個block可以包含多個entry,每個entry只包含三個元素:

欄位名說明

備註block contents

block儲存的內容,內容格式由上層決定。這裡可以參考下面章節

不定長,具體長度儲存在

data index block中

compression type

1位元組crc

crc資料校驗和

4位元組leveldb為了提公升效能,抽象出乙個重啟點概念,感覺挺玄乎其實就是偏移量.乙個block至少有乙個重啟點.那麼重啟點等於什麼呢? 等於16個block-entry大小.舉例說明:

例子1: 乙個block儲存了19條block-entry,每條block-entry是64位元組,那麼重啟點一共有兩個分別為0,16*64

例子2: 乙個block儲存了34條block-entry,每條block-entry是64位元組,那麼重啟點一共有三個分別為0,16*64,32*64

例子3: 乙個block儲存了1條block-entry,這條block-etnry是5kb位元組,那麼重啟點只有乙個是0

說明:1) 乙個block至少有乙個重啟點,其重啟點值為0

2) 乙個block預設大小是4kb,如果所有block-entry所佔記憶體位元組大於4kb則將這個block重新整理到檔案中,所以會出現例子3的場景

上面介紹了重啟點,下面介紹在data block型別下block contents格式如下所示:

字段說明:

序號字段

說明備註

1key值相同部分大小

本條記錄相對於上一條記錄的key,有多少字元是相同的。

varint32型別

2key值不同部分大小

本條記錄相對於上一條記錄的key,有多少字元是不同的。

varint32型別

3value大小

本條記錄value內容大小。

varint32型別

4key值不同的部分  實際內容

key值不同內容

位元組陣列

5value內容

本條記錄value實際內容

至此1-5構成一條record

6重啟點值以及重啟點個數

舉例說明,分別插入如下記錄:

記錄key值相同部分大小

key值不同部分大小

value大小

key不同內容

value內容

helloworld:my-helloworld010

13helloworld

my-helloworld

helloleveldb:my-helloleveldb

57  

15leveldb

my-helloleveldb

myhello:good07

4myhello

good

helloworld2:my-helloworld2011

14helloworld2

my-helloworld2

該部分是可選的,如果在建立db的時候指定的options中設定了filter_policy,我們可以自定義使用者過濾策略,目前leveldb提供的過濾策略為bloom filter。 當指定了filter_policy那麼在生成ldb檔案時就會儲存filter block相關資訊。

該部分是主要用於後續leveldb擴充套件使用,目前元資訊比較少,主要用於儲存filter policy名字。

index block儲存格式與data block儲存格式是一樣的,可參考data block格式,此處不再放圖展示.乙個ldb檔案中存在多個data block,每個data block在ldb中位置以及datablock實際大小都儲存在data index block中。

1)data index block有且只有乙個。

2)data index block中每乙個entry對應乙個data block元資訊,元資訊包含:data block最大internalkey,data block在ldb檔案中偏移量以及datablock實際大小。所以可以將data index block理解為data block元資訊管理者。

footer的大小始終是48位元組,最後8位元組是魔鬼數字,保證檔案有效性,儲存結構在已經給出,具體字段引數含義如下:

字段含義

meta index offset

meta index block在ldb檔案中偏移量,型別為varint64

meta index size

meta index block大小,型別為varint64

data index offset

data index block在ldb檔案中偏移量,型別為varint64

data index size

data index block大小,型別為varint64

padding

索引相關一共占用40位元組,padding是為了補齊

magicnumber

8位元組,魔鬼數字

leveldb在讀取ldb檔案時會從檔案尾部偏移48位元組,用於讀取ldb檔案元資料,並對各個字段進行解析。

leveldb原始碼剖析 編碼

leveldb是乙個google出品的單機kv資料庫。用c 編寫,量很小,大概只有1 2萬行。寫的可以用優雅來形容,毫無疑問是我至今看到的最優雅的c 而且由於 量比較小,可以直接通讀整個原始碼,了解乙個完整的kv系統的構建流程。是乙個很好的學習材料。這也是我第一次讀資料庫方面的原始碼,嘗試用部落格記...

LevelDB原始碼剖析之Memtable 1

memtable是leveldb很重要的一塊,leveldb的核心之一。我們肯定關注kv資料在memtable中是如何組織的,秘密在skip list中。在leveldb中,所有記憶體中的kv資料都儲存在memtable中,物理disk則儲存在sstable中。在系統執行過程中,如果memtable...

LevelDB之整體結構

資料庫和儲存引擎。資料庫往往是乙個比較豐富完整的系統,提供了sql查詢語言,事務和水平擴充套件等支援。然而儲存引擎則是小而精,純粹專注於單機的讀 寫 儲存。一般來說,資料庫底層往往會使用某種儲存引擎。目前開源的kv儲存引擎中,rocksdb是流行的乙個,mongodb和mysql底層可以切換成roc...