LSM Tree 數(shù)據(jù)庫(kù)底層索引

數(shù)據(jù)庫(kù)中非常常用的索引數(shù)據(jù)結(jié)構(gòu)——B+ 樹(shù),在過(guò)去很多年里它都是數(shù)據(jù)庫(kù)索引的首選實(shí)現(xiàn)方式俊扳,但是這種數(shù)據(jù)結(jié)構(gòu)也并不是很完美途蒋。因?yàn)椋看涡薷臄?shù)據(jù)都很有可能破壞 B+ 樹(shù)的約束馋记,我們需要對(duì)整棵樹(shù)進(jìn)行遞歸的合并号坡、分裂等調(diào)整操作,而不同節(jié)點(diǎn)在磁盤(pán)上的位置很可能并不是連續(xù)的梯醒,這就導(dǎo)致我們需要不斷地做隨機(jī)寫(xiě)入的操作宽堆,而隨機(jī)寫(xiě)入的性能是比較差的,這個(gè)問(wèn)題在寫(xiě)多讀少的場(chǎng)景下會(huì)更加明顯茸习。

LSM Tree(Log Structure Merge Tree)是比 B+ 樹(shù)更適合寫(xiě)多讀少場(chǎng)景的索引結(jié)構(gòu)畜隶,也廣泛應(yīng)用在各大 NoSQL 中。比如基于 LSM 樹(shù)實(shí)現(xiàn)底層索引結(jié)構(gòu)的 RocksDB号胚、LevelDB籽慢。


LSM Tree 的實(shí)現(xiàn)原理:

LSM 樹(shù)包含了三個(gè)部分,memtable猫胁、immutable memtable箱亿、SSTable前兩個(gè)在內(nèi)存中(使用預(yù)寫(xiě)日志的機(jī)制來(lái)確保數(shù)據(jù)的持久性),最后一個(gè)在磁盤(pán)中弃秆。同樣届惋,我們會(huì)先臨時(shí)地把數(shù)據(jù)寫(xiě)在 memtable 中,然后在合適的時(shí)機(jī)刷入磁盤(pán)上的 SSTable 中菠赚。

1.Memtable

Memtable 顯然是內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)脑豹,存儲(chǔ)的是近期更新的記錄值,可以用各種有序高效的數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)衡查,比如跳躍表瘩欺、紅黑樹(shù),不過(guò)可以簡(jiǎn)單的理解Memtable是一個(gè) 有序Map峡捡。


2.Immutable Table

在 Memtable 存儲(chǔ)的元素到達(dá)一個(gè)數(shù)量級(jí)之后(大小一般為虛擬內(nèi)存的頁(yè)的倍數(shù) 4n KB)击碗,會(huì)把它固化成 immutable table筑悴,從字面上理解们拙,就是不可變表稍途。很明顯這就是 memtable 的拷貝操作,因?yàn)榭截愡^(guò)程是需要時(shí)間的砚婆,但同時(shí)我們的系統(tǒng)很可能仍然在對(duì)外工作械拍,所以創(chuàng)建副本可以很好的地幫助我們避免讀寫(xiě)沖突競(jìng)爭(zhēng),從而避免阻塞装盯,提高系統(tǒng)性能坷虑。


3.SSTable

SSTable 是整個(gè) LSM Tree 的核心,畢竟我們的大部分?jǐn)?shù)據(jù)都是存儲(chǔ)在磁盤(pán)上的埂奈,SSTable 就是在磁盤(pán)上做持久化的部分迄损。本質(zhì)其實(shí)很簡(jiǎn)單,就是一段段按照 key 有序排列的鍵值對(duì)账磺,而持久化數(shù)據(jù)到磁盤(pán)最高效的方式就是順序?qū)懸槐椋樞騃O)芹敌,每次內(nèi)存中的數(shù)據(jù)immutable table,我們都一次性 dump 成磁盤(pán)上的一段自然是比較快的垮抗,這樣一段段的數(shù)據(jù)氏捞,我們就稱(chēng)為一個(gè)個(gè) segment。當(dāng)然冒版,后面存儲(chǔ)的段和前面存儲(chǔ)的段液茎,key 可能是重復(fù)的,因?yàn)楹竺娴亩涡乱恍┐俏耍栽谟兄貜?fù)的時(shí)候捆等,最靠后的段中的記錄值,就是某個(gè) key 最新的狀態(tài)续室。

但很顯然楚里,這樣的存儲(chǔ)會(huì)有很多問(wèn)題,首先數(shù)據(jù)冗余很大猎贴,隨著時(shí)間推移班缎,磁盤(pán)上就會(huì)有大量重復(fù)的鍵,其次我們需要遍歷每個(gè)有序的 segment她渴,查看數(shù)據(jù)是否存在达址。隨著數(shù)據(jù)量增大,最壞情況下趁耗,要遍歷的 segment 會(huì)非常多沉唠,整個(gè)系統(tǒng)的查詢(xún)效率顯然是慘不忍睹的。

