【leveldb】SSTable(十一):存儲結構說明

針對SSTable的結構說明,這篇博客已有介紹,可點此鏈接查看,leveldb整體架構
本篇是針對SStable結構的進一步擴展介紹說明。系列文章的分析都是基於leveldb 1.22版本分析的。

SSTable文件結構

落地的SSTable文件結構如下圖1
在這裏插入圖片描述

圖1

其中Data blockMeta blockMetablock indexindex block都屬於Block,
Footer是單獨的數據格式。

1.Block結構

在這裏插入圖片描述

圖2
2.Footer結構

Footer結構共佔用48Byte,組成如下:
在這裏插入圖片描述

圖3

字段含義如下:

  • magic默認佔用8Byte。
  • metaindex_block_handle指出metaindex Block中SSTable中的偏移位和大小。
    由offset+size組成,二者都是Varint64編碼,每個Varint64最多佔用10個字節,
    亦即mataindex_block_handle最多佔用20Byte。
  • index_block_handle同理metaindex_block_handle,它是指出Index Block在
    SSTable中的偏移位和大小,同樣由offset+size組成。
  • padding_byte就是在metaindex_block_handle和
    index_block_handle不夠40Byte進行的填充。

Data Block結構

Data Block由三部分組成:

  • 每個KV對,即Entry塊。
  • 重啓點restart[]。
  • 重啓點的個數。

具體參考結構如下:
在這裏插入圖片描述

圖4

每個Entry的KV是來自於Memtable,對Memtable不熟悉的可點此鏈接:Memtable解析

這裏的Key是指Memtable的InternalKey,Value就是Value。Memtable中的InternalKey結構如下:
在這裏插入圖片描述

圖5

對於Data Block中各個字段的含義可點擊博文開頭部分鏈接查看,更詳細的解釋留到代碼分析部分去說明。

Index Block

每寫完一個Data block(4KByte大小,刷新到磁盤),就會往Index Block中寫入此Data block的一條記錄。接下來看下Index Block的邏輯結構:
在這裏插入圖片描述

圖6

Index Block與Data Block的關係,如下圖:
在這裏插入圖片描述

圖7

對於Index字段的解析如下:

  • Key: 記錄大於等於數據塊i中最大的 key 值的那個 key。在索引裏保存的這個
    key 值未必一定是某條記錄的 key,以上的例子來說,假設數據塊i的最小key=“samecity”,
    最大key=“the best”;數據塊i+1的最小key=“the fox”,最大key=“zoo”,那麼對於數據塊i的
    索引 index i 來說,其第一個字段記載大於等於數據塊i的最大Key(“the best”) 同時要小於數
    據塊i+1的最小Key(“the fox”),所以例子中 index i 的第一個字段是 “the c”,這個是滿足要求
    的;而 index i+1 的第一個字段則是 “zoo”,即數據塊i+1的最大 key。
  • Offset: 指出數據塊 i 在 .sst 文件中的起始位置。
  • Size: 指出 Data Block i 的大小(有時候是有數據壓縮的)。

Meta Block

當前版本leveldb用到的Meta Block只有 Filter Block。每個SSTable中只有一個Filter Block,
其結構如下:
在這裏插入圖片描述

圖8

字段說明如下:

  • 每個Filter大小是2KBte。
  • Filter_N Offset存的是對應的Filter在Filter Block中的偏移位。
  • Filter Offset Offset指向Filter_N Offset在Filter Block中的起始偏移位。
  • Base Lg是個結束標誌,爲11,亦表示一個Filter的大小。

Metablock Index

Metablock Index的結構比較簡單,就三個字段:Key、Offset、Size。
Metablock Index與Meta Block(Filter Block)的關係,如下圖:
在這裏插入圖片描述

圖9

對於Metablock Index字段解析如下:

  • Key:一般就是filter.“過濾策略名稱”。
  • Offset:指出Filter Block在SSTable中的偏移位。
  • Size:指出這個Filter Block的大小。

總結

本篇主要是對SSTable中涉及到的存儲結構做個說明,對各個存儲結構模塊的代碼解析後續文章會一一道來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章