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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

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

算法與數(shù)據(jù)結(jié)構 ? 來源:labuladong ? 作者:labuladong ? 2022-11-03 11:32 ? 次閱讀

我在上篇文章Apache Pulsar 的架構設計中介紹了 Pulsar 存算分離的架構,其中 broker 只負責計算,由 BookKeeper 負責底層的存儲,我還畫了這樣一張圖說明 BookKeeper 讀寫分離的設計:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

從磁盤的角度來說,在尾部追加的寫入效率非常高,因為不需要像 B 樹那樣維護復雜的樹形結(jié)構嘛。但代價就是,查找效率肯定比較低,因為只能通過線性遍歷去查找操作記錄。

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

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

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

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

有序 vs 無序

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

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

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

LSM 樹的設計

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

LevelDB 的代碼倉庫:

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

RocksDB 的 wiki:

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

審核編輯 :李倩

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

    關注

    23

    文章

    4624

    瀏覽量

    93113
  • 存儲系統(tǒng)

    關注

    2

    文章

    413

    瀏覽量

    40886
  • 架構
    +關注

    關注

    1

    文章

    517

    瀏覽量

    25504

原文標題:存儲系統(tǒng)中的算法:LSM 樹設計原理

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

收藏 人收藏

    評論

    相關推薦

    電腦云存儲系統(tǒng),電腦云存儲系統(tǒng)的教程,個人云電腦是什么以及怎么連接

    變成了親情的紐帶,跨越千里解決家人難題,讓老人也能享受科技便利,不再為電腦故障煩惱。接下來和大家一起探索電腦云存儲系統(tǒng)的教程。 ? ?電腦云存儲系統(tǒng)的教程: ? ?以搭建基于OwnCloud的云存儲為例,先準備一臺閑置電腦,安裝
    的頭像 發(fā)表于 12-31 13:57 ?118次閱讀
    電腦云<b class='flag-5'>存儲系統(tǒng)</b>,電腦云<b class='flag-5'>存儲系統(tǒng)</b>的教程,個人云電腦是什么以及怎么連接

    24路電磁鎖主板在智能存儲系統(tǒng)的作用

    在無人值守場景,如自助服務機、智能生鮮柜、共享儲物柜等,使用24路電磁鎖主板可以集成身份識別技術,將用戶的驗證結(jié)果轉(zhuǎn)化為相應的開鎖動作,提升用戶體驗和運營效率,是實現(xiàn)智能存儲系統(tǒng)高效、安全和自動化
    的頭像 發(fā)表于 12-30 14:20 ?95次閱讀
    24路電磁鎖主板在智能<b class='flag-5'>存儲系統(tǒng)</b><b class='flag-5'>中</b>的作用

    如何配置 RAID 5 存儲系統(tǒng)

    配置 RAID 5 存儲系統(tǒng)是一個涉及硬件和軟件設置的過程。以下是配置 RAID 5 存儲系統(tǒng)的一般步驟,以及一些注意事項。請注意,具體步驟可能會因不同的硬件和操作系統(tǒng)而有所不同。 1. 準備硬件
    的頭像 發(fā)表于 12-27 17:02 ?400次閱讀

    WDS分布式存儲系統(tǒng)軟件助力電信工程海量數(shù)據(jù)存儲項目

    WDS分布式存儲系統(tǒng)軟件助力電信工程海量數(shù)據(jù)存儲項目
    的頭像 發(fā)表于 11-11 09:59 ?222次閱讀
    WDS分布式<b class='flag-5'>存儲系統(tǒng)</b>軟件助力電信工程海量數(shù)據(jù)<b class='flag-5'>存儲</b>項目

    emc企業(yè)級存儲系統(tǒng)的特點

    在當今這個數(shù)據(jù)驅(qū)動的時代,企業(yè)對于數(shù)據(jù)存儲的需求日益增長。EMC,作為全球領先的數(shù)據(jù)存儲解決方案提供商,其企業(yè)級存儲系統(tǒng)以其卓越的性能、可靠性和創(chuàng)新技術,為企業(yè)提供了一個強大的數(shù)據(jù)管理平臺。 1.
    的頭像 發(fā)表于 11-01 15:24 ?371次閱讀

    計算機存儲系統(tǒng)的工作原理和功能

    計算機存儲系統(tǒng)作為計算機系統(tǒng)至關重要的組成部分,其原理和功能對于理解計算機的運行機制具有關鍵意義。以下將詳細闡述計算機存儲系統(tǒng)的原理和功能。
    的頭像 發(fā)表于 09-26 16:42 ?1173次閱讀

    計算機存儲系統(tǒng)的構成

    計算機存儲系統(tǒng)是計算機中用于存放程序和數(shù)據(jù)的設備或部件的集合,它構成了計算機信息處理的基礎。一個完整的計算機存儲系統(tǒng)通常包括多個層次的存儲器,從高速緩存(Cache)到主存儲器(Mai
    的頭像 發(fā)表于 09-26 15:25 ?1202次閱讀

    基于分布式存儲系統(tǒng)醫(yī)療影像數(shù)據(jù)存儲解決方案

    基于分布式存儲系統(tǒng)醫(yī)療影像數(shù)據(jù)存儲解決方案
    的頭像 發(fā)表于 09-14 09:53 ?347次閱讀
    基于分布式<b class='flag-5'>存儲系統(tǒng)</b>醫(yī)療影像數(shù)據(jù)<b class='flag-5'>存儲</b>解決方案

    基于CSS融合存儲系統(tǒng)的自動化制造服務平臺存儲解決方案

    基于CSS融合存儲系統(tǒng)的自動化制造服務平臺存儲解決方案
    的頭像 發(fā)表于 09-10 10:15 ?375次閱讀
    基于CSS融合<b class='flag-5'>存儲系統(tǒng)</b>的自動化制造服務平臺<b class='flag-5'>存儲</b>解決方案

    內(nèi)存、存儲系統(tǒng)和CPU的區(qū)別

    在計算機系統(tǒng),內(nèi)存、存儲系統(tǒng)和CPU是三個至關重要的組件,它們各自承擔著不同的職責,共同協(xié)作以完成數(shù)據(jù)處理和運算任務。以下是對這三者之間區(qū)別的詳細闡述。
    的頭像 發(fā)表于 07-15 18:11 ?2691次閱讀

    黑龍江電力高性能WDS分布式存儲系統(tǒng)解決方案

    黑龍江電力高性能WDS分布式存儲系統(tǒng)解決方案
    的頭像 發(fā)表于 07-01 09:54 ?404次閱讀
    黑龍江電力高性能WDS分布式<b class='flag-5'>存儲系統(tǒng)</b>解決方案

    數(shù)據(jù)中心存儲系統(tǒng)出現(xiàn)故障的處理方法有哪些?數(shù)據(jù)中心存儲系統(tǒng)出現(xiàn)故障怎么辦?

    互聯(lián)網(wǎng)+時代,大數(shù)據(jù)非常重要,如果保護好如數(shù)據(jù)存儲系統(tǒng)相當關鍵。如今,隨著互聯(lián)網(wǎng)的快速發(fā)展,各種攻擊變得越來越嚴重,數(shù)據(jù)存儲系統(tǒng)也變得越來越不安全了,普遍來說,存儲系統(tǒng)是由主機、交換機及存儲
    的頭像 發(fā)表于 06-19 11:30 ?867次閱讀

    兆芯攜手智云創(chuàng)新推出高性能NVMe企業(yè)級存儲系統(tǒng)

    面向持續(xù)增長的數(shù)字化轉(zhuǎn)型與應用創(chuàng)新發(fā)展需求,兆芯攜手智云創(chuàng)新,基于兆芯高性能自主處理器平臺成功推出多款信創(chuàng)存儲產(chǎn)品,包括高性能NVMe企業(yè)級存儲系統(tǒng)、HS6000系列企業(yè)級存儲系統(tǒng)和HS600系列應用級
    的頭像 發(fā)表于 04-12 14:06 ?587次閱讀

    什么是智能存儲系統(tǒng)?對比傳統(tǒng)存儲柜,智能存儲柜有哪些優(yōu)點?

    智能存儲系統(tǒng)(IntelligentStorageSystem)是一種先進的數(shù)據(jù)存儲解決方案,它結(jié)合了硬件、軟件和自動化管理功能,以實現(xiàn)對數(shù)據(jù)存儲的高度優(yōu)化、高效能、高可用性和可擴展性。是針對現(xiàn)代
    的頭像 發(fā)表于 03-05 13:53 ?545次閱讀
    什么是智能<b class='flag-5'>存儲系統(tǒng)</b>?對比傳統(tǒng)<b class='flag-5'>存儲</b>柜,智能<b class='flag-5'>存儲</b>柜有哪些優(yōu)點?

    得瑞領新參編團體標準《高性能計算 分布式存儲系統(tǒng)技術要求》正式發(fā)布

    得瑞領新參編的《高性能計算 分布式存儲系統(tǒng)技術要求》團標由中國電子工業(yè)標準化技術協(xié)會正式發(fā)布,這標志著得瑞在高性能計算和分布式存儲領域的技術實力得到認可,同時也展現(xiàn)了公司在行業(yè)標準制定的積極作用。
    的頭像 發(fā)表于 03-01 10:00 ?490次閱讀
    得瑞領新參編團體標準《高性能計算 分布式<b class='flag-5'>存儲系統(tǒng)</b>技術要求》正式發(fā)布