RocksDB系列二十二:RocksDB使用場景和特性

??存儲(chǔ)和訪問數(shù)百PB的數(shù)據(jù)是一個(gè)非常大的挑戰(zhàn),開源的RocksDB就是FaceBook開放的一種嵌入式、持久化存儲(chǔ)、KV型且非常適用于fast storage的存儲(chǔ)引擎。
??傳統(tǒng)的數(shù)據(jù)訪問都是RPC,但是這樣的話訪問速度會(huì)很慢,不適用于面向用戶的實(shí)時(shí)訪問的場景。隨著fast storage的流行,越來越多的應(yīng)用可以通過在flash中管理數(shù)據(jù)并快速直接的訪問數(shù)據(jù)。這些應(yīng)用就需要使用到一種嵌入式的database。
??使用嵌入式的database的原因有很多。當(dāng)數(shù)據(jù)請求頻繁訪問內(nèi)存或者fast storage時(shí),網(wǎng)路延時(shí)會(huì)增加響應(yīng)時(shí)間,比如:訪問數(shù)據(jù)中心網(wǎng)絡(luò)耗時(shí)可能就耗費(fèi)50ms,跟訪問數(shù)據(jù)的耗時(shí)一樣多,甚至更多。這意味著,通過RPC訪問數(shù)據(jù)有可能是本地直接訪問耗時(shí)的兩倍。另外,機(jī)器的core數(shù)越來越多,storage-IOPS的訪問頻率也達(dá)到了每秒百萬次,傳統(tǒng)數(shù)據(jù)庫的鎖競爭和context 切換會(huì)成為提高storage-IOPS的瓶頸。所以需要一種容易擴(kuò)展和針對未來硬件趨勢可以定制化的database,RocksDB就是一種選擇。
??RocksDB是基于Google的開源key value存儲(chǔ)庫LevelDB,主要滿足以下目標(biāo):

1、適用于多cpu場景

??商業(yè)服務(wù)器一般會(huì)有很多cpu核,要開發(fā)一個(gè)隨著CPU 核數(shù)吞吐量也隨之增大的數(shù)據(jù)庫是很困難的,更別提是線性的遞增關(guān)系。但是,RocksDB是可以高效地運(yùn)行在多核服務(wù)器上。一個(gè)優(yōu)點(diǎn)是RocksDB提供的語義比傳統(tǒng)的DBMS更簡單。例如:RocksDB支持MVCC,但是僅限于只讀的transaction。另一個(gè)優(yōu)點(diǎn)是數(shù)據(jù)庫在邏輯上分片為read-only path和read-write path。這兩種方法可以降低鎖競爭,而降低鎖競爭是支持高并發(fā)負(fù)載的前提條件。

2、高校利用storage(更高的IOPS、高效的壓縮、更少的寫磨損)

??現(xiàn)在的存儲(chǔ)設(shè)備都可以支持到每秒10w的隨機(jī)讀,如果有10塊存儲(chǔ)卡的話就可以支持每秒100w的隨機(jī)讀。RocksDB可以在這種快速存儲(chǔ)上高效運(yùn)行且不會(huì)成為性能瓶頸。
??和實(shí)時(shí)更新的B-tree相比,RocksDB有更好的壓縮和更小的寫放大。RocksDB由于壓縮更優(yōu),所以占用更少的storage;由于更小的寫放大,flash 設(shè)備可以更持久。

3、彈性架構(gòu),支持?jǐn)U展

??RocksDB支持?jǐn)U展。比如,我們可以新增一個(gè)merge operator,這樣就可以使用write-only來替代read-modify-write。然而,read和Write是會(huì)增加存儲(chǔ)的讀寫IOPS。在寫頻繁的負(fù)載下,這種措施可以降低IOPS。

4、支持IO-bound、in-memory、write-once

??IO-bound workload是指數(shù)據(jù)庫大小遠(yuǎn)大于內(nèi)存且頻繁地訪問storage。in-memory workload是指數(shù)據(jù)庫數(shù)據(jù)都在內(nèi)存中且仍然使用storage來持久化存儲(chǔ)DB。write-once workload是指大部分的key都只會(huì)寫入一次或者insert且沒有更新操作?,F(xiàn)在RocksDB很好支持IO-bound,要想更好地支持in-memory,需要做一些工作。支持write-once的話,還有很多遺留問題待解決。

