91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

存儲系統(tǒng)中的算法:LSM樹設(shè)計(jì)原理

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:labuladong ? 作者:labuladong ? 2022-11-03 11:32 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

我在上篇文章Apache Pulsar 的架構(gòu)設(shè)計(jì)中介紹了 Pulsar 存算分離的架構(gòu),其中 broker 只負(fù)責(zé)計(jì)算,由 BookKeeper 負(fù)責(zé)底層的存儲,我還畫了這樣一張圖說明 BookKeeper 讀寫分離的設(shè)計(jì):

dbf23274-5b27-11ed-a3b6-dac502259ad0.jpg

但是再深究下去,memtable具體是以怎樣的格式持久化到磁盤上的呢?又是用什么算法高效查找一條消息的呢?

通過學(xué)習(xí)相關(guān)資料,我發(fā)現(xiàn) Apache BookKeeper 底層存儲引擎用的是 Facebook 開源的 RocksDB,而 RocksDB 又是基于 Google 開源的 LevelDB 改造的,而 LevelDB 的核心是一個(gè)叫做 LSM 樹(Log Structured Merge Tree)的結(jié)構(gòu)。

LevelDB 整個(gè)庫的代碼只有幾百 KB,所以我去研究了 LSM 樹的代碼實(shí)現(xiàn),總結(jié)了這篇文章,帶你了解 LSM 樹的設(shè)計(jì)原理。

什么是 LSM 樹呢?如果說到 B+ 樹大家應(yīng)該不陌生,像 MySQL 這樣的關(guān)系型數(shù)據(jù)庫底層一般用 B+ 樹結(jié)構(gòu)來存儲數(shù)據(jù)。LSM 樹其實(shí)就是另一種存儲數(shù)據(jù)的結(jié)構(gòu),常見于日志存儲系統(tǒng)中。

首先,我們先來聊聊存儲系統(tǒng)。

內(nèi)存數(shù)據(jù)結(jié)構(gòu) vs 磁盤數(shù)據(jù)結(jié)構(gòu)

正如前文學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)和算法的框架思維所說,一切數(shù)據(jù)結(jié)構(gòu)從根本上講都是增刪查改,但在具體實(shí)現(xiàn)上,磁盤數(shù)據(jù)結(jié)構(gòu)和內(nèi)存數(shù)據(jù)結(jié)構(gòu)會有比較大的差異。

內(nèi)存數(shù)據(jù)結(jié)構(gòu)你直接 new 一個(gè)出來就行了,不用關(guān)心這個(gè)結(jié)構(gòu)在內(nèi)存中是如何布局的,這些都由操作系統(tǒng)編程語言代勞了。

但磁盤就不一樣,考慮到磁盤讀取的操作效率相對比較低,且每次只能讀取固定大小的磁盤數(shù)據(jù),你要自己設(shè)計(jì)數(shù)據(jù)的存儲布局,規(guī)定每個(gè)字節(jié)存什么信息,然后基于你設(shè)計(jì)的存儲布局實(shí)現(xiàn)增刪查改的 API,比較枯燥瑣碎。

比如說,學(xué)過 MySQL 的話應(yīng)該比較熟悉 B+ 樹結(jié)構(gòu),但你肯定不容易看懂 B+ 樹的代碼。因?yàn)?B+ 樹是磁盤數(shù)據(jù)結(jié)構(gòu),雖然原理上可以理解為 BST 的加強(qiáng)版,但考慮到數(shù)據(jù)文件格式的設(shè)計(jì),真正的代碼實(shí)現(xiàn)非常復(fù)雜。

所以一般來說,我們了解磁盤數(shù)據(jù)結(jié)構(gòu)的原理,了解各個(gè)操作的時(shí)間復(fù)雜度就可以了,沒必要特別糾結(jié)它的具體實(shí)現(xiàn)。

數(shù)據(jù)可變 vs 數(shù)據(jù)不可變

存儲結(jié)構(gòu)可以粗略分為兩類:數(shù)據(jù)可變的和數(shù)據(jù)不可變的。所謂可變,就是說已經(jīng)插入的數(shù)據(jù)還可以原地進(jìn)行修改,不可變就是說已經(jīng)插入的數(shù)據(jù)就不能再修改了。

B 樹是數(shù)據(jù)可變的代表結(jié)構(gòu)(B+ 樹等衍生結(jié)構(gòu)都?xì)w為 B 樹一族)。你就想想 BST 吧,數(shù)據(jù)存在節(jié)點(diǎn)上,我們可以隨意插入、刪除、修改 BST 中的節(jié)點(diǎn)。

