leveldb原始碼剖析1 4 基礎概述之儲存格式

2021-10-08 21:13:10 字數 2524 閱讀 5390

2 sstable檔案

3 manifest檔案

4 current檔案

前面講了leveldb的關鍵檔案,現在主要介紹各類關鍵檔案的資料格式,這對我們閱讀和理解leveldb原始碼是很有必要的。特別地,下面所有數字都是小端儲存。

leveldb將put/delete/write封裝成writebatch物件,然後將writebatch序列化後寫入log檔案。其中writebatch序列化後的格式如下:

count:該batch包含的kv運算元量。

valuetype:kv操作型別,刪除資料為0,否則為1。

keylength:key值長度。

key content:key值,長度等於keylength。

valuelength:value值長度。

value content:value值,長度等於valuelength。

每個writebatch按照不超過(32k-7byte)大小以幀寫入log檔案,其中7 byte為幀頭。同時,它以32k為乙個資料單位或者說資料塊對齊,當多個不足(32k-7byte)的writebatch有序寫入時,若最後剩餘位元組小於7 byte,那麼它就會以「0x00」填充,即確保幀頭必須落在乙個32k範圍內。

log檔案幀格式如下:

sstable是持久化檔案,其總體格式如下:

整個檔案分為五部分:data block、meta block、meta index block、data index block和footer。其中meta index block指向每個meta block,目前meta只有一種,即過濾器。所以,meta block目前只有乙個;同樣,data index block指向每個data block。

目前meta block只儲存filter,也就是為了判斷在某個block中是否存在某個key的點陣圖。與data block不同的是filter block只有乙個。

與data block類似,整個單元由compression data、compressiontype和crc三部分組成。只是compression data為固定值knocompression。

compression data由三部分組成,前面連續的filter bitmap陣列、中間的filter起始偏移、末尾的filter起始偏移和filterbaselg,其中filterbaselg為固定值11。

每個data block對應乙個filter bitmap,但filter index與filter bitmap卻不是一對一的。假設某個data block在檔案內的起始偏移為9k、長度為5k,那麼第4個(即9k/2k取整)filter index指向該data block對應的filter bitmap的開始,此外,後面還有2個(即14k/2k - 4 -1)filter index指向filter bitmap的末尾。特別地,2k也就是1左移filterbaselg位的值。

meta index block與data block結構完全一致,也是儲存kv。特殊的是:meta index block中的key為固定值「filter.」+filtername、value是meta block的起始檔案位置和塊大小。value格式如下:

注:meta index block目前只有一項。

同樣,data index block與data block結構完全一致,也是儲存kv。其key為大於或等於對應的data block的最後乙個key值、同時小於或等於下乙個data block的第乙個key值;value是對應的data block的起始檔案位置和塊大小。value格式與meta index block的value完全一致,格式如下:

footer由三段組成,第一段指向第乙個meta index block的檔案內偏移和所有meta index block資料大小;第二段指向第乙個data index block的檔案內偏移和所有data index block資料大小;第三段是先將ktablemagicnumber的高32位按四位元組儲存、再將低32位按四位元組儲存。其結構如下:

注:ktablemagicnumber為固定值,即0xdb4775248b80fb57。

manifest也是一種log檔案,大的格式與log檔案相同,裡面儲存的資料稍微比writebatch複雜。manifest每幀格式如下:

注:data content內部分為8種資料。如果某一tag的資料不存在,就會空著,例如tag=3的不存在、tag=4的存在,那麼tag=9的資料段後面就跟著tag=4的資料。

current檔案就是乙個文字檔案,裡面記錄著當前manifest檔案全名並以「\n」結尾。

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原始碼剖析1 1 基礎概述之原始碼搭建

leveldb是乙個開源的單機kv儲存庫,其作者是谷歌工程師jeff dean和sanjay ghemawat。很多開源lsm儲存引擎都基於或使用leveldb,例如rocksdb。關鍵原始碼目錄介紹 其中,db和table是功能的核心,部分資料結構在util中。如果沒做過資料庫引擎的人,建議看 以...