??RocksDB不是一個(gè)分布式的DB,而是一個(gè)高效、高性能、單點(diǎn)的數(shù)據(jù)庫引擎。RocksDB是一個(gè)持久化存儲(chǔ)keys和values的c++ library。keys 和values可以是任意的字節(jié)流,且按照keys有序存儲(chǔ)。后臺(tái)的compaction會(huì)消除重復(fù)的和已刪除的key。RocksDB的data以log-structured merge tree的形式存儲(chǔ)。RocksDB支持原子的批量寫入操作以及前向和后向遍歷。
??RocksDB采用“可插拔式”的架構(gòu),所以很容易替換其中的組件,允許用戶很容易在不同的負(fù)載和硬件設(shè)備上進(jìn)行調(diào)優(yōu)。


1441593_10151976018697200_1580274673_n.png

??比如,用戶可以添加不同的壓縮模塊(snappy, zlib, bzip, etc),且使用不同模塊時(shí)不用修改源碼。這可用于在不同負(fù)載下通過配置使用不同的壓縮算法。同理,用戶可以在compaction時(shí)加載個(gè)性化的compaction filter來處理keys,例如,可以實(shí)現(xiàn)DB的key的"expire-time"功能。RocksDB有可插拔式的API,所以應(yīng)用可以設(shè)計(jì)個(gè)性化的數(shù)據(jù)結(jié)構(gòu)來cache DB的寫數(shù)據(jù),典型應(yīng)用就是prefix-hash,其中一部分key使用hash存儲(chǔ),剩下的key存儲(chǔ)在B-tree。storage file的實(shí)現(xiàn)也可以定制開發(fā),所以用戶可以實(shí)現(xiàn)自己的storage file格式。
??RocksDB支持兩種compaction style(level style和universal style)。這兩種style可做讀放大、寫放大、空間放大之間做tradeoff。compaction也支持多線程,所以打的DB可以支持高性能的compaction。
??RocksDB也提供在線的增量備份接口,也支持bloom filters,這可以在range-scan時(shí)降低IOPS。
??RocksDB可以充分挖掘使用flash的IOPS,在隨機(jī)讀、隨機(jī)寫和bulk load時(shí)性能優(yōu)于LevelDB。在隨機(jī)寫和bulk load時(shí),性能優(yōu)于LevelDB 10倍,在隨機(jī)讀時(shí)性能優(yōu)于LevelDB 30%。
??LevelDB是單線程執(zhí)行compaction,在特定的server workload下表現(xiàn)堪憂,但是RocksDB在IO-bound workload下性能明顯優(yōu)于LevelDB。在測試中發(fā)現(xiàn),LevelDB發(fā)生頻繁的write-stall,這嚴(yán)重影響了DB的99%延遲,另外也發(fā)現(xiàn),把文件mmap到OS cache會(huì)引入讀性能瓶頸。測試表明,應(yīng)用不能充分使用flash的高性能,這是因?yàn)閿?shù)據(jù)的帶寬瓶頸引起了LevelDB的寫放大。通過提高寫速率和降低寫放大,可以避免很多問題,同時(shí)提高RocksDB性能。
RocksDB的典型場景(低延時(shí)訪問):
1、需要存儲(chǔ)用戶的查閱歷史記錄和網(wǎng)站用戶的應(yīng)用
2、需要快速訪問數(shù)據(jù)的垃圾檢測應(yīng)用
3、需要實(shí)時(shí)scan數(shù)據(jù)集的圖搜索query
4、需要實(shí)時(shí)請求Hadoop的應(yīng)用
5、支持大量寫和刪除操作的消息隊(duì)列

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 32,316評論 2 89
  • 1.強(qiáng)制IE瀏覽器使用最高級別可用渲染模式顯示網(wǎng)頁: 2.圖片的高度和寬度其中一個(gè)設(shè)置為定值,則另一個(gè)要設(shè)置為au...
    Ms_Apple閱讀 276評論 0 1
  • while(條件){當(dāng)條件為真時(shí)執(zhí)行別忘記增加條件中所用變量的值,否則循環(huán)永遠(yuǎn)不會(huì)結(jié)束!}While 循環(huán)會(huì)在指定...
    三七_(dá)3eca閱讀 137評論 0 0
  • 產(chǎn)場所 美國類別:100%重組果汁 價(jià)格:¥45評論:厚色。 它味道酸甜,有點(diǎn)苦。果蔬清洗流水線苦味對許多人來說可...
    大時(shí)代客閱讀 337評論 0 0

友情鏈接更多精彩內(nèi)容