??存儲(chǔ)和訪問(wèn)數(shù)百PB的數(shù)據(jù)是一個(gè)非常大的挑戰(zhàn)铡溪,開源的RocksDB就是FaceBook開放的一種嵌入式、持久化存儲(chǔ)衡蚂、KV型且非常適用于fast storage的存儲(chǔ)引擎窿克。
??傳統(tǒng)的數(shù)據(jù)訪問(wèn)都是RPC,但是這樣的話訪問(wèn)速度會(huì)很慢毛甲,不適用于面向用戶的實(shí)時(shí)訪問(wèn)的場(chǎng)景年叮。隨著fast storage的流行,越來(lái)越多的應(yīng)用可以通過(guò)在flash中管理數(shù)據(jù)并快速直接的訪問(wèn)數(shù)據(jù)玻募。這些應(yīng)用就需要使用到一種嵌入式的database只损。
??使用嵌入式的database的原因有很多。當(dāng)數(shù)據(jù)請(qǐng)求頻繁訪問(wèn)內(nèi)存或者fast storage時(shí)七咧,網(wǎng)路延時(shí)會(huì)增加響應(yīng)時(shí)間跃惫,比如:訪問(wèn)數(shù)據(jù)中心網(wǎng)絡(luò)耗時(shí)可能就耗費(fèi)50ms,跟訪問(wèn)數(shù)據(jù)的耗時(shí)一樣多艾栋,甚至更多爆存。這意味著,通過(guò)RPC訪問(wèn)數(shù)據(jù)有可能是本地直接訪問(wèn)耗時(shí)的兩倍蝗砾。另外先较,機(jī)器的core數(shù)越來(lái)越多,storage-IOPS的訪問(wèn)頻率也達(dá)到了每秒百萬(wàn)次悼粮,傳統(tǒng)數(shù)據(jù)庫(kù)的鎖競(jìng)爭(zhēng)和context 切換會(huì)成為提高storage-IOPS的瓶頸闲勺。所以需要一種容易擴(kuò)展和針對(duì)未來(lái)硬件趨勢(shì)可以定制化的database,RocksDB就是一種選擇扣猫。
??RocksDB是基于Google的開源key value存儲(chǔ)庫(kù)LevelDB菜循,主要滿足以下目標(biāo):
1、適用于多cpu場(chǎng)景
??商業(yè)服務(wù)器一般會(huì)有很多cpu核苞笨,要開發(fā)一個(gè)隨著CPU 核數(shù)吞吐量也隨之增大的數(shù)據(jù)庫(kù)是很困難的债朵,更別提是線性的遞增關(guān)系子眶。但是,RocksDB是可以高效地運(yùn)行在多核服務(wù)器上序芦。一個(gè)優(yōu)點(diǎn)是RocksDB提供的語(yǔ)義比傳統(tǒng)的DBMS更簡(jiǎn)單臭杰。例如:RocksDB支持MVCC,但是僅限于只讀的transaction谚中。另一個(gè)優(yōu)點(diǎn)是數(shù)據(jù)庫(kù)在邏輯上分片為read-only path和read-write path渴杆。這兩種方法可以降低鎖競(jìng)爭(zhēng),而降低鎖競(jìng)爭(zhēng)是支持高并發(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來(lái)替代read-modify-write谬哀。然而蟆湖,read和Write是會(huì)增加存儲(chǔ)的讀寫IOPS。在寫頻繁的負(fù)載下玻粪,這種措施可以降低IOPS。
4诬垂、支持IO-bound劲室、in-memory、write-once
??IO-bound workload是指數(shù)據(jù)庫(kù)大小遠(yuǎn)大于內(nèi)存且頻繁地訪問(wèn)storage结窘。in-memory workload是指數(shù)據(jù)庫(kù)數(shù)據(jù)都在內(nèi)存中且仍然使用storage來(lái)持久化存儲(chǔ)DB很洋。write-once workload是指大部分的key都只會(huì)寫入一次或者insert且沒(méi)有更新操作。現(xiàn)在RocksDB很好支持IO-bound隧枫,要想更好地支持in-memory喉磁,需要做一些工作谓苟。支持write-once的話,還有很多遺留問(wèn)題待解決协怒。
??RocksDB不是一個(gè)分布式的DB涝焙,而是一個(gè)高效、高性能孕暇、單點(diǎn)的數(shù)據(jù)庫(kù)引擎仑撞。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)采蚀。
??比如,用戶可以添加不同的壓縮模塊(snappy, zlib, bzip, etc)岸浑,且使用不同模塊時(shí)不用修改源碼搏存。這可用于在不同負(fù)載下通過(guò)配置使用不同的壓縮算法。同理矢洲,用戶可以在compaction時(shí)加載個(gè)性化的compaction filter來(lái)處理keys璧眠,例如,可以實(shí)現(xiàn)DB的key的"expire-time"功能读虏。RocksDB有可插拔式的API责静,所以應(yīng)用可以設(shè)計(jì)個(gè)性化的數(shù)據(jù)結(jié)構(gòu)來(lái)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把篓。在測(cè)試中發(fā)現(xiàn)纫溃,LevelDB發(fā)生頻繁的write-stall,這嚴(yán)重影響了DB的99%延遲韧掩,另外也發(fā)現(xiàn)紊浩,把文件mmap到OS cache會(huì)引入讀性能瓶頸。測(cè)試表明疗锐,應(yīng)用不能充分使用flash的高性能坊谁,這是因?yàn)閿?shù)據(jù)的帶寬瓶頸引起了LevelDB的寫放大。通過(guò)提高寫速率和降低寫放大滑臊,可以避免很多問(wèn)題口芍,同時(shí)提高RocksDB性能。
RocksDB的典型場(chǎng)景(低延時(shí)訪問(wèn)):
1雇卷、需要存儲(chǔ)用戶的查閱歷史記錄和網(wǎng)站用戶的應(yīng)用
2鬓椭、需要快速訪問(wèn)數(shù)據(jù)的垃圾檢測(cè)應(yīng)用
3、需要實(shí)時(shí)scan數(shù)據(jù)集的圖搜索query
4关划、需要實(shí)時(shí)請(qǐng)求Hadoop的應(yīng)用
5小染、支持大量寫和刪除操作的消息隊(duì)列