B 樹的理論增刪查改性能和 BST 一樣都是 logN,但 B 樹的實(shí)際寫入效率并不是特別高:

一方面是因?yàn)?B 樹需要分裂合并等操作保證整棵樹的平衡性,這里面涉及很多磁盤隨機(jī)讀寫的操作,性能會比較差;另一方面考慮到并發(fā)場景,修改 B 樹結(jié)構(gòu)時(shí)需要比較復(fù)雜的鎖機(jī)制保證并發(fā)安全,也會一定程度影響效率。

綜上,B 樹的難點(diǎn)在于平衡性維護(hù)和并發(fā)控制,一般用在讀多寫少的場景。

LSM 樹是數(shù)據(jù)不可變的代表結(jié)構(gòu)。你只能在尾部追加新數(shù)據(jù),不能修改之前已經(jīng)插入的數(shù)據(jù)。

如果不能修改以前的數(shù)據(jù),是不是就不能提供刪、查、改的操作 API 呢?其實(shí)是可以的。

我們只需要提供set(key, val)和get(key)兩個(gè) API 即可。查詢操作靠get(key),增刪改操作都可以由set(key, val)實(shí)現(xiàn):

如果set的key不存在就是新增鍵值對,如果已經(jīng)存在,就是更新鍵值對;如果把val設(shè)置為一個(gè)特殊值(比如 null)就可以代表key被刪掉了(墓碑機(jī)制)。

那么我對某個(gè)鍵key做了一系列操作后,我只要找到最近一次的操作,就能知道這個(gè)鍵當(dāng)前的值是多少了。

從磁盤的角度來說,在尾部追加的寫入效率非常高,因?yàn)椴恍枰?B 樹那樣維護(hù)復(fù)雜的樹形結(jié)構(gòu)嘛。但代價(jià)就是,查找效率肯定比較低,因?yàn)橹荒芡ㄟ^線性遍歷去查找操作記錄。

后面我會講講真正的 LSM 樹如何針對讀場景進(jìn)行優(yōu)化,但再怎么優(yōu)化,肯定也達(dá)不到 B 樹的讀取效率。

同時(shí),LSM 樹還有一個(gè)明顯弊端就是存在空間放大。在 B 樹中一個(gè)鍵值對就占用一個(gè)節(jié)點(diǎn),我更新這個(gè)鍵 100 次,它還是只占用一個(gè)節(jié)點(diǎn)。但在 LSM 樹中,如果我更新一個(gè)鍵 100 次,就相當(dāng)于寫入了 100 條數(shù)據(jù),會消耗更多空間。

后面會講到,這個(gè)問題的解決方案是壓實(shí)(compact),把操作序列中失效的歷史操作消除掉,只保留最近的操作記錄。

綜上,LSM 樹的難點(diǎn)在于 compact 操作和讀取數(shù)據(jù)時(shí)的效率優(yōu)化,一般用在寫多讀少的場景。

有序 vs 無序

可以說,存儲結(jié)構(gòu)的有序程度直接決定了該類結(jié)構(gòu)的讀寫性能上限。有序度越高,讀性能越強(qiáng),但相應(yīng)的,維護(hù)有序性的成本也越高,寫入性能也就會越差。

你看 B 樹,作為 BST 的加強(qiáng)版,實(shí)際上是維護(hù)了所有數(shù)據(jù)的有序性,讀取性能必然起飛,但寫入性能你也別抱太大希望。

LSM 樹不可能向 B 樹那樣維護(hù)所有數(shù)據(jù)的有序性,但可以維護(hù)局部數(shù)據(jù)的有序性,從而一定程度提升讀性能。

LSM 樹的設(shè)計(jì)

就我的理解,LSM 樹其實(shí)不是一種數(shù)據(jù)結(jié)構(gòu),而是一種存儲方案。這里面涉及三個(gè)重要的數(shù)據(jù)組件:memtable,log,SSTable,正如我在Apache Pulsar 的架構(gòu)設(shè)計(jì)中畫的這幅圖:

dbf23274-5b27-11ed-a3b6-dac502259ad0.jpg

其中Journal就是log,Entry Log就是若干SSTable的集合,叫法不同罷了。

memtable是紅黑樹或者跳表這樣的有序內(nèi)存數(shù)據(jù)結(jié)構(gòu),起到緩存和排序的作用,把新寫入的數(shù)據(jù)按照鍵的大小進(jìn)行排序。當(dāng)memtable到達(dá)一定大小之后,會被轉(zhuǎn)化成SSTable格式刷入磁盤持久化存儲。

