Introduction
很长一段时间,持久化数据存储都是使用磁盘。随着SSD的引入,我们现在有了新的持久化的存储介质,这种存储介质比传统的磁盘更快,也给人们提供了探索分层存储架构的机会。像flash cache一样的开源实现都是使用SSD和disk作为分层的底层存储。RocksDB的持久化读cache尝试以一种对设备无感知且独立于操作系统的方式来充分发挥分层存储架构的优点。
Tiered Storage Vs Tiered Cache
RocksDB可以通过两种方式利用分层存储架构:分层存储部署和分层缓存部署。当使用前者时,可以将LSM的数据分布在多层持久化存储中。使用后者时,用户可以使用快速的持久化媒介来提供高性能的读cache服务,避免频繁读取LSM的part数据,提高RocksDB的整体性能。
就数据的流动性而言,分层cache有很多优点,因为cache是提升性能的一个加分项。数据库在没有cache时,仍然可以提供服务。
Key Features
硬件无感知
persistent read cache是一种通用的实现,并不是为任何特殊的设备设计的。RocksDB设计了这种cache来为用户提供一种以最好的方式访问设备的机制。
Write code path
{ Block Size, Queue depth, Access/Caching Technique }
Read code path
{ Access/Caching Technique }
block size描述了读写的块大小。在SSD场景下,block size应该是删除块(erase block)的大小。queue depth是设备发挥最优性能的并行度。Access/Caching技术用来提供访问设备的最优方式。在某种设备或者应用下比较适合采用direct IO,其他场景下有可能使用buffered access。
操作系统无感知
持久化读缓存适用于RocksDB支持的所有平台
可插拔
持久化缓存是一种cache的实现,该功能不能保证都支持。
设计和实现细节
持久化缓存有三部分组成
Block Lookup Index
Block Lookup Index是一种可伸缩的内存hash索引,key为LSM block address,value为cache record locator。通过cache record locator可以locate到cache中的block数据。Cache record可以描述为:{ file-id, offset, size }
File Lookup Index / LRU
这是一种基于LRU可实现淘汰机制的可伸缩的内存hash索引,key为一个文件标志,value为文件的 reference object abstraction。 reference object abstraction可以用来从cache中读取数据。当耗尽持久化缓存的空间时,就可以从index中根据LRU策略来淘汰一些file。
File Layout
这种cache以有序文件的形式存储在文件系统中。每个文件包含一个record序列,每个record包含RocksDB LSM上某一个block的相应数据。