Ceph bluestore中的缓存管理

2023-11-19

从15年3月接触Ceph分布式存储系统,至今已经5年了;因为工作的需要,对Ceph的主要模块进行了较深入的学习,也在Ceph代码层面做了些许改进,以满足业务需要(我们主要使用M版本)。最近得闲,将过往的一些学习心得、改进以及优化思路记录下了,希望能对后来者有所帮助。

这是第四篇:Ceph bluestore中的缓存管理

前言

bluestore构建在裸盘上,在用户空间,通过FreelistManager以及Allocator来管理磁盘空间且通过direct-io访问磁盘,所以它不能够利用到系统的pagecache。为了提升性能,bluestore在用户态实现了基于2q和lru算法的cache。

bluestore中的缓存管理

缓存对象及相关数据结构

在继续后文前,我们先来明确几个主要的结构及其作用:

  1. Object: Ceph实际上分布式对象存储系统,通过Object来表示存储系统中的IO对象,类似传统文件系统中的文件,由数据(Bufferlist)和元数据(Onode)两部分组成
  2. Collection:pg的内存表示,常驻内存,它是Object对象的逻辑仓库
  3. bluestore_cnode_t:Collection的元数据
  4. Onode: Object的元数据,包含对象id以及指向对象数据逻辑位置<offset, len>的ExtentMap结构
  5. bluestore_onode_t:Onode的元数据,存储在db中
  6. Cache:bluestore 缓存对象,有LRUCache和TwoQCache两种
  7. OnodeSpace:Onode的缓存管理对象,包含一个Cache对象以及一个unordered_map类型的Onode映射
  8. Buffer:Object对象数据(bufferlist,offset,len)的缓存表示
  9. BufferSpace:用于管理Buffer,包含一个Buffer的map,角色类似OnodeSpace

Collection与bluestore_cnode_t, Onode与bluestore_onode_t的关系类似于Linux文件系统中内存inode与磁盘inode的关系

下面的UML类图展示了上述对象之间的关系:
在这里插入图片描述
OSD启动时,Bluestore会创建多个Cache实例,之后从db加载Collection到内存中时,通过cid % shard_num模与Cache关联,所有的Collection常驻内存,通过一个map来管理;每个Collection包含一个Cache指针,一个元数据对象bluestore_cnode_t以及一个OnodeSpace类型的onode_map变量,这个变量包含与Collection相同的Cache实例以及一个Onode的unorderd_map对象(这个unorderd_map应该是用来加速查找的,因为Cache可能被多个Collection共享,通过每个OnodeSpace中的专属结构来管理本Collection的Onode,可以提升效率)。

Ceph中的对象元数据(这里说的元数据是指数据元数据,对象属性通过ObjectMap来管理)通过Onode来管理,包含对象的id以及一个ExtentMap结构来表示对象的数据偏移及长度信息,每个Extent表示逻辑上连续的数据片段,通过<offset, len>来标识;由于一段逻辑数据在物理上可能不连续,可能对应多个物理存储区bluestore_pextent_t, 为便于管理引入了Blob,它是bluestore_pextent_t的集合(PExtentVector),Blob还是Ceph中的数据共享单位,快照克隆的时候,共享数据通过更新引用计数即可,不需要磁盘拷贝。

Bluestore提供了LRU cache 和 2Q cache两种缓存机制,默认采用2Q cache。LRUCache,淘汰最近最少使用的item,采用list来实现,Onode和Buffer各占用一个队列;TwoQCache,针对Onode和Buffer采用不同的处理方式,其中Onode缓存采用LRU实现,而Buffer将整个缓存空间分为三部分,使用三个队列,分别称为hot,warm_in,warm_out来管理,新加入的数据加入到warm_in队列,再次访问的数据加入到hot队列,warm_in中的冷数据向移到warm_out队列,另外TwoQCache充分利用局部性原理,加入对象时会根据offset匹配前后的对象,将新对象加入到临近对象的前面。下图是LRU和2Q缓存的一个示例说明:
在这里插入图片描述

