Introduction
??很長一段時(shí)間脑奠,持久化數(shù)據(jù)存儲(chǔ)都是使用磁盤权烧。隨著SSD的引入,我們現(xiàn)在有了新的持久化的存儲(chǔ)介質(zhì)肢扯,這種存儲(chǔ)介質(zhì)比傳統(tǒng)的磁盤更快,也給人們提供了探索分層存儲(chǔ)架構(gòu)的機(jī)會(huì)担锤。像flash cache一樣的開源實(shí)現(xiàn)都是使用SSD和disk作為分層的底層存儲(chǔ)蔚晨。RocksDB的持久化讀cache嘗試以一種對(duì)設(shè)備無感知且獨(dú)立于操作系統(tǒng)的方式來充分發(fā)揮分層存儲(chǔ)架構(gòu)的優(yōu)點(diǎn)。
Tiered Storage Vs Tiered Cache
??RocksDB可以通過兩種方式利用分層存儲(chǔ)架構(gòu):分層存儲(chǔ)部署和分層緩存部署肛循。當(dāng)使用前者時(shí)铭腕,可以將LSM的數(shù)據(jù)分布在多層持久化存儲(chǔ)中。使用后者時(shí)多糠,用戶可以使用快速的持久化媒介來提供高性能的讀cache服務(wù)累舷,避免頻繁讀取LSM的part數(shù)據(jù),提高RocksDB的整體性能熬丧。
??就數(shù)據(jù)的流動(dòng)性而言笋粟,分層cache有很多優(yōu)點(diǎn),因?yàn)閏ache是提升性能的一個(gè)加分項(xiàng)析蝴。數(shù)據(jù)庫在沒有cache時(shí)害捕,仍然可以提供服務(wù)。
Key Features
硬件無感知
??persistent read cache是一種通用的實(shí)現(xiàn)闷畸,并不是為任何特殊的設(shè)備設(shè)計(jì)的尝盼。RocksDB設(shè)計(jì)了這種cache來為用戶提供一種以最好的方式訪問設(shè)備的機(jī)制。
Write code path
{ Block Size, Queue depth, Access/Caching Technique }
Read code path
{ Access/Caching Technique }
block size描述了讀寫的塊大小佑菩。在SSD場景下盾沫,block size應(yīng)該是刪除塊(erase block)的大小裁赠。queue depth是設(shè)備發(fā)揮最優(yōu)性能的并行度。Access/Caching技術(shù)用來提供訪問設(shè)備的最優(yōu)方式赴精。在某種設(shè)備或者應(yīng)用下比較適合采用direct IO佩捞,其他場景下有可能使用buffered access。
操作系統(tǒng)無感知
持久化讀緩存適用于RocksDB支持的所有平臺(tái)
可插拔
持久化緩存是一種cache的實(shí)現(xiàn)蕾哟,該功能不能保證都支持一忱。
設(shè)計(jì)和實(shí)現(xiàn)細(xì)節(jié)
持久化緩存有三部分組成
Block Lookup Index
??Block Lookup Index是一種可伸縮的內(nèi)存hash索引,key為LSM block address谭确,value為cache record locator帘营。通過cache record locator可以locate到cache中的block數(shù)據(jù)。Cache record可以描述為:{ file-id, offset, size }
File Lookup Index / LRU
??這是一種基于LRU可實(shí)現(xiàn)淘汰機(jī)制的可伸縮的內(nèi)存hash索引逐哈,key為一個(gè)文件標(biāo)志芬迄,value為文件的 reference object abstraction。 reference object abstraction可以用來從cache中讀取數(shù)據(jù)昂秃。當(dāng)耗盡持久化緩存的空間時(shí)禀梳,就可以從index中根據(jù)LRU策略來淘汰一些file。
File Layout
??這種cache以有序文件的形式存儲(chǔ)在文件系統(tǒng)中械蹋。每個(gè)文件包含一個(gè)record序列出皇,每個(gè)record包含RocksDB LSM上某一個(gè)block的相應(yīng)數(shù)據(jù)。