leveldb源碼解析一之你是什么鬼搪哪?

你是什么鬼靡努?

leveldb : 老子是一個單機(jī)的KV數(shù)據(jù)庫,適合寫多讀少晓折,支持持久化惑朦,支持故障恢復(fù),咋樣漓概,牛逼吧漾月?

我:聽不懂!

leveldb : 老子就是一個main函數(shù)胃珍,管理一堆文件梁肿,給你存數(shù)據(jù)讀數(shù)據(jù)!

我:哦堂鲜!

開篇來個簡單傻逼的對話栈雳,不過卻道出數(shù)據(jù)庫的本質(zhì)。數(shù)據(jù)庫就是以格式化數(shù)據(jù)存儲起來然后提供增刪改查功能而已缔莲,只不過數(shù)據(jù)量大了之后事情變得有點(diǎn)復(fù)雜哥纫。那么leveldb也是這樣一個東西。leveldb提供的是KV格式的存儲痴奏,支持二進(jìn)制數(shù)據(jù)蛀骇,那么leveldb是如何實(shí)現(xiàn)的這個的呢?

讓我們從上層開始講起!

數(shù)據(jù)之旅

既然是KV數(shù)據(jù)庫读拆,那么開始我們肯定會有個叫DB的對象擅憔。這個叫DB的對象提供啥?簡化可以理解三個接口:

1. DB.Put(key, value)
2. DB.Get(key)
3. DB.Del(key)

簡單吧檐晕!這讓你想起啥暑诸?HashMap蚌讼!對,一樣的功能个榕,卻復(fù)雜了千百倍篡石。要實(shí)現(xiàn)一個完善的數(shù)據(jù)庫系統(tǒng),還需要考慮很多東西西采,例如數(shù)據(jù)格式凰萨,例如持久化,例如高性能械馆。當(dāng)然胖眷,這些接下來慢慢聊,我們可以暫且忘記這么多煩惱霹崎,先記得這個HashMap的簡單玩具雛形珊搀。

這三個簡單的接口下面有啥啥東西?這時候應(yīng)該用一張圖說明:

網(wǎng)上借用的圖

當(dāng)我們寫入一個KV數(shù)據(jù)的時候仿畸,KV會經(jīng)過三個table和一個log食棕。
寫入數(shù)據(jù)的流程是

  1. KV寫操作會寫到log文件中,順序?qū)?/code>错沽,做持久化(系統(tǒng)崩潰會從log文件中恢復(fù),log文件也是按照一定格式的二進(jìn)制數(shù)據(jù))
  2. 寫到log文件中后會寫入memtable(一個叫跳躍表的數(shù)據(jù)結(jié)構(gòu))
  3. 之后write操作就返回成功了簿晓。

經(jīng)過上面幾步我們可以保證數(shù)據(jù)一定不會丟失了,內(nèi)存memtable丟失的數(shù)據(jù)會讀取log的操作記錄重跑一遍千埃,數(shù)據(jù)就恢復(fù)了憔儿。但是接下來數(shù)據(jù)還會被持久到磁盤中。

  1. 當(dāng)memtable的大小達(dá)到一個上限放可,那么memtable會變成Immutale memtable谒臼。這兩個table的數(shù)據(jù)結(jié)構(gòu)是一樣的,都是跳躍表,只不過后者是只讀的耀里。
  2. 這時候會產(chǎn)生一個新的memtable來支持新的寫操作
  3. Imutable memtable的內(nèi)容會定期刷到磁盤蜈缤,然后清楚對應(yīng)的log文件,生成新的log文件冯挎。
  4. 磁盤中數(shù)據(jù)的存儲格式叫sstable底哥。

由上面七步我們知道數(shù)據(jù)經(jīng)歷了memtable, imutable memtable, sstable三個table。數(shù)據(jù)的存儲格式幾乎說明了整個數(shù)據(jù)庫的精髓房官,所以這三個數(shù)據(jù)結(jié)構(gòu)后面都會詳細(xì)講解趾徽!現(xiàn)在我們先感性認(rèn)識一下數(shù)據(jù)流程以及l(fā)eveldb如何保證數(shù)據(jù)持久化的。