缓存管理

缓存系统的基本操作包括CRUD四种,Cache主要提供了:add(C),touch(U),rm(D),trim(D)四个方法,OnodeSpace或者BufferSpace提供了:add(C),rename(U),lookup(R),discard (U),remove(D)四个方法, 可以想到OnodeSpace和BufferSpace实现了一部分业务语义:

add方法:包括Onode和Buffer两部分,就Onode而言:LRUCache和TwoQCache采用相同的策略,如果对象已经在缓存中,则直接返回,否则将Onode加入到OnodeSpace的onode_map中并插入到cache的onode队列的头部;对于Buffer:LRUCache采用与Onode相同的策略,将对象插入到cache的buffer队列的头部,而TwoQCache维护了三个队列,根据热度属性将对象分别添加到hot,warm_in,warm_out队列。
lookup方法:用来从OnodeSpace的onode_map中查找对象,如果找到则通过touch方法将对象提升到cache的onode队列的头部,需要注意的是TwoQCache中,只有hot队列中的队列才会提升到cache的头部。
rm方法:包括Onode和Buffer两部分,就Onode而已:LRUCache和TwoQCache采用相同的策略,将对象从队列中删除,将对象从OnodeSpace的onode_map中删除;对于Buffer:LRUCache采用与Onode相同的策略,将对象从队列中删除,TwoQCache则将对象从hot,warm_in,warm_out之一中移除。
trim方法:根据需要保留的onode_max以及buffer_max清理缓存,包括Onode和Buffer两部分,基本上就是简单的将对象从队列中移除,TwoQCache对Buffer的处理有些许不同:它根据各队列的数据空间占比(ratio)来计算每个队列需要移除的对象。
rename方法:处理对象的重命名操作。
discard方法:淘汰给定区间的缓存对象。

缓存的使用

下文从缓存初始化,读IO和写IO三个方面来分析Bluestore cache的使用。

  1. 缓存的初始化
    1)OSD init初始化时 Bluestore根据设置的shard_num, cache_type创建cache实例
    2)Bluestore mount时从db加载Collection,通过cid与 shard_num取模关联特定的cache实例,Blustore通过一个map来管理内存中的Collection。
  2. 读io缓存使用
    1)Bluestore收到读请求后,从cache中获取对象的onode(包含extent信息),并且将onode移到队列的头部
    2)如果上述获取的onode的extent中不全部包含<offset, len>所需要的信息,则从db中加载缺失部分的extent
    3)根据<offset, len>从cache中读取缓存数据,并将命中的数据移到队列头部
    4)对于不在缓存中的数据则从后端磁盘上读取,如果启用了bufferIO,则将数据加入到缓存队列头部(warm_in队列)
  3. 写io缓存使用
    1)Bluestore收到写请求后,从cache中获取onode或者创建一个onode, 并将onode插入队列的头部
    2)如果上述获取的onode的extent中不全部包含<offset, len>所需要的信息,则从db中加载缺失部分的extent
    3)如果启用了bufferIO,则将数据(如果IO区间有重叠会先从磁盘读取数据做合并)加入到缓存队列的头部
    4)(在执行io前)将缓存元数据(Onode,SharedBlob)持久化到db中(这个过程中,ExtentMap可能需要分片,根据needs_reshard_begin/needs_reshard_end来决定需要reshard的区间)。

