LevelDB 完全解析(0):基本原理和整體架構(gòu)

之前零零散散寫過幾篇和 LSM-Tree、LevelDB 有關(guān)的文章树枫。之后也看了一些代碼和論文直焙,筆記也做了一些,但大都比較零亂砂轻、隨意奔誓,沒花功夫整理。

這次打算將之前的文章和之后的筆記一起整理一下搔涝,成為一個系列文章——本文是本系列文章的第一篇厨喂。

LSM-Tree

Log Structured Merge Tree,簡稱 LSM-Tree庄呈。2006年蜕煌,Google 發(fā)表了 BigTable 的論文。這篇論文提到 BigTable 單機(jī)上所使用的數(shù)據(jù)結(jié)構(gòu)就是 LSM-Tree抒痒。
很多存儲產(chǎn)品使用 LSM-Tree 作為數(shù)據(jù)結(jié)構(gòu)幌绍,比如 Apache HBase颁褂,Apache Cassandra故响,MongoDB 的 Wired Tiger 存儲引擎,LevelDB 存儲引擎颁独,RocksDB 存儲引擎等彩届。
簡單地說,LSM-Tree 的設(shè)計(jì)目標(biāo)是提供比傳統(tǒng)的 B-Tree/B+Tree 更好的寫性能誓酒。LSM-Tree 通過將磁盤的隨機(jī)寫轉(zhuǎn)化為順序?qū)憗硖岣邔懶阅?樟蠕,而付出的代價(jià)就是犧牲部分讀性能贮聂、寫放大(B-Tree/B+Tree 同樣有寫放大的問題)。

如何優(yōu)化寫性能

如果我們對寫性能特別敏感寨辩,我們最好怎么做吓懈?—— Append only:所有寫操作都是將數(shù)據(jù)添加到文件末尾。這樣順序?qū)懙男阅苁亲詈玫拿夷蠹s等于磁盤的理論速度(無論是 SSD 還是 HDD耻警,順序?qū)懶阅芏家黠@由于隨機(jī)寫性能)。但是 append only 的方式會帶來一些問題:

  • 不支持有序遍歷甸怕。
  • 需要垃圾回收(清理過期數(shù)據(jù))甘穿。

所以,純粹的 append only 方式只能適用于一些簡單的場景:

  • 存儲系統(tǒng)的 WAL梢杭。
  • 能知道明確的 offset 的查詢温兼,比如 Bitcask

如何優(yōu)化讀性能

如果我們對讀性能特別敏感武契,一般我們有兩種方式:

  • 有序存儲募判,比如 B-Tree/B+Tree。但是 B-Tree/B+Tree 會導(dǎo)致隨機(jī)寫咒唆。
  • 哈希存儲 —— 不支持有序遍歷兰伤,適用范圍有限。

讀寫性能的權(quán)衡

如何獲得接近 append only 的寫性能钧排,而又能擁有不錯的讀性能呢敦腔?以 LevelDB/RocksDB 為代表的 LSM-Tree 存儲引擎給出了一個參考答案。原始的 LSM-Tree 可以參考論文恨溜。下面的討論主要以 LevelDB 為例子符衔。
LevelDB 的寫操作(Put/Delete/Write)主要由兩步組成:

  1. 寫日志(WAL,順序?qū)懀?/li>
  2. 寫 MemTable(內(nèi)存中的 SkipList)糟袁。

所以判族,正常情況下,LevelDB 的寫速度非诚畲鳎快形帮。

內(nèi)存中的 MemTable 寫滿后,會轉(zhuǎn)換為 Immutable MemTable周叮,然后被后臺線程 compact 成按 key 有序存儲的 SSTable(順序?qū)懀?br> SSTable 按照數(shù)據(jù)從新到舊被組織成多個層次(上層新下層舊)辩撑,點(diǎn)查詢(Get)的時(shí)候從上往下一層層查找,所以 LevelDB 的讀操作可能會有多次磁盤 IO(LevelDB 通過 table cache仿耽、block cache 和 bloom filter 等優(yōu)化措施來減少讀操作的 I/O 次數(shù))合冀。
后臺線程的定期 compaction 負(fù)責(zé)回收過期數(shù)據(jù)和維護(hù)每一層數(shù)據(jù)的有序性。在數(shù)據(jù)局部有序的基礎(chǔ)上项贺,LevelDB 實(shí)現(xiàn)了數(shù)據(jù)的(全局)有序遍歷君躺。