leveldb: 那么現(xiàn)在可以回答數(shù)據(jù)持久化是如何實(shí)現(xiàn)的嗎翰守?

我:嗯孵奶,好像跟一個log文件有關(guān)!

leveldb: 對頭蜡峰,一次寫KV操作需要一次磁盤的順序?qū)懀╨og文件)和一次內(nèi)存寫(寫入metable)了袁,所以寫效率是非常高的朗恳。如果內(nèi)存中數(shù)據(jù)丟失,我們會讀取log文件的操作指令重跑一遍早像,數(shù)據(jù)就可以恢復(fù)了僻肖。當(dāng)KV數(shù)據(jù)到達(dá)sstable之后肖爵,舊的log文件會被刪除并且產(chǎn)生新的log文件卢鹦。所以我們可以保證數(shù)據(jù)不丟失!

為啥叫l(wèi)eveldb劝堪?

還記得我們上面講那三個table嗎冀自?

1. memtable
2. Imuable memtable
3. sstable( Sorted String Table)

其中1和2都是跳躍表,然而我們還沒講到3sstable是什么數(shù)據(jù)結(jié)構(gòu)秒啦?sstable什么鬼熬粗?就是傳說中g(shù)oogle三大論文之一的Bigtable中的那個sstable。這個東西大概長這樣:

sstable

圖中紅色框部分就是他的樣子余境。

level0是由Imuabletable memtable直接dump到磁盤中的驻呐,level1是由level0經(jīng)過compaction獲得,level2是由level1經(jīng)過compaction獲得芳来,以此類推含末。其中每個文件后綴為.sst, 每個level中的文件數(shù)都是有限制的,超過了限制則會被compaction到更高level的層次上去即舌,所以這個東西叫l(wèi)eveldb佣盒。其中每一個level符合以下規(guī)則:

1. level0中的單個文件(sst)是有序的,但是文件與文件之間是無序的并且有可能有重合的key
2. level 1 ~ level n 每一個level中在自己level中都是全局有序的
3. mainifest文件中包含了每一個sst文件的最小key和最大key顽聂,方便查找

上面只是簡單講解以下整體結(jié)構(gòu)肥惭,后面會深入其細(xì)節(jié)。但是在那之前紊搪,先建立一個宏觀感受是非常重要的蜜葱。

前面我們講解了數(shù)據(jù)的存儲整體結(jié)構(gòu),那么理解數(shù)據(jù)是怎么被查找的就非常簡單了耀石。查找依次經(jīng)過:

1. memtable
2. Imuable memtable
3. level 0
4. level 1 
 ......

上面步驟非常清晰牵囤。首先查找會先經(jīng)過memtable查找,找不到就依次按順序往下找娶牌,一直找不到就返回empty了奔浅。當(dāng)然,中間有很多細(xì)節(jié)優(yōu)化诗良,這里先不深入去理解汹桦,例如會通過布隆算法過濾掉不存在的key。后面講到filter的時候會深入講解鉴裹。

刪除

數(shù)據(jù)庫的數(shù)據(jù)當(dāng)以一種格式化存儲在一起舞骆,要刪掉某部分就要移動剩下部分往前移動钥弯,這是代價很大的。所以:

leveldb沒有實(shí)際的刪除操作督禽,就是write一個刪除標(biāo)記和key進(jìn)去

啥意思脆霎?我們都知道所有key的插入都是時間有序的,從memtable到level n一路飛奔狈惫,從不回頭睛蛛。
所以我們假如我們添加了key為name, value 為戈風(fēng)的數(shù)據(jù)進(jìn)去之后,我們要刪除key為name的記錄胧谈,我們只需要再插入一條 name del(標(biāo)志)忆肾,這樣我們查找的時候就會先遇到name del表示key已經(jīng)被刪除,返回empty菱肖。