所以我們需要合并 segment苛败,合并前老的 segment 長(zhǎng)度都是一樣的且有序的满葛,在 SSTable 的主流實(shí)現(xiàn)里径簿,我們會(huì)把不同的階段被合并的 segment 放到不同的層中,并限制每一層數(shù)量嘀韧,當(dāng)某層 segment 超過(guò)一定數(shù)量篇亭,我們就會(huì)把它們刪除,合并出一個(gè)更大的 segment 放入下一層(低層中的 segment 是更新的記錄值锄贷,高層的則是更老的記錄值)译蒂。同時(shí)也會(huì)對(duì)相同的key進(jìn)行最新值的覆蓋,以減少數(shù)據(jù)的冗余谊却。

檢索的時(shí)候柔昼,我們只需要按照“內(nèi)存 -> SSTable 第一層->SSTable 第二層”這樣的順序,去遍歷每層中不同段是否包含目標(biāo) key炎辨。每個(gè)段內(nèi)都是有序存儲(chǔ)的捕透,所以整體讀的時(shí)間復(fù)雜度也是可以接受的,確實(shí)可能會(huì)比 B+ 樹(shù)的查詢(xún)效率低一些碴萧,不過(guò)輔以布隆過(guò)濾器等手段乙嘀,劣化也不會(huì)非常明顯,在許多讀寫(xiě)比不到 1:10 的場(chǎng)景下勿决,順序?qū)憥?lái)的寫(xiě)性能提升是非常令人滿(mǎn)意的乒躺。


總結(jié)自(極客時(shí)間-業(yè)務(wù)開(kāi)發(fā)算法50講-黃清昊)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市低缩,隨后出現(xiàn)的幾起案子嘉冒,更是在濱河造成了極大的恐慌,老刑警劉巖咆繁,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讳推,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡玩般,警方通過(guò)查閱死者的電腦和手機(jī)银觅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)坏为,“玉大人究驴,你說(shuō)我怎么就攤上這事≡确” “怎么了洒忧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)够颠。 經(jīng)常有香客問(wèn)我熙侍,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任蛉抓,我火速辦了婚禮庆尘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巷送。我一直安慰自己驶忌,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布惩系。 她就那樣靜靜地躺著位岔,像睡著了一般如筛。 火紅的嫁衣襯著肌膚如雪堡牡。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天杨刨,我揣著相機(jī)與錄音晤柄,去河邊找鬼。 笑死妖胀,一個(gè)胖子當(dāng)著我的面吹牛芥颈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赚抡,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼爬坑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了涂臣?” 一聲冷哼從身側(cè)響起盾计,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赁遗,沒(méi)想到半個(gè)月后署辉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岩四,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年哭尝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剖煌。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡材鹦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出耕姊,到底是詐尸還是另有隱情桶唐,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布箩做,位于F島的核電站莽红,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜安吁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一醉蚁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鬼店,春花似錦网棍、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至巍棱,卻和暖如春惑畴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背航徙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工如贷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人到踏。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓杠袱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親窝稿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子楣富,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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

  • 0 前言 對(duì)于存儲(chǔ)介質(zhì)為磁盤(pán)或SSD的數(shù)據(jù)庫(kù),長(zhǎng)期以來(lái)主流使用B+樹(shù)這種索引結(jié)構(gòu)來(lái)實(shí)現(xiàn)快速數(shù)據(jù)查找伴榔。當(dāng)數(shù)據(jù)量不太大...
    movee閱讀 7,087評(píng)論 1 8
  • 數(shù)據(jù)庫(kù)系統(tǒng)設(shè)計(jì)概述 世界上只有兩種開(kāi)發(fā)人員纹蝴,一種使用數(shù)據(jù)庫(kù)系統(tǒng)的,一種開(kāi)發(fā)數(shù)據(jù)庫(kù)系統(tǒng)的潮梯。 數(shù)據(jù)是系統(tǒng)最重要的信息骗灶。...
    MageByte_青葉閱讀 769評(píng)論 0 0
  • LSM-Tree是什么 LSM-Tree(Log Structured Merge Tree),一種分層、有序、面...
    雁陣驚寒_zhn閱讀 1,369評(píng)論 0 2
  • 最近練手的項(xiàng)目里用到了LevelDB, 具有很優(yōu)秀的存儲(chǔ)效率测垛,DDIA中有介紹它底層是LSM-tree實(shí)現(xiàn)的,今天...
    芥川世之介閱讀 728評(píng)論 0 0
  • 一 背景 本來(lái)想寫(xiě)點(diǎn)B+樹(shù)的免都,不過(guò)B+樹(shù)因?yàn)橛迷贛ysql等關(guān)系型數(shù)據(jù)庫(kù)中,大家都比較了解了帆竹,而LSM樹(shù)這種索引設(shè)...
    明翼閱讀 390評(píng)論 0 0