色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          "); //-->

          博客專欄

          EEPW首頁 > 博客 > Rocksdb原理簡(jiǎn)介

          Rocksdb原理簡(jiǎn)介

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

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


          Rocksdb作為當(dāng)下nosql中性能的代表被各個(gè)存儲(chǔ)組件(mysql、tikv、pmdk、bluestore)作為存儲(chǔ)引擎底座,其基于LSM tree的核心存儲(chǔ)結(jié)構(gòu)(將隨機(jī)寫通過數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為順序?qū)懀﹣硖峁└咝阅艿膶懲掏聲r(shí)保證了讀性能。同時(shí)大量的并發(fā)性配置來降低compaction的影響。

          image.png 

          涉及到的幾個(gè)核心文件:

          WAL

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

          RocksDB中每一次數(shù)據(jù)的更新都會(huì)涉及到兩個(gè)結(jié)構(gòu),一個(gè)是內(nèi)存中的memtable(后續(xù)會(huì)刷新到磁盤成為SST),第二個(gè)是WAL。

          WAL主要的功能是當(dāng)RocksDB異常退出后,能夠恢復(fù)出錯(cuò)前的內(nèi)存中(memtable)數(shù)據(jù),因此RocksDB默認(rèn)是每次用戶寫都會(huì)刷新數(shù)據(jù)到WAL。每次當(dāng)當(dāng)前WAL對(duì)應(yīng)的內(nèi)存數(shù)據(jù)(memtable)刷新到磁盤之后,都會(huì)新建一個(gè)WAL。

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

          MANIFEST

          RocksDB中MANIFEST保存了存儲(chǔ)引擎的內(nèi)部的一些狀態(tài)元數(shù)據(jù),簡(jiǎn)單來說當(dāng)系統(tǒng)異常重啟,或者程序異常被退出之后,RocksDB需要有一種機(jī)制能夠恢復(fù)到一個(gè)一致性的狀態(tài), 而這個(gè)一致性的狀態(tài)就是靠MANIFEST來保證的.

          MANIFEST在RocksDB中是一個(gè)單獨(dú)的文件,而這個(gè)文件所保存的數(shù)據(jù)基本是來自于VersionEdit這個(gè)結(jié)構(gòu).

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

          CURRENT

          記錄當(dāng)前最新的MANIFEST文件編號(hào)

          Memtable

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

          write_buffer_size表示memtable的大小

          max_write_buffer_number表示內(nèi)存中最多可以同時(shí)存在多少個(gè)memtable的個(gè)數(shù)

          Immutable memtable

          當(dāng)memtable被寫滿之后會(huì)生成一個(gè)新的memtable繼續(xù)接受IO,舊的memtable就會(huì)變成immutable memtable,為只讀的狀態(tài),且開始由后臺(tái)線程Flush到磁盤的L0層sst。

          SST

          核心key-value的存儲(chǔ)文件,比如DB目錄下的000023.sst文件。默認(rèn)分為L(zhǎng)0~L7層,當(dāng)滿足一定條件時(shí)(本層sst總大小超過配置大小、WAL文件超過一定值)后臺(tái)開啟compaction任務(wù),從當(dāng)前層和下一層選取若干sst,做合并,并寫入新的sst文件。

          CcolumnFamily
          RocksDB 3.0中加入了Column Family特性,加入這個(gè)特性之后,每一個(gè)KV對(duì)都會(huì)關(guān)聯(lián)一個(gè)Column Family,其中默認(rèn)的Column Family是 "default"。Column Family主要是提供給RocksDB一個(gè)邏輯的分區(qū)。從實(shí)現(xiàn)上來看不同的Column Family共享WAL,而都有自己的memtable和SST,同時(shí)擁有自己的配置。這就意味著我們可以快速方便的設(shè)置不同的屬性的Column Family以及快速刪除對(duì)應(yīng)的Column Family。但是因?yàn)镃olumn Family共享WAL,可能會(huì)咬住WAL,讓W(xué)AL快速增長(zhǎng)從而觸發(fā)memtable的強(qiáng)制Flush。

           


          *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



          關(guān)鍵詞: 存儲(chǔ) 存儲(chǔ)引擎

          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