持久性读缓存

介绍

在很长一段时间内,磁盘一直是数据存储的持久性手段。 随着SSD的引入,我们现在有了一个比传统磁盘快得多的持久性介质,但是写入持久性和容量有限,这使我们能够探索分层存储体系结构的机会。 像flash cache这样的开源实现使用SSD和磁盘作为分层存储,其性能优于服务器应用程序的磁盘。 RocksDB持久读取缓存是一种努力,它以一种设备无关和操作系统无关的方式为RocksDB生态系统利用分层存储体系结构。

分层存储 vs 分层缓存

RocksDB用户可以通过采用分层存储部署方法或采用分层缓存部署方法来利用分层存储体系结构。 使用分层存储方法,您可以在多个持久存储层上分发LSM的内容。 使用分层缓存方法,用户可以使用更快的持久介质作为读取缓存,为LSM中经常访问的部分提供服务,并提高RocksDB的整体性能。

分层缓存在数据移动性方面有一些优势,因为缓存是用于性能的附加组件。存储可以在没有缓存的情况下继续运行。

关键特性

硬件无关的

持久读取缓存是一种通用实现,并不是专门为任何类型的设备设计的。 我们没有针对特定类型的硬件进行设计,而是采用设计缓存的方法,为用户提供一种机制来描述访问设备的最佳方式,IO路径将按照描述进行配置。

编写代码路径可以用这个公式来描述 {块大小、队列深度、访问/缓存技术}

读取的代码路径可以用这个公式来描述 {访问/缓存技术}

块大小描述要读/写的大小。对于ssd,这通常是擦除块大小。

队列深度是设备表现出最佳性能的并行度。

访问/缓存技术用于描述访问设备的最佳方式。例如,使用直接IO访问适合某些设备/应用程序,而缓冲访问则是其他设备/应用程序的首选。

操作系统无关的

持久读取缓存是使用RocksDB抽象构建的,并且在所有支持RocksDB的平台上都受到支持。

可插入的

由于这是一个缓存实现,所以在重新启动时可能提供缓存,也可能不提供缓存。

设计和实现细节

持久读取缓存的实现有三个基本组件。

块查找索引

这是一个可伸缩的内存散列索引,它将给定的LSM块地址映射到缓存记录定位器。 缓存记录定位器帮助定位缓存中的块数据。缓存记录可以描述为{file-id, offset, size}。

文件查找索引/LRU

这是一个可伸缩的内存散列索引,允许基于LRU的清除。 此索引将给定的文件标识符映射到其引用对象抽象。对象抽象可用于从缓存中读取数据。 当持久缓存空间耗尽时,我们将从该索引中删除最近最少使用的文件。

文件布局

缓存以文件序列的形式存储在文件系统中。每个文件包含一系列记录,这些记录包含与RocksDB LSM上的块对应的数据。

API

请按照下面的链接查看公共API https://github.com/facebook/rocksdb/blob/master/include/rocksdb/persistent_cache.h