本文分享自天翼云開發者社區《Rocksdb原理簡介》,作者:l****n
Rocksdb作為當下nosql中性能的代表被各個存盤組件(mysql、tikv、pmdk、bluestore)作為存盤引擎底座,其基于LSM tree的核心存盤結構(將隨機寫通過資料結構轉化為順序寫)來提供高性能的寫吞吐時保證了讀性能,同時大量的并發性配置來降低compaction的影響,

涉及到的幾個核心檔案:
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,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/553408.html
標籤:其他
上一篇:用go封裝一下封禁功能
下一篇:返回列表