SSTable(Sorted String Table)說白了就是一個(gè)特殊格式的文件,其中的數(shù)據(jù)按照鍵的大小排列,你可以把它類比成一個(gè)有序數(shù)組。而 LSM 樹,說白了就是若干SSTable的集合。

log文件記錄操作日志,在數(shù)據(jù)寫入memtable的同時(shí)也會刷盤寫入到log文件,作用是數(shù)據(jù)恢復(fù)。比如在memtable中的數(shù)據(jù)還沒轉(zhuǎn)化成SSTable持久化到磁盤時(shí),如果突然斷電,那么memtable里面的數(shù)據(jù)都會丟失,但有l(wèi)og文件在,就可以恢復(fù)這些數(shù)據(jù)。當(dāng)然,等memtable中的數(shù)據(jù)成功轉(zhuǎn)化成SSTable落盤之后,log文件中對應(yīng)的操作日志就沒必要存在了,可以被刪除。

LSM 樹的set寫入過程并不復(fù)雜:寫入log和memtable,最后轉(zhuǎn)化成一個(gè)SSTable持久化到磁盤就行了。

最關(guān)鍵的應(yīng)該是讀取和 compact 的過程:SSTable要如何組織,才能快速get到一個(gè)key對應(yīng)的val呢?如何定期對所有 SSTable 做 compact 瘦身呢?

其實(shí)有多種方案,其中比較常用的方案是按照層級組織SSTable:

dc11891c-5b27-11ed-a3b6-dac502259ad0.png

https://github.com/facebook/rocksdb/wiki/Leveled-Compaction

圖中每個(gè)綠色方塊代表一個(gè)SSTable,若干個(gè)SSTable構(gòu)成一層,總共有若干層,每層能夠容納的SSTable數(shù)量上限依次遞增。

新刷入的SSTable在第 0 層,如果某一層的SSTable個(gè)數(shù)超過上限,則會觸發(fā) compact 操作,從該層選出若干SSTable合并成一個(gè)更大的SSTable,移動下一層:

dc1edfa4-5b27-11ed-a3b6-dac502259ad0.png

https://github.com/facebook/rocksdb/wiki/Leveled-Compaction

每個(gè)SSTable就好比一個(gè)有序數(shù)組/鏈表,多個(gè)SSTable的合并就是前文鏈表雙指針技巧匯總中合并多個(gè)有序鏈表的邏輯。

這樣,越靠上層的數(shù)據(jù)越新,越靠下層的數(shù)據(jù)越舊,且算法保證同一層的若干SSTable的key不存在重疊:

dc2c1782-5b27-11ed-a3b6-dac502259ad0.png

https://github.com/facebook/rocksdb/wiki/Leveled-Compaction

那么假設(shè)給一個(gè)目標(biāo)鍵key27,我們只需要從上到下遍歷層,并在每一層中使用二分查找算法找到鍵區(qū)間包含key27的SSTable,然后用布隆過濾器快速判斷一下key27是否不存在這個(gè)SSTable中。如果可能存在,由于SSTable中的鍵也是有序的,可以再次運(yùn)用二分查找算法在SSTable中找到鍵對應(yīng)的值。

這樣,借助 LSM 樹的層級結(jié)構(gòu)和SSTable的有序性,就能利用二分搜索提升查找效率,避免線性查找鍵值對。

以上就是本文的全部內(nèi)容,LSM 樹的設(shè)計(jì)思路比較易于理解,但實(shí)現(xiàn)起來還有不少細(xì)節(jié),如果你對具體實(shí)現(xiàn)感興趣,我可以推薦一些學(xué)習(xí)資料

LevelDB 的代碼倉庫:

https://github.com/google/leveldb/issues

RocksDB 的 wiki:

https://github.com/facebook/rocksdb/wiki

審核編輯 :李倩

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4784

    瀏覽量

    98060
  • 存儲系統(tǒng)
    +關(guān)注

    關(guān)注

    2

    文章

    433

    瀏覽量

    41897
  • 架構(gòu)
    +關(guān)注

    關(guān)注

    1

    文章

    532

    瀏覽量

    26590

