leveldb 源碼筆記

設計思路

LSM-Tree(Log Structure Merge Tree),將磁盤的隨機寫轉(zhuǎn)化為順序?qū)?,加快了寫速度。LSM-Tree的思路是將索引樹拆成一大一小兩棵樹,較小的常駐內(nèi)存,較大的持久化到磁盤,他們共同維護一個有序的key空間。寫操作會首先操作內(nèi)存中的樹,隨著內(nèi)存不斷變大,會觸發(fā)磁盤中樹的歸并操作(將內(nèi)存中的數(shù)據(jù)與磁盤中的數(shù)據(jù)進行歸并),而歸并操作本身僅有順序?qū)憽?隨著數(shù)據(jù)不斷寫入,磁盤中的樹會不斷膨脹,為了避免每次參與歸并操作的數(shù)據(jù)量過大,以及優(yōu)化讀操作做考慮,LevelDB將磁盤中的數(shù)據(jù)又拆分成多層,每一層的數(shù)據(jù)達到一定容量后會觸發(fā)向下一層的歸并操作

Memtable 內(nèi)存數(shù)據(jù)結(jié)構,跳表實現(xiàn),新的數(shù)據(jù)會首先寫入這里

Log 文件,寫Memtable前會先寫Log文件,Log通過append的方式順序?qū)懭?。Log使機器宕機導致的內(nèi)存數(shù)據(jù)丟失得以恢復

Immutable Memtable 達到Memtable上限后,Memtable會變成Immutable,為SST文件的歸并做準備

SST文件 磁盤數(shù)據(jù)存儲文件,分為Level0 到 LevelN多層,單層SST文件總量隨著層次增加成倍增長,文件內(nèi)數(shù)據(jù)有序。其中Level0的SST文件由Immutable 直接dump產(chǎn)生。其他Level的SST由其上一層的文件和本層文件歸并產(chǎn)生; SST文件在歸并中順序?qū)?,生成后僅可能在歸并中被刪除,而不會有任何的修改操作

Manifest 記錄SST文件在不同的Level的分布,單個SST文件的最大最小值

Current Manifest可能有多個,記錄當前Manifest的文件名

Slice

為什么不用引用而用Slice結(jié)構

Slice允許value中包含\0結(jié)尾

Option

the speed of kSnappyCompression 200~500MB/s compression, 400~800MB/s decompression

異步寫: 寫操作從用戶進程傳遞到操作系統(tǒng)就返回了,而操作系統(tǒng)從內(nèi)存到持久化存儲是異步的??梢酝ㄟ^fsync使寫數(shù)據(jù)同步到存儲后再返回, 異步寫入比同步寫入快很多 。使用異步寫入,如果只是寫入進程掛了,不會丟失任何數(shù)據(jù),但是機器crash就會丟失誰

WriteOptions.sync 設置為true,相當于調(diào)用write后再使用fsync

Option包含ReadOption和WriteOpion,以及普通的Option

Env

函數(shù)返回值,使用Status代替 true/false

File分為 SequentialFile, RandomFile,AppendFIle等,讀入的數(shù)據(jù),放入scratch中,根據(jù)scratch生成slice對象

Read(size_t n, Slice* result, char* scratch)

Status

錯誤信息采字符串,前三位表示長度,第四位表示類型,第五位之后表示信息

write

fwrite/fread/fflush是c語言規(guī)定的io流操作

用戶程序(fwrite)用戶緩存區(qū)(write/fflush)內(nèi)核緩沖區(qū)(fsync)物理設備

util/coding

通過左移右移和 位與運算,取特定位值,例:(value >> 8) & 0xff 取第二個字節(jié)

通過或運算,設置某個特定的位

Varint 通過變長字節(jié)編碼,可以節(jié)省空間。但壞處是大數(shù)需要用5個字節(jié)表示了。 每個字節(jié)第一位為1的話,表示連續(xù)上一個數(shù)字,因此一個字節(jié)可以表示小于127的數(shù)字

SequenceNumber

一共64位,其中sequenceNum只占56bit,valueType占8bit

SkipList

使用arena管理內(nèi)存,arena相當于內(nèi)存池

實現(xiàn)簡單,相比B樹系列,更加輕量,SequenceNumber保證了不會有相同的node,也就保證了node不會更新的情況

迭代器類實現(xiàn)在類的定義中

memory order:

1、memory_order_seq_cst 順序一致性模型
2、memory_order_release/acquire/consume 提供release,acquire或者consume,release語義一致性保障
3、relexed consisency model 松散一致性模型

Compact

1層文件總大小上限10MB,2層為100MB,以此類推,最高層(7層)沒有限制

Version

FileName

管理不同filename,將文件名封裝為函數(shù),控制文件名后綴

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容