步骤3中有几点需要注意:

  1. 数据缓存是以Blob单位进行的,
  2. 如果和之前的缓存数据有部分重叠,会truncate掉front和tail,如果完全包含则先从cache中删除掉
  3. 根据数据的热度属性将对象添加到不同的队列中,新增的数据插入到warm_in队列,如果与之前的数据有重叠,那么加入哪个队列与之前数据的热度属性相关
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ceph bluestore中的缓存管理 的相关文章

  • 模拟实现通讯录<二>(动态模拟)

    继静态模拟通讯录 实现动态模拟 静态模拟通讯录博客链接 http blog csdn net bitboss article details 51374654 实现一个通讯录 通讯录可以动态存储信息 每个人的信息包括 姓名 性别 年龄 电话
  • Ceph 4 slow ops, oldest one blocked for 638 sec, mon.cephnode01 has slow ops

    因为实验用的是虚拟机的关系 晚上一般会挂起 第二天早上都能看到 4 slow ops oldest one blocked for 638 sec mon cephnode01 has slow ops的报错 虽然不影响使用 但看着有点难受
  • ostream_iterator详细解析

    ostream iterator属于I O流STL适配器 用于获取一个元素 同时保存在缓冲器中 可以供Cout输出 如果把cout看做成一个对象 那么在Cout对象当中存在一片用于数据存储的区域 ostream iterator在STL中一
  • PPI协议详解 ppi通讯协议 ppi通信协议 vb与ppi协议通讯

    PPI协议详解 ppi通讯协议 ppi通信协议 vb与ppi协议通讯 PPI协议详解 ppi通讯协议 ppi通信协议 vb与ppi协议通讯 我们提供 PPI协议的官方文档 协议更新时间为2005年 下面是我们根据文档解析的PPI读取变量返回
  • Hbase的入门心得:

    Hbase的入门心得 在了解了Hadoop的大家族的核心成员HDFS MapReduce以及资源管理器YARN后 HBase又是一个新颖的技术出现 在超人学院吴超老师的视频里介绍到 HBase Hadoop Database是一个分布式的
  • Filebench 使用手册

    Filebench 使用手册 介绍 Filebench 是一个文件系统和存储基准 可以生成各种各样的工作负载 与典型的基准测试不同 它非常灵活 允许使用其广泛的工作负载模型语言 WML 指定应用程序的 I O 行为 用户可以从头开始描述所需
  • Redis-Sentinel(哨兵模式),看这篇就够了哦

    文章目录 简介 启动并初始化Sentinel 初始化Sentinel服务器 替换普通Redis代码为Sentinel的专用代码 初始化 Sentinel 状态 初始化Sentinel监视的主服务器列表 创建连向主服务器的网络连接 获取主服务
  • 小松的STM32教程(13)—— 驱动外部内存24C02

    预备 学习目标 概述 24cxx c include 24cxx h include delay h include delay h void IIC Init void GPIO InitTypeDef GPIO InitStructur
  • 使用 Oracle的存储过程实现数据加密和解密

    我们都知道 几乎所有的数据库都有存储过程 但在实际开发中 它有什么用途了 下面使用Oracle的存储过程 采用Oracle自带的dbms obfuscation toolkit desencrypt对数据进行加密 需要注意的是密码的长度必须
  • redis学习笔记(七):redis常见问题和解决方案

    目录 一 缓存穿透 1 基本介绍 2 解决方案 1 布隆过滤器 2 缓存空对象 3 参数校验 4 对比 二 缓存击穿 1 基本介绍 2 解决方案 1 互斥锁 2 永不过期 3 两种方案对比 三 缓存雪崩 1 基本介绍 2 解决方案 1 过期
  • windows下redis设置redis开机自启动方法(保姆级)

    1 找到Redis所在的目录 在文件路径框中输入cmd 2 进入到控制台下的Redis所在目录 输入下列命令 redis server service install redis windows service conf loglevel
  • redis缓存雪崩、穿透、击穿

    这篇文章我们来了解一下一些redis的高并发问题以及他的解决方法 上图是一个简单的数据查询流程 前台请求 后台先从缓存中取数据 取到直接返回结果 取不到时从数据库中取 数据库取到更新缓存 并返回结果 数据库也没取到 那直接返回空结果 一 r
  • Redis介绍、安装、基础命令

    目录 引言 一 关系数据库和非关系数据库 1 1 关系型数据库 1 2 非关系型数据库 1 3 关系型数据库与非关系型数据库区别 数据存储方式不同 扩展方式不同 对事务性的支持不同 非关系型数据库产生背景 二 Redis简介 2 1 Red
  • 函数getopt(),及其参数optind

    getopt被用来解析命令行选项参数 转载地址 http hi baidu com xlt1888 blog item 703148383008492670cf6c2d html include
  • Response响应方法详解

    Response 响应 服务器把请求的处理结果告知客户端 在B S架构中 响应就是把结果带回浏览器 响应对象 在项目中用于发送响应的对象 常用状态码 状态码 说明 200 执行成功 302 它和307一样 都是用于重定向的状态码 只是307
  • Redis 7.0 核心技术、实战应用、面试题

    Redis 7 0 核心技术与实战应用 Redis 入门概述 01 Redis 是什么 Redis REmote Dictionary Server 远程字典服务器 官网介绍 https redis io docs about 官网定义 R
  • Ceph入门到精通- smartctl -l error检查硬盘指标

    smartctl l error 是一个 Linux 命令 用于查看磁盘驱动器的 SMART Self Monitoring Analysis and Reporting Technology 错误日志 SMART 是一种技术 能够监测硬盘
  • Redis生产环境最佳实践

    欢迎关注公众号 通过文章导读关注 11来了 及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理解 Redis 系列文章结合电商场景讲解 Redis 使用场景 中间件系列笔记 和 编程高频电子书 文章导读地址 点击查看文
  • 浏览器缓存相关面试题一网打尽,理论结合实践,用代码学习缓存问题,建议关注+收藏,(含项目源代码)

    前言 浏览器缓存的问题是面试中关于浏览器知识的重要组成部分 也是性能优化题目的一部分 但是不要被吓到 我话放到这里 就那么点东西 我这一篇文章基本上就涵盖了所有相关的知识点 认真看一遍 所有的问题都是纸老虎 一 准备工作 1 1 拉取仓库
  • Ceph:每个 OSD PG 太多

    我使用推荐值配置了 Ceph 使用文档中的公式 我有 3 个 OSD 我的配置 我已将其放在监视器节点和所有 3 个 OSD 上 包括以下内容 osd pool default size 2 osd pool default min siz

