本文分享自天翼云开发者社区《RocksDB 二级缓存》,作者:b****n

RocksDB 团队正在实现对非易失性介质上的块缓存的支持。可以看作是 RocksDB 当前的易失性块缓存的扩展。非易失性块缓存充当第二层缓存,其中包含从易失性缓存中逐出的块。当这些块由于访问而变得更热时,它们会被提升到易失性缓存中。

此功能适用于数据库位于远程存储或云存储上的情况。非易失性缓存在 RocksDB 中被称为 SecondaryCache。通过维护比 DRAM 大一个数量级的二级缓存,需要从远程存储读取的次数会更少,从而减少读取延迟和网络带宽消耗。

从用户的角度来看,本地闪存缓存将支持以下需求:

1.打开数据库时提供指向二级缓存的指针。

2.能够在同一进程中跨DB共享二级缓存。

3.一台主机上有多个二级缓存。

4.通过确保缓存键的可重复性,支持跨进程重启和重启持久化缓存。

设计

在为 SecondaryCache 设计 API 时,我们可以选择使其对 RocksDB 代码可见或将其隐藏在 RocksDB 块缓存后面。将它隐藏在块缓存后面有几个优点:

1.允许灵活地将块插入二级缓存。块可以在从 RAM 层逐出时插入,也可以立即插入。

2.无论是否配置了二级缓存,它通过提供统一的接口来降低 RocksDB 代码的其余部分的复杂性。

3.使并行读取、在缓存中查看预取、故障处理等更容易。

4.如果需要,可以更轻松地扩展为压缩数据,并允许将其他持久性媒体添加为附加层。

我们决定通过将二级缓存隐藏在block cache后面,使二级缓存对其余 RocksDB 代码透明。我们需要解决的一个关键问题是缓存项的内存分配和所有权,插入二级缓存可能需要由其分配内存。这意味着需要将缓存对象中可以转移到二级缓存的部分复制出来,并且在查找时需要将二级缓存中存储的数据提供给对象构造函数。对于 RocksDB 缓存对象,如数据块、索引和过滤器块以及压缩字典,解包涉及复制出块的原始未压缩块,打包涉及使用原始未压缩数据构造相应的块/索引/过滤器/字典对象。

我们考虑的另一种选择是现有的 PersistentCache 接口。但是,我们决定不追求它并最终弃用它,原因如下:

1.它直接暴露给表读取器代码,这使得实现不同策略将其扩展到更复杂的准入控制策略变得更加困难。

2.该接口不允许自定义内存分配和对象打包/解包,因此无论如何都必须定义新的 API。

3.当前的 PersistentCache 实现非常简单,没有任何准入控制策略。

应用程序接口

RocksDB 的块缓存和二级缓存之间的接口被设计为允许可插拔实现。对于企业内部使用,我们计划使用带有wrapper的Cachelib提供插件实现,并使用folly等fbcode库,RocksDB无法直接使用,来高效实现缓存操作。下图显示了块的插入和查找流程:

二级缓存中的项目由 SecondaryCacheHandle 引用。句柄可能不会立即准备好或具有有效值。调用者可以调用 IsReady() 以确定它是否准备就绪,并且可以调用 Wait() 以阻塞直到它准备就绪。调用方必须在准备就绪后调用 Value() 以确定项目是否已成功读取。Value() 必须在失败时返回 nullptr。

二级缓存的用户(例如,通过 LRUCache 间接调用的 BlockBasedTableReader)必须实现 CacheItemHelper 中定义的回调,以便于解包/打包对象以保存到二级缓存和从中恢复。必须实现 CreateCallback 以从二级缓存中的原始数据构造可缓存对象。

二级缓存提供者必须提供 SecondaryCache 抽象类的具体实现。

SecondaryCache 由用户通过在 LRUCacheOptions 中提供指向它的指针来配置。

当前进展

最初的 RocksDB 对二级缓存的支持已经合并到主分支中,并将在 6.21 版本中提供。这包括在实例化 RocksDB 的 LRU 缓存(易失性块缓存)时为用户提供一种配置二级缓存的方法,将从 LRU 缓存驱逐的块溢出到闪存缓存,将块从 SecondaryCache 读取到 LRU 缓存,更新工具例如 cache_bench 和 db_bench 来指定闪存缓存。相关的 PR 是#8271、#8191和#8312。

我们使用上述 PR 以及基于 Cachelib 的 SecondaryCache 实现制作了端到端解决方案的原型。我们运行了一个 mixgraph 基准测试来模拟真实的读/写工作负载。结果显示,与没有本地缓存​​相比,使用本地闪存缓存可提高 15%,网络读取减少约 25-30%,缓存未命中率相应减少。

未来展望

在短期内,我们计划执行以下操作以将 SecondaryCache 与 RocksDB 完全集成:

1.使用DB session ID作为缓存键前缀,保证唯一性和可重复性

2.优化 MultiGet 和迭代器工作负载的闪存缓存使用

3.压力测试

4.更多基准测试

从长远来看,我们计划将其部署在 Facebook 的生产环境中。

