原文链接:http://www.sysnote.org/2016/08/19/ceph-bluestore/

ceph后端支持多种存储引擎,以插件式的方式来进行管理使用,目前支持filestore,kvstore,memstore以及最新的bluestore,目前默认使用的filestore,但是因为filestore在写数据前需要先写journal,会有一倍的写放大,并且filestore一开始只是对于机械盘进行设计的,没有专门针对ssd做优化考虑,因此诞生的bluestore初衷就是为了减少写放大,并针对ssd做优化,而且直接管理裸盘,从理论上进一步减少文件系统如ext4/xfs等部分的开销,目前bluestore还处于开发优化阶段,在jewel版本还是试用版本,并且最新的master相比jewel已经做了大的重构,预期会在后续的大版本中稳定下来成为默认的存储引擎。本文基于master分支对bluestore存储引擎进行分析。

bluestore整体架构

bluestore直接管理裸设备,抛弃了ext4/xfs等本地文件系统,BlockDevice实现在用户态下使用linux aio直接对裸设备进行I/O操作。既然是直接管理裸设备就必然需要进行裸设备的空间管理,对应的就是Allocator,目前支持StupidAllocator和BitmapAllocator两种分配器。相关的元数据以kv的形式保存到kv数据库里,默认使用的是rocksdb,由于rocksdb本身是基于文件系统的,不是直接操作裸设备,但是rocksdb也比较灵活,将系统相关的处理抽象成Env,用户可用实现相应的接口,rocksdb默认的Env是PosixEnv,直接对接本地文件系统,为此,bluestore实现了一个BlueRocksEnv,继承自EnvWrapper,来为rocksdb提供底层系统的封装,为了对接BlueRocksEnv,实现了一个小的文件系统BlueFS,只实现rocksdb Env需要的接口,在系统启动mount这个文件系统的时候将所有的元数据都加载到内存中,BluesFS的数据和日志文件都通过BlockDevice保存到裸设备上,BlueFS和BlueStore可以共享裸设备,也可以分别指定不同的设备。

bluestore元数据


在之前的存储引擎filestore里,对象的表现形式是对应到文件系统里的文件,默认4MB大小的文件,但是在bluestore里,已经没有传统的文件系统,而是自己管理裸盘,因此需要有元数据来管理对象,对应的就是Onode,Onode是常驻内存的数据结构,持久化的时候会以kv的形式存到rocksdb里。

在onode里又分为lextent,表示逻辑的数据块,用一个map来记录,一个onode里会存在多个lextent,lextent通过blob的id对应到blob(bluestore_blob_t ),blob里通过pextent对应到实际物理盘上的区域(pextent里就是offset和length来定位物理盘的位置区域)。一个onode里的多个lextent可能在同一个blob里,而一个blob也可能对应到多个pextent。
另外还有Bnode这个元数据,它是用来表示多个object可能共享extent,目前在做了快照后写I/O触发的cow进行clone的时候会用到。

I/O读写映射逻辑

写I/O处理

到达bluestore的I/O的offset和length都是对象内(onode)的,offset是相对于这个对象起始位置的偏移,在_do_write里首先就会根据最小分配单位min_alloc_size进行判断,从而将I/O分为对齐和非对齐的。如下图所示:

当一个写请求按照min_alloc_size进行拆分后,就会分为对齐写,对应到do_write_big,非对齐写(即落到某一个min_alloc_size区间的写I/O(对应到do_write_small)。

do_write_big

对齐到min_alloc_size的写请求处理起来比较简单,有可能是多个min_alloc_size的大小,在处理时会根据实际大小新生成lextent和blob,这个lextent跨越的区域是min_alloc_size的整数倍,如果这段区间是之前写过的,会将之前的lextent记录下来便于后续的空间回收。

do_write_small

在处理落到某个min_alloc_size区间的写请求时,会首先根据offset去查找有没有可以复用的blob,因为最小分配单元是min_alloc_size,默认64KB,如果一个4KB的写I/O就只会用到blob的一部分,blob里剩余的还能放其他的。

1)没有找到可以复用的blob,新生成blob


