博客專欄

        EEPW首頁 > 博客 > Rocksdb原理簡介

        Rocksdb原理簡介

        發布人:天翼云開發者 時間:2023-05-25 來源:工程師 發布文章
        本文分享自天翼云開發者社區《Rocksdb原理簡介》,作者:l****n 

        https://www.ctyun.cn/developer/article/419235671285829


        Rocksdb作為當下nosql中性能的代表被各個存儲組件(mysql、tikv、pmdk、bluestore)作為存儲引擎底座,其基于LSM tree的核心存儲結構(將隨機寫通過數據結構轉化為順序寫)來提供高性能的寫吞吐時保證了讀性能。同時大量的并發性配置來降低compaction的影響。

        image.png 

        涉及到的幾個核心文件:

        WAL

        WriteAheadLog,rocksdb的日志,保存memtable中的信息。當memtable轉化為immutable memtable并且Flush到L0層之后,之前WAL的會被清理,即于刪除DB目錄下的log文件。

        RocksDB中每一次數據的更新都會涉及到兩個結構,一個是內存中的memtable(后續會刷新到磁盤成為SST),第二個是WAL。

        WAL主要的功能是當RocksDB異常退出后,能夠恢復出錯前的內存中(memtable)數據,因此RocksDB默認是每次用戶寫都會刷新數據到WAL。每次當當前WAL對應的內存數據(memtable)刷新到磁盤之后,都會新建一個WAL。

        所有的WAL文件都是保存在WAL目錄(options.wal_dir),為了保證數據的狀態,所有的WAL文件的名字都是按照順序的(log_number)。

        MANIFEST

        RocksDB中MANIFEST保存了存儲引擎的內部的一些狀態元數據,簡單來說當系統異常重啟,或者程序異常被退出之后,RocksDB需要有一種機制能夠恢復到一個一致性的狀態, 而這個一致性的狀態就是靠MANIFEST來保證的.

        MANIFEST在RocksDB中是一個單獨的文件,而這個文件所保存的數據基本是來自于VersionEdit這個結構.

        MANIFEST包含了兩個文件,一個log文件一個包含最新MANIFEST文件名的文件,Manifest的log文件名是這樣 MANIFEST-(seq number),這個seq會一直增長.只有當 超過了指定的大小之后,MANIFEST會刷新一個新的文件,當新的文件刷新到磁盤(并且文件名更新)之后,老的文件會被刪除掉。這里可以認為每一次MANIFEST的更新都代表一次snapshot。

        CURRENT

        記錄當前最新的MANIFEST文件編號

        Memtable

        常駐于內存中,在WAL寫之后,記錄具體的key-value數據。在RocksDB中,每個ColumnFamily都有自己的Memtable,Column Family之間互不影響。而在RocksDB中Memtable有多種實現,SkipList/HashSkipList/HashLinkList/Vector,默認的實現為SkipList(只有skiplist可以并發插入)。memtable大小以及個數可以由指定的參數進行控制:

        write_buffer_size表示memtable的大小

        max_write_buffer_number表示內存中最多可以同時存在多少個memtable的個數

        Immutable memtable

        memtable被寫滿之后會生成一個新的memtable繼續接受IO,舊的memtable就會變成immutable memtable,為只讀的狀態,且開始由后臺線程Flush到磁盤的L0層sst。

        SST

        核心key-value的存儲文件,比如DB目錄下的000023.sst文件。默認分為L0~L7層,當滿足一定條件時(本層sst總大小超過配置大小、WAL文件超過一定值)后臺開啟compaction任務,從當前層和下一層選取若干sst,做合并,并寫入新的sst文件。

        CcolumnFamily
        RocksDB 3.0中加入了Column Family特性,加入這個特性之后,每一個KV對都會關聯一個Column Family,其中默認的Column Family是 "default"。Column Family主要是提供給RocksDB一個邏輯的分區。從實現上來看不同的Column Family共享WAL,而都有自己的memtable和SST,同時擁有自己的配置。這就意味著我們可以快速方便的設置不同的屬性的Column Family以及快速刪除對應的Column Family。但是因為Column Family共享WAL,可能會咬住WAL,讓WAL快速增長從而觸發memtable的強制Flush。

         


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: 存儲 存儲引擎

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 和硕县| 来宾市| 舟山市| 阿拉善右旗| 岳西县| 子洲县| 上高县| 九龙县| 肥乡县| 房产| 兴宁市| 甘肃省| 上高县| 柘荣县| 克东县| 光泽县| 江西省| 军事| 尖扎县| 岳池县| 定陶县| 呼伦贝尔市| 故城县| 韶关市| 萍乡市| 六盘水市| 成都市| 锡林浩特市| 平安县| 抚松县| 开远市| 迁安市| 广昌县| 萨嘎县| 乌审旗| 建阳市| 德安县| 常宁市| 阳西县| 定安县| 鲁甸县|