RocksDB 二级缓存的更多相关文章

  1. 探索ASP.NET MVC5系列之~~~5.缓存篇(页面缓存+二级缓存)

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

  2. [原创]关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  3. Hibernate+EhCache配置二级缓存

    步骤: 第一步:加入ehcache.jar 第二步: 在src目录下新建一个文件,名为:ehcache.xml 第三步:在hibernate配置文件的<session-factory>下配 ...

  4. MyBatis 延迟加载,一级缓存,二级缓存设置

    什么是延迟加载 resultMap中的association和collection标签具有延迟加载的功能. 延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息.使用关联信息时再去加载关联信息 ...

  5. EF 二级缓存 EFSecondLevelCache

    EFSecondLevelCache ======= Entity Framework .x Second Level Caching Library. 二级缓存是一个查询缓存.EF命令的结果将存储在 ...

  6. MVC实用架构设计(三)——EF-Code First(5):二级缓存

    前言 今天我们来谈谈EF的缓存问题. 缓存对于一个系统来说至关重要,但是是EF到版本6了仍然没有见到有支持查询结果缓存机制的迹象.EF4开始会把查询语句编译成存储过程缓存在Sql Server中,据说 ...

  7. hibernate笔记--缓存机制之 二级缓存(sessionFactory)和查询缓存

    二级缓存(sessionFactory): Hibernate的二级缓存由SessionFactory对象管理,是应用级别的缓存.它可以缓存整个应用的持久化对象,所以又称为“SessionFactor ...

  8. Hibernate ——二级缓存

    一.Hibernate 二级缓存 1.Hibernate 二级缓存是 SessionFactory 级别的缓存. 2.二级缓存分为两类: (1)Hibernate内置二级缓存 (2)外置缓存,可配置的 ...

  9. hibernate缓存(一级缓存、二级缓存)

    一.一级缓存(Session缓存)      意义:提高hibernate查询效率.      缺点:可能会因并发,产生数据不一致.      基于session的缓存,利用hibernate执行查询 ...

  10. HIbernate二级缓存

    一.定义: 二级缓存是进程或集群范围内的缓存,可以被所有的Session共享,是可配置的插件 二.二级缓存原理图 解析:每次从二级缓存中取出的对象,都是一个新的对象. 三.配置步骤如下: 同理:以员工 ...

随机推荐

  1. 全面解读TaurusDB透明压缩特性,降低数据库使用成本

    本文分享自华为云社区<[华为云MySQL技术专栏]TaurusDB透明压缩>,作者: GaussDB 数据库. 背景介绍 某一部分特定比例的客户群体,对数据库的读写性能要求并不高.相比之下 ...

  2. Qt QTtoolButton 鼠标移动到按钮上时,弹出菜单后,按钮的hover状态无法恢复的问题

    需求:QTtoolButton 鼠标移到按钮上时,弹窗菜单,并且点击菜单或者其他地方,菜单关闭后,按钮的hover状态需要恢复原状. 1. 创建按钮和菜单,并安装事件过滤器 m_Menu = new ...

  3. sqlserver查询某数据库下表的占用空间

    要查看 SQL Server 中哪个表占用的空间最多,您可以使用以下查询来列出所有表及其占用的空间大小,并按照占用空间从大到小进行排序: SELECT t.NAME AS TableName, p.r ...

  4. AI 与数据的智能融合丨大模型时代下的存储系统

    WOT 全球技术创新大会2024·北京站于 6 月 22 日圆满落幕.本届大会以"智启新纪,慧创万物"为主题,邀请到 60+ 位不同行业的专家,聚焦 AIGC.领导力.研发效能.架 ...

  5. Proxmox VE(虚拟机集群)安装配置

    #Proxmox VE 安装配置 创建kvm模板 有私有云需求, 创建与管理Windows和Linux虚拟机的场景,使用PVE(Proxmox VE)管理很方便. 本人使用PVE管理公司开发测试环境几 ...

  6. Shiro安全框架【认证】+【授权】

    1.Shiro的核心架构 Subject:程序主体 Security Manager:安全管理器 Authentication:做认证 Authorizer:做授权 Session Manager:会 ...

  7. ctr命令的基本使用与技巧

    k8s早1.24后放弃docker,并把containerd作为运行时组件,containerd 调用链更短,组件更少,更稳定,占用节点资源更少 ctr是containerd的一个客户端工具 cric ...

  8. 【转载】Spring Security Oauth2 自定义 OAuth2 Exception

    https://www.cnblogs.com/merryyou/p/9100260.html 前言 在使用Spring Security Oauth2登录和鉴权失败时,默认返回的异常信息如下 { & ...

  9. Qt编写安防视频监控系统47-基本设置

    一.前言 一个系统中肯定有不少的配置参数存储在配置文件中,配置文件可以是ini文件,也可以是json文件,还可以是自定义格式的文本文件,本人比较推荐ini文件,读写节点极其方便,支持中文内容,各种Qt ...

  10. Qt音视频开发38-USB摄像头解码linux方案

    一.前言 做嵌入式linux上的开发很多年了,扳手指头算算,也起码9年了,陆陆续续做过很过诸如需要读取外接的USB摄像头或者CMOS摄像机的程序,实时采集视频,将图像传到前端,或者对图像进行人脸分析处 ...