除了這個時間有序之外客冈,在level n compaction到level n + 1的時候如果發(fā)現(xiàn)有刪除的key,這時候就會真正刪除它稳强。

尾記

從前面的講述场仲,我相信我們應(yīng)該心中對leveldb有了一個大概的印象,下面我們會慢慢把印象具體起來退疫,把細(xì)節(jié)豐富出來渠缕,構(gòu)造一個3d立體的理解結(jié)構(gòu)。那么蹄咖,前面涉及到了幾個leveldb的模塊呢褐健?

1. memtable
2. Imuable memtable(其實(shí)我跟1是親兄弟啦)
3. sstable
4. log
5. filter

這幾個模塊就是leveldb的重中之重了。在有了一個大框架之后澜汤,我們需要進(jìn)入一點(diǎn)細(xì)節(jié)了蚜迅。好了,本章到此為止俊抵!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谁不,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子徽诲,更是在濱河造成了極大的恐慌刹帕,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谎替,死亡現(xiàn)場離奇詭異偷溺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钱贯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門挫掏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人秩命,你說我怎么就攤上這事尉共“担” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵袄友,是天一觀的道長殿托。 經(jīng)常有香客問我,道長剧蚣,這世上最難降的妖魔是什么支竹? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮券敌,結(jié)果婚禮上唾戚,老公的妹妹穿的比我還像新娘。我一直安慰自己待诅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布熊镣。 她就那樣靜靜地躺著卑雁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绪囱。 梳的紋絲不亂的頭發(fā)上测蹲,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音鬼吵,去河邊找鬼扣甲。 笑死,一個胖子當(dāng)著我的面吹牛齿椅,可吹牛的內(nèi)容都是我干的琉挖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼涣脚,長吁一口氣:“原來是場噩夢啊……” “哼示辈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起遣蚀,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤矾麻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后芭梯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體险耀,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年玖喘,在試婚紗的時候發(fā)現(xiàn)自己被綠了甩牺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡芒涡,死狀恐怖柴灯,靈堂內(nèi)的尸體忽然破棺而出卖漫,到底是詐尸還是另有隱情,我是刑警寧澤赠群,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布羊始,位于F島的核電站,受9級特大地震影響查描,放射性物質(zhì)發(fā)生泄漏突委。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一冬三、第九天 我趴在偏房一處隱蔽的房頂上張望匀油。 院中可真熱鬧,春花似錦勾笆、人聲如沸敌蚜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弛车。三九已至,卻和暖如春蒲每,著一層夾襖步出監(jiān)牢的瞬間纷跛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工邀杏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贫奠,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓望蜡,卻偏偏與公主長得像唤崭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泣特,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • LevelDB是Google傳奇工程師Jeff Dean和Sanjay Ghemawat開源的KV存儲引擎浩姥,無論從...
    CatKang閱讀 4,841評論 5 25
  • 版本控制或元信息管理,是LevelDB中比較重要的內(nèi)容状您。本文首先介紹其在整個LevelDB中不可替代的作用勒叠;之后從...
    CatKang閱讀 5,489評論 12 12
  • 前面寫了兩篇文章介紹 LevelDB 的整體架構(gòu)和接口使用。這篇文章膏孟,我們從代碼的角度看看 LevelDB 的設(shè)計...
    linjinhe閱讀 5,515評論 0 1
  • 昨天單位停電眯分,對于我們這些程序員,沒了電腦只能放假柒桑。因?yàn)闆]帶鑰匙弊决,就在樓下的樹蔭下看書,書是剛買的,《社會心理學(xué)》...
    賈老師和他的朋友們閱讀 263評論 0 0
  • 今天開始用新方法飘诗,閱讀李笑來老師的專欄《通往財富自由之路》 7月27日《我為什么要開這個專欄》 ...
    素樸之行閱讀 404評論 0 1