LevelDB 接口使用

LevelDB 提供的接口很簡單峭判,請參考官網(wǎng)文檔

LevelDB 整體架構(gòu)

LevelDB整體架構(gòu).png

上圖簡單展示了 LevelDB 的整體架構(gòu)棕叫。

  1. MemTable:內(nèi)存數(shù)據(jù)結(jié)構(gòu)林螃,具體實(shí)現(xiàn)是 SkipList。 接受用戶的讀寫請求俺泣,新的數(shù)據(jù)會先在這里寫入治宣。
  2. Immutable MemTable:當(dāng) MemTable 的大小達(dá)到設(shè)定的閾值后,會被轉(zhuǎn)換成 Immutable MemTable砌滞,只接受讀操作侮邀,不再接受寫操作,然后由后臺線程 flush 到磁盤上 —— 這個過程稱為 minor compaction贝润。
  3. Log:數(shù)據(jù)寫入 MemTable 之前會先寫日志绊茧,用于防止宕機(jī)導(dǎo)致 MemTable 的數(shù)據(jù)丟失。一個日志文件對應(yīng)到一個 MemTable打掘。
  4. SSTable:Sorted String Table华畏。分為 level-0 到 level-n 多層,每一層包含多個 SSTable尊蚁,文件內(nèi)數(shù)據(jù)有序亡笑。除了 level-0 之外,每一層內(nèi)部的 SSTable 的 key 范圍都不相交横朋。
  5. Manifest:Manifest 文件中記錄 SSTable 在不同 level 的信息仑乌,包括每一層由哪些 SSTable,每個 SSTable 的文件大小琴锭、最大 key晰甚、最小 key 等信息。
  6. Current:重啟時(shí)决帖,LevelDB 會重新生成 Manifest厕九,所以 Manifest 文件可能同時(shí)存在多個,Current 記錄的是當(dāng)前使用的 Manifest 文件名地回。
  7. TableCache:TableCache 用于緩存 SSTable 的文件描述符扁远、索引和 filter。
  8. BlockCache:SSTable 的數(shù)據(jù)是被組織成一個個 block刻像。BlockCache 用于緩存這些 block(解壓后)的數(shù)據(jù)畅买。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绎速,隨后出現(xiàn)的幾起案子皮获,更是在濱河造成了極大的恐慌焙蚓,老刑警劉巖纹冤,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洒宝,死亡現(xiàn)場離奇詭異,居然都是意外死亡萌京,警方通過查閱死者的電腦和手機(jī)雁歌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來知残,“玉大人靠瞎,你說我怎么就攤上這事∏竺茫” “怎么了乏盐?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長制恍。 經(jīng)常有香客問我父能,道長,這世上最難降的妖魔是什么净神? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任何吝,我火速辦了婚禮,結(jié)果婚禮上鹃唯,老公的妹妹穿的比我還像新娘爱榕。我一直安慰自己,他們只是感情好坡慌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布黔酥。 她就那樣靜靜地躺著,像睡著了一般洪橘。 火紅的嫁衣襯著肌膚如雪絮爷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天梨树,我揣著相機(jī)與錄音坑夯,去河邊找鬼。 笑死抡四,一個胖子當(dāng)著我的面吹牛柜蜈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播指巡,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼淑履,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了藻雪?” 一聲冷哼從身側(cè)響起秘噪,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎勉耀,沒想到半個月后指煎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹋偏,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年至壤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了威始。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡像街,死狀恐怖黎棠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情镰绎,我是刑警寧澤脓斩,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站畴栖,受9級特大地震影響俭厚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜驶臊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一挪挤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧关翎,春花似錦扛门、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至爽茴,卻和暖如春葬凳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背室奏。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工火焰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胧沫。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓昌简,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绒怨。 傳聞我的和親對象是個殘疾皇子纯赎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355