在处理还还需要根据offset和len是否对齐到block_size(默认是4KB)进行补零对齐的操作,之所以需要补齐是与后续的写盘操作有关,真正写盘时有两种方式,一种是Direct I/O的方式,这种要求偏移和缓冲区都对齐的,另外一种非Direct I/O,即Buffered I/O,这种可以不对齐,但是是写到cache里,然后再sync刷到磁盘上,比如只写了100字节,在内核里是需要先从设备上读出来补齐成一个完整的扇区,然后再刷的,这样反而降低了效率。因此在bluestore里直接处理好对齐,对于后面的写盘来说比较有利,这里对齐到block_size,是个可配置的参数。

进行对齐补零时就是按照如上图那样把前后对齐到block_size,然后再把对齐后的offset和len作为lextent,进而放到blob里。

2)找到可以复用的blob

对于可以复用的blob,也是先按照block_size进行对齐补零的动作,然后再判断是否可以直接使用blob里空闲的空间进行区分做不同的处理。

a)直接写在blob未使用的空间上

这种情况下直接新生成lextent放到blob里。

b)覆盖写的情况

比如下面的这种情况,写I/O会覆盖部分已经写过的数据。

对于这种情况的处理如下图:也是需要先处理对齐补零的情况,如果覆盖的区域刚好是已经对齐到block_size,那么就不需要从磁盘读数据,但是如果覆盖的区域没有对齐到block_size,那么就需要把不对齐的那部分读出来,拼成一个对齐的buffer,然后新生成lextent,并且会对原来那个lextent进行调整,会记录需要回收的那部分区域。对于覆盖写的情况,都不是直接写盘,而是通过wal写到rocksdb。

整体写I/O的逻辑

之前组内同事画过一个流程图,这里借用一下算是一个简单的总结。

读I/O的处理


读I/O请求的处理时也是通过寻找相关联的lextent,可能会存在空洞的情况,即读到未写过的数据,这部分就直接补零。

clone及extent共享

前面说到Bnode就是用来记录共享的lextent,目前是在做完快照后对原卷进行写I/O会触发cow,从而产生clone操作。clone时就是将原对象的blob从onode->blob_map移到onode->bnode->blob_map,并且将blob id置为负的,并设置共享标记,然后将新的快照对象的onode->bnode指向原对象的onode->bnode,并且用原onode里的lextents里的值赋给新的onode的lextents,从而达到共享extent的目的,图示仅供参考。

在clone完之后,继续对原对象进行写I/O操作时,当碰到共享的blob时就需要跳过,新生成blob,并且取消对原来那部分lextent的引用,在后续的空间释放时的判断依据就是否还有引用。

小结

本文总体上介绍了bluestore的架构、相关元数据及内部I/O映射的逻辑,这还只是bluestore的冰山一角,后续会陆续对bluestore的处理流程、空间分配器、缓存管理、压缩等实现进行分析。

转载于:https://www.cnblogs.com/tchroot/p/7096856.html