原文標(biāo)題:存儲系統(tǒng)中的算法:LSM 樹設(shè)計(jì)原理

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    戴爾科技蟬聯(lián)全球服務(wù)器市場與外部存儲系統(tǒng)行業(yè)份額第一

    近日,知名研究機(jī)構(gòu)IDC公布的2025年第三季度《全球服務(wù)器季度追蹤報(bào)告》和《全球企業(yè)存儲季度追蹤報(bào)告》顯示,戴爾科技集團(tuán)再次雙雙位列榜首,蟬聯(lián)全球服務(wù)器市場與外部存儲系統(tǒng)行業(yè)份額第一。
    的頭像 發(fā)表于 01-21 16:04 ?473次閱讀
    戴爾科技蟬聯(lián)全球服務(wù)器市場與外部<b class='flag-5'>存儲系統(tǒng)</b>行業(yè)份額第一

    使用K-means算法進(jìn)行異常偵測

    本帖最后由 jf_77210199 于 2026-1-19 09:48 編輯 使用K-means算法進(jìn)行異常偵測 本案例運(yùn)行于 AT32F403A MCU 平臺,利用 LSM
    發(fā)表于 01-16 14:09

    全球前四!京東云云海AI存儲躋身IO500高性能存儲榜單

    存儲技術(shù),云海AI存儲不采用 PMEM 硬件,具備更強(qiáng)通用性的同時(shí)也實(shí)現(xiàn)了更低存儲成本。 IO500是全球高性能計(jì)算HPC領(lǐng)域最權(quán)威、最具影響力的存儲系統(tǒng)性能評測標(biāo)準(zhǔn)之一,評測維度涵蓋
    的頭像 發(fā)表于 11-27 14:51 ?371次閱讀
    全球前四!京東云云海AI<b class='flag-5'>存儲</b>躋身IO500高性能<b class='flag-5'>存儲</b>榜單

    集裝箱儲能系統(tǒng)標(biāo)準(zhǔn)解析系列(二)|IEC TS 62933-3-1電能存儲系統(tǒng)的規(guī)劃和性能評估

    IEC TS 62933-3-1電能存儲(EES)系統(tǒng) 第3-1部分:電能存儲系統(tǒng)的規(guī)劃和性能評估
    的頭像 發(fā)表于 11-25 15:30 ?485次閱讀
    集裝箱儲能<b class='flag-5'>系統(tǒng)</b>標(biāo)準(zhǔn)解析系列(二)|IEC TS 62933-3-1電能<b class='flag-5'>存儲系統(tǒng)</b>的規(guī)劃和性能評估

    集裝箱儲能系統(tǒng)標(biāo)準(zhǔn)解析系列(三)| IEC TS 62933-4-1電能存儲系統(tǒng)(EES) 第4-1部分:環(huán)境問題指導(dǎo)

    IEC TS 62933-4-1電能存儲系統(tǒng)(EES) 第4-1部分:環(huán)境問題指導(dǎo) 通用規(guī)范
    的頭像 發(fā)表于 11-25 15:11 ?416次閱讀
    集裝箱儲能<b class='flag-5'>系統(tǒng)</b>標(biāo)準(zhǔn)解析系列(三)| IEC TS 62933-4-1電能<b class='flag-5'>存儲系統(tǒng)</b>(EES) 第4-1部分:環(huán)境問題指導(dǎo)

    LSM6DSO16IS:集成ISPU的智能慣性傳感器,賦能邊緣AI與實(shí)時(shí)運(yùn)動處理

    STMicroelectronics LSM6DSO16IS iNEMO慣性模塊是一款系統(tǒng)級封裝器件,可在高性能模式下以0.59mA電流提升性能。該慣性模塊嵌入ST類處理,即智能傳感器處理單元
    的頭像 發(fā)表于 10-29 14:56 ?556次閱讀
    <b class='flag-5'>LSM</b>6DSO16IS:集成ISPU的智能慣性傳感器,賦能邊緣AI與實(shí)時(shí)運(yùn)動處理

    戴爾科技全閃存存儲PowerStore有何獨(dú)特之處

    近日,在IDC最新發(fā)布的全球企業(yè)存儲系統(tǒng)季度跟蹤報(bào)告,戴爾科技集團(tuán)再度蟬聯(lián)全閃存存儲供應(yīng)商收入榜首!
    的頭像 發(fā)表于 10-15 14:19 ?1711次閱讀

    曙光存儲支持西湖大學(xué)高性能計(jì)算中心部署完成全新存儲系統(tǒng)

    近日,曙光存儲支持西湖大學(xué)高性能計(jì)算中心部署完成全新存儲系統(tǒng),為AI研發(fā)、科學(xué)計(jì)算和信息化平臺等提供存力支持。性能實(shí)測顯示,該系統(tǒng)單節(jié)點(diǎn)帶寬可達(dá)150GB/s,是國際友商的近4倍,充分滿足AI科研需求,超額完成交付目標(biāo)。
    的頭像 發(fā)表于 08-25 11:48 ?1243次閱讀

    NAS存儲系統(tǒng)斷電風(fēng)險(xiǎn)大?UPS電源守護(hù)數(shù)據(jù)安全刻不容緩

    在數(shù)字化時(shí)代,企業(yè)數(shù)據(jù)已成為最寶貴的資產(chǎn)。NAS存儲系統(tǒng)作為企業(yè)數(shù)據(jù)存儲的核心設(shè)備,一旦遭遇意外斷電,輕則導(dǎo)致數(shù)據(jù)丟失,重則造成設(shè)備損壞,給企業(yè)帶來難以估量的損失。作為專業(yè)UPS電源廠家,優(yōu)比施
    的頭像 發(fā)表于 08-25 10:13 ?1043次閱讀
    NAS<b class='flag-5'>存儲系統(tǒng)</b>斷電風(fēng)險(xiǎn)大?UPS電源守護(hù)數(shù)據(jù)安全刻不容緩

    Ceph分布式存儲系統(tǒng)解析

    在當(dāng)今數(shù)據(jù)爆炸的時(shí)代,企業(yè)對存儲系統(tǒng)的需求日益增長,傳統(tǒng)的集中式存儲已經(jīng)無法滿足大規(guī)模數(shù)據(jù)處理的要求。分布式存儲系統(tǒng)應(yīng)運(yùn)而生,而Ceph作為開源分布式存儲系統(tǒng)的佼佼者,以其高可用性、高
    的頭像 發(fā)表于 07-14 11:15 ?997次閱讀

    布谷鳥科技ATU102數(shù)據(jù)存儲單元產(chǎn)品介紹

    車載數(shù)據(jù)存儲是自動駕駛汽車的“記憶中樞”,自動駕駛車輛在日常運(yùn)行需要對海量數(shù)據(jù)存儲,這對車載存儲系統(tǒng)的容量、安全及可靠性提出極高要求。
    的頭像 發(fā)表于 05-14 11:23 ?1080次閱讀

    兆芯+圖云創(chuàng)智—可信分布式存儲系統(tǒng)解決方案

    圖云創(chuàng)智分布式存儲系統(tǒng)采用全分布式設(shè)計(jì)與先進(jìn)的存儲虛擬化技術(shù)相結(jié)合,由多個(gè)獨(dú)立的兆芯 x86 服務(wù)器作為存儲節(jié)點(diǎn),聯(lián)合道熵存儲軟件和思贊博微可信計(jì)算技術(shù)實(shí)現(xiàn)統(tǒng)一資源調(diào)度、縱向橫向無縫擴(kuò)
    的頭像 發(fā)表于 04-23 10:29 ?953次閱讀
    兆芯+圖云創(chuàng)智—可信分布式<b class='flag-5'>存儲系統(tǒng)</b>解決方案

    27MHz HCSL 差分晶體振蕩器在數(shù)據(jù)中心網(wǎng)絡(luò)存儲系統(tǒng)的應(yīng)用方案

    FCO-5L-27MHz HCSL差分振蕩器-FCom富士晶振-電子發(fā)燒友網(wǎng))在存儲系統(tǒng)的優(yōu)勢 FCO5L02700033HDY00是一款專為高速通信和存儲應(yīng)用打造的27MHz差分晶體振蕩器,具備
    發(fā)表于 04-14 21:19

    手動整理GB 44240電能存儲系統(tǒng)用鋰蓄電池和電池組安全測試設(shè)備

    ?GB 44240-2024是國內(nèi)針對電能存儲系統(tǒng)用鋰蓄電池和電池組的強(qiáng)制性國家標(biāo)準(zhǔn),旨在規(guī)范電能存儲系統(tǒng)鋰電池的安全要求。?該標(biāo)準(zhǔn)由工業(yè)和信息化部組織制定,歷時(shí)三年,將于2025年8月1日
    的頭像 發(fā)表于 03-28 11:16 ?1153次閱讀
    手動整理GB 44240電能<b class='flag-5'>存儲系統(tǒng)</b>用鋰蓄電池和電池組安全測試設(shè)備

    提取LSM6DSV16X內(nèi)置低功耗融合算法輸出的四元數(shù)后,轉(zhuǎn)換成歐拉角后遇到一個(gè)問題求解

    各位大佬好,在提取LSM6DSV16X內(nèi)置低功耗融合算法輸出的四元數(shù)后,轉(zhuǎn)換成歐拉角后遇到一個(gè)問題,當(dāng)Y軸與重力方向平行時(shí),輸出的角度與慣性測量單元繞自身Y軸轉(zhuǎn)過的角度對應(yīng)不上,且抖動增加,請問有什么解決方法嗎?
    發(fā)表于 03-14 06:55