随机推荐

  • 学习总结——按下按键灯亮,再次按下按键,灯灭

    按键控制灯的亮灭 1 主要实现按键控制灯的亮灭 按键按下 灯亮 再次按下 灯灭 主要对实现的逻辑进行控制 逻辑清晰 很简单 实现的方法有两种 方法1 将按键按下的值赋值给一个变量 变量除以2的值的是基数或者偶数来确定灯亮还是灯灭 程序中设置
  • 堆栈 对比

    https www cnblogs com guoxiaoyan p 8664150 html
  • STL — Set/Multiset容器

    1 1 Set容器基本概念 Set的特性是 所有元素都会根据元素的键值自动被排序 Set的元素不像map那样可以同时拥有实值和键值 set的元素即是键值又是实值 set不允许两个元素有相同的键值 我们可以通过set的迭代器改变set元素的值
  • POI解析word\pdf中表格

  • Windows10下SlowFast环境安装和运行

    SlowFast安装详解 第一步 下载官方源码 第二步 我搭建的环境配置 第二步 安装其他包以及出现的问题 第三步 构建SlowFast 第四部 下载权重和标签 第五步 更改参数 第六步 当然是运行啦 第一步 下载官方源码 github代码
  • Retrofit2.0使用详解

    简介 Retrofit是由Square公司提供的开源产品 为Android平台的应用提供一个类型安全的REST客户端 其实质上是对OkHttp的封装 使用面向接口的方式进行网络请求 利用动态生成的代理类封装了网络接口请求的底层 将REST
  • Windows程序员必须掌握的计算机编码问题——海明码(通俗易懂)

    我是荔园微风 作为一名在IT界整整25年的老兵 今天总结一下计算机中的编码问题 来看第二部分 海明码 很多初学者一看到海明码就郁闷 因为课本上关于海明码的描述实在是太难懂了 那就跟随我一起来搞懂海明码 我用最简单最好懂的方式描述 我不会使用
  • 基于STM32F4单片机对步进电机的控制(有代码)

    步进电机简介 步进电机是将电脉冲控制信号转变为角位移或线位移的一种常用的数字控制执行元件 又称为脉冲电机 在驱动电源的作用下 步进电机受到脉冲的控制 其转子的角位移量和速度严格地与输入脉冲的数量和脉冲频率成正比 步进电机每接收一个电脉冲 转
  • R语言 write.xlsx() 写入同一excel,及同一sheet注意

    write xlsx x file sheetName Sheet1 col names TRUE row names TRUE append FALSE showNA TRUE 1 想要将data1写da xlsx的sheet1 data
  • spring boot 配合element ui vue实现表格的批量删除(前后端详细教学,简单易懂,有手就行)

    目录 一 前言 二 前端代码 2 1 element ui组件代码 2 2删除按钮 2 3 data 2 4 methods 三 后端代码 一 前言 研究了其他人的博客 找到了一篇有含金量的 进行了部分改写实现前后端分离 参考博主为小白Ra
  • 【下降算法】最速下降法、Newton法、共轭梯度法

    文章目录 1 一维搜索 2 最速下降法 最速下降法特征 最速下降法的优缺点 3 Newton法 算法基本思想 牛顿法和梯度下降法的效率对比 4 共轭梯度法 1 一维搜索 最优化问题一般选择某一组变量 然后在满足一定的限制条件下 求出使目标值
  • Servlet 和 Cookie-Session 学习笔记(基础)

    简单来说 是运行在服务器端的 Java 程序 它作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层 用处 使用 Servlet 您可以收集来自网页表单的用户输入 呈现来自数据库或者其他
  • PyCrypto,PyCryptodome, Python 调用密码学算法AES

    Crypto PyCrypto PyCryptodomeCrypto PyCrypto 参考网址附上 今天我真的也是很无奈了 想要做一个密码学的作业 需要用到pycrypto的包 但是安装完之后不能正常调用 就找到了PyCryptodome
  • fetch 服务器不响应,Fetch 常见的使用问题

    fetch的浏览器兼容 fetch默认不携带cookie fetch发送请求默认是不发送cookie的 不管是同域还是跨域 需要设置 fetch url credentials include 可以配置其credentials项 其有3个值
  • CAN FD基础

    CAN FD基础 一 CAN FD与CAN 2 0的区别 1 CAN FD的优势 该协议能够支持更高的速率 可以更快的刷写ECU 在单个数据帧内传送率可达64字节 避免了经常发生的数据分拆传输的状况 对汽车行业而言 CAN FD协议显得非常
  • CVE-2023-21839 Weblogic IIOP RCE复现

    漏洞描述 WebLogic是美国Oracle公司出品的一个application server 用于本地和云端开发 集成 部署和管理大型分布式Web应用 网络应用和数据库应用的Java应用服务器 WebLogic Server是一个基于JA
  • 微信图片上传 invalid credential, access_token is invalid or not latest

    这个问题可能是因为你部署的时候 起了多个进程 每个进程都去微信的服务器获取一次access token 只有最后一个获取到的access token才有效 比如 如果你用gunicorn去启django 并设置4个进程 那么你会发现 每上传
  • spring id,name

    转载于 https www cnblogs com 549294286 p 9947815 html 在BeanFactory的配置中 是我们最常见的配置项 它有两个最常见的属性 即id和name 最近研究了一下 发现这两个属性还挺好玩的
  • 如何覆盖上一次commit_Git如何在已有的 commit 上再次提交?

    在一些受管控的项目上 提交代码到 git 服务器后 还需要经过审核确认才正式合入版本 一般常用 gerrit 来进行审核确认操作 如果提交的代码审核不通过 需要再次修改提交 由于是修改同一个问题 我们可能不希望生成多个 commit 信息
  • Ceph bluestore中的缓存管理

    从15年3月接触Ceph分布式存储系统 至今已经5年了 因为工作的需要 对Ceph的主要模块进行了较深入的学习 也在Ceph代码层面做了些许改进 以满足业务需要 我们主要使用M版本 最近得闲 将过往的一些学习心得 改进以及优化思路记录下了