ceph存储引擎bluestore解析相关推荐

  1. Ceph存储引擎BlueStore简析

    前文我们创建了一个单节点的Ceph集群,并且创建了2个基于BlueStore的OSD.同时,为了便于学习,这两个OSD分别基于不同的布局,也就是一个OSD是基于3中不同的存储介质(这里是模拟的,并非真 ...

  2. ceph存储原理_Ceph存储引擎BlueStore简析

    前文我们创建了一个单节点的Ceph集群,并且创建了2个基于BlueStore的OSD.同时,为了便于学习,这两个OSD分别基于不同的布局,也就是一个OSD是基于3中不同的存储介质(这里是模拟的,并非真 ...

  3. InnoDB 存储引擎详细解析

    InnoDB存储引擎详细解析 仅作为笔记 文章目录 InnoDB存储引擎详细解析 前言 一.InnoDB 存储引擎概述 二.InnoDB 存储引擎的版本 三.InnoDB 体系架构 3.1 后台线程 ...

  4. 【ceph】后端存储ObjectStore|BlueStore

    目录 ObjectStore简介 CEPH OBJECTSTORE API介绍 ObjectStore API 操作 事务 日志 实现 ObjectStore 实现 FileStore KeyValu ...

  5. mysql 存储引擎接口_MySQL 的基础一(连接池, SQL接口, 查询解析器, 查询优化器, 存储引擎接口, 执行器,)...

    MySQL数据库的连接池 现在我们已经知道,我们任何一个系统都会有一个数据库连接池去访问数据库,也就是说这个系统会有多个数据库连接,供多线程并发的使用.同时我们可能会有多个系统同时去访问一个数据库,这 ...

  6. MySQL的三层架构(连接认证、解析优化和存储引擎)

    对于数据库的认识,相信很大一部分人像我一样只停留在写各种SQL.优化各种查询语句以及索引的建立之上,只是停留在"会用"的基础上.但是如果想要充分发挥MySQL的性能,就必须要了解其 ...

  7. Innodb存储引擎-idb文件格式解析

    文章目录 ibd 文件格式解析 idb文件 page类型和格式(File Header & Trailer) FIL_PAGE_TYPE_FSP_HDR 格式 Extent Descripto ...

  8. openGauss数据库源码解析系列文章——存储引擎源码解析(四)

    上一篇我们详细讲述"3. astore元组多版本机制"."4.astore访存管理"及"5.astore空间管理和回收"相关内容.本篇我们将 ...

  9. 大文件存储引擎的实现与解析

    1.大文件系统背景 对于需要存储大量数据的平台,数据不可能只保存在普通的单个文件或单台服务器中. 原因: EMC高端存储一台上百万元,但是两台也才不到一百个T,07年以前高端小型存储,后去IOE化(以 ...

最新文章

  1. 内蒙古公安原创扫黑除恶主题MV《以警之名》全国首发
  2. OpenvSwitch — ovs-db 数据库
  3. HTML DOM Event 对象
  4. 【mmall】IDEA自动Make
  5. js异步请求php数据,原生JS发送异步数据请求实例详解
  6. 一文带你解读Volcano架构设计与原理
  7. iOS 14.5广告跟踪功能使广告商在安卓支出增长21%
  8. 金山反间谍清理专家能清除的部分恶意软件清单(截至2007年2月28日更新)
  9. 时钟系统(NTP子母钟系统)如何为高铁系统保驾护航
  10. Mybatis插入大量数据效率对比:foreach插入、SqlSession批量插入、sql插入
  11. WLAN 基础概念(一)
  12. ios标准时间转为北京时间
  13. Python编程快速上手-让繁琐工作自动化 — 读书与代码笔记
  14. 微信突破版本限制永久设置透明/半透明头像
  15. Python实现西瓜视频下载 保证可用2019-08-28最新版
  16. 有关weka的相关问题
  17. TCN时间卷积网络介绍
  18. 计算机应用模块等级考试大纲,全国计算机等级考试大纲 年版.doc
  19. 计算机网络的安全性在哪里,计算机网络面临的安全性威胁可分为哪两类分别包含..._安全工程师_帮考网...
  20. 今夜,整个中国零售业集体失眠!

热门文章

  1. 项目管理和缺陷跟踪工具Redmine
  2. Qt4在linux下的安装
  3. git管理大项目或者大文件
  4. K8S的横向自动扩容的功能Horizontal Pod Autoscaling
  5. Apache服务器下使用 ab 命令进行压力测试
  6. C#优化字符串操作【月儿原创】
  7. 【Qt】错误GL/gl.h: No such file or directory的解决方法(以及cannot find -lGL解决方法)
  8. 南大电子机器人入驻云南_云南大学外语协会 英文歌曲演唱比赛
  9. 3650服务器性能,全新联想System x3650 M4服务器性能出色
  10. 图像有损压缩matlab程序,基于Matlab的灰度图像DCT与RLE的混合有损压缩