前文我们创建了一个单节点的Ceph集群,并且创建了2个基于BlueStore的OSD。同时,为了便于学习,这两个OSD分别基于不同的布局,也就是一个OSD是基于3中不同的存储介质(这里是模拟的,并非真的不同介质),另外一个OSD所有内容放在一个裸设备上。

什么是BlueStore

在老版本的Ceph当中FileStore是默认的对象存储引擎,但FileStore最大的问题是写放大的问题。同时由于需要经过操作系统通用文件系统层(例如Ext4和XFS等),因此整体性能欠佳。因此,开发一种新的对象存储引擎迫在眉睫,这个就是现在大家都在使用的BlueStore对象存储引擎。BlueStore最大的特点是构建在裸磁盘设备之上,并且对诸如SSD等新的存储设备做了很多优化工作。下图来自Ceph官方,该图是BlueStore的整体架构图。

也就是说BlueStore主要目的是对性能进行优化,以提升Ceph集群整体的性能。那么BlueStore对Ceph集群到底有多大的性能提升呢?我们看看官方给出的性能测试数据。如下是3副本情况下的性能测试对比数据,从测试结果可以看出大多数场景下有了将近1倍的性能提升。

那对于纠删码场景下的性能提升情况又是怎么样的呢?看看下面的测试结果。

性能提升确实是很明显,接下来我们就要具体学习一下BlueStore的技术细节了。从图1可以看出BlueStore最大的特点是OSD可以直接管理裸磁盘设备,并且将对象数据存储在该设备当中。另外,我们知道对象有很多KV属性信息,这些信息之前是存储在文件的扩展属性或者LevelDB当中的。而在BlueStore中,这些信息存储在RocksDB当中。RocksDB本身是需要运行在文件系统之上的,因此为了使用RocksDB存储这些元数据,需要开发一个简单的文件系统(BlueFS)。 通过上面的整体架构可以看出,如果想彻底的了解BlueStore,对对象数据的分配管理和BlueFS的实现原理的理解是基础。因此,我们这里先分析上述2部分的内容。RocksDB是对元数据进行管理的子系统,因此我们先从RocksDB相关的内容讲起。

BlueFS简析

从图1可以看出BlueFS是基础,RocksDB通过中间层BlueRocksDB访问文件系统的接口。这个文件系统与传统的Linux文件系统(例如Ext4和XFS)是不同的,它不是在VFS下面的通用文件系统,而是一个用户态的逻辑。BlueFS通过函数接口(API,非POSIX)的方式为BlueRocksDB提供类似文件系统的能力。 虽然BlueFS提供的接口方式不同,但起原理与通用文件系统是类似的。为了提高BlueFS文件系统的可靠性,BlueFS被设计成日志文件系统,也就是数据在写入之前会先写上日志中,这样可以保证出现掉电等异常情况下可以通过日志恢复数据。 虽然从官方配图上(图1)来看,BlueFS是基于裸设备的,实际上并非如此。BlueFS实际上基于BlueStore的磁盘空间分配器,也就是BlueFS使用的磁盘空间需要经过分配器来分配。BlueStore目前支持2种类型的磁盘空间分配器,分别是BitMapAllocator和StupidAllocator。

如图4是BlueFS文件系统与分配器之间的关系,其中分配器(Allocator)作为BlueFS的成员,当文件系统需要磁盘空间时通过分配器的接口分配空间。整个类的内容非常丰富,本文仅仅给出它们之间的简单关系,后续会详细介绍内部的实现。 关于上文所说的BitMapAllocator和StupidAllocator分配器继承自Allocator类,三者之间的关系如图5所示。关于分配器的具体实现细节还是比较复杂的,限于篇幅问题本文暂时不做介绍。

BlueFS与传统文件系统不同另外一个地方是并没有设计单独存储fnode的存储空间,而是将其存储在WAL(Write Ahead Log)日志当中。当文件系统挂载的时候通过回放该日志实现内存数据结构的构建。这样,在内存中就可以查到磁盘中的目录和文件信息,从而可以实现对文件的读写。BlueFS本身就是一个功能阉割的,迷你文件系统。BlueFS可以这么实现得益于其只服务于RocksDB,其文件数量非常有限,使用场景也非常有限。

创建文件流程

为了更加清晰的理解BlueFS的整体架构和原理,我们通过一个具体的实例介绍该文件系统是如何运行的。由于BlueFS只服务于RocksDB,因此创建文件的流程自然也是由RocksDB触发的。因此,整个流程的分析也是从RocksDB的环境类作为入口进行介绍。在介绍具体流程之前,我们先看一下更加详细的BlueFS类的类图,这里面比较重要的是其中的dir_mapfile_map两个成员。这两个成员其实就是存储文件系统中的目录和文件的一个映射。

创建文件的操作是由RocksDB触发的,比如创建一个新的SSTable文件。具体函数调用过程如图7左侧流程所示。最终调用的是BlueFS的事务接口,用于构建一个向日志文件写数据的事务。

之后,上层会触发一个刷写数据的流程,具体如图7右侧所示,最终会将数据写到日志文件中。至此,一个新的文件就创建成功了。 今天我们非常粗略的介绍了一下BlueStore及BlueFS的整体架构和一些关键的数据结构,很多细节没有介绍,大家可能有一些迷糊。后续我们将深入细节介绍每个特性的具体实现。有任何不明白的也请大家在下面留言,本号将尽力解释清楚。

原文链接:

Ceph存储引擎BlueStore简析​www.itworld123.com

ceph存储原理_Ceph存储引擎BlueStore简析相关推荐

  1. Ceph存储引擎BlueStore简析

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

  2. ClickHouse 数据存储原理:MergeTree引擎

    文章目录 MergeTree引擎 存储结构 一级索引 稀疏索引 索引粒度index_granularity 索引的查询过程 联合主键 二级索引 跳数索引 granularity 数据标记 生成规则 工 ...

  3. Spark源码阅读03-Spark存储原理之存储分析

    Spark存储分析 整体框架 存储级别 RDD存储调用 读数据过程 本地读取 远程读取 写数据过程 写入内存 写入磁盘 整体框架 Spark的存储采取了主从模式,即Master / Slave模式,整 ...

  4. java s3 与ceph的关系_Ceph存储与S3对象存储性能优化.pdf

    Ceph存储与S3对象存储性能优化.pdf Ceph on Storage appliance Case Study and Performance for AWS S3 based object s ...

  5. ceph客户端使用_ceph存储之ceph客户端

    CEPH客户端: 大多数Ceph用户不会直接往Ceph存储集群里存储对象,他们通常会选择Ceph块设备.Ceph文件系统.Ceph对象存储之中的一个或多个: 块设备: 要实践本手册,你必须先完成存储集 ...

  6. 8.Docker容器镜像仓库存储原理(前世今身)与搬运技巧

    文章目录 0x00 镜像如何炼成 1.OCI 标准协议 image-spec - 镜像规范 runtime-spec 运行时规范 distribution-spec 镜像仓库规范 2.Dockerfi ...

  7. ceph存储引擎bluestore解析

    原文链接:http://www.sysnote.org/2016/08/19/ceph-bluestore/ ceph后端支持多种存储引擎,以插件式的方式来进行管理使用,目前支持filestore,k ...

  8. ceph存储原理_赠书 | Linux 开源存储全栈详解——从Ceph到容器存储

    // 留言点赞赠书我有书,你有故事么?留言说出你的存储故事留言点赞前两名,免费送此书截止日期12.27号12.30号公布名单 // 内容简介 本书致力于帮助读者形成有关Linux开源存储世界的细致的拓 ...

  9. ceph存储原理_【理论研究】漫谈传统IT基础设施10-存储(04)

    01-按照存储类型分类 01.独享式存储 指由单台存储设备提供服务,且相同的一块存储区域同一时间只能被单台设备访问(读写). 如DAS,块存储,SAN网络下的存储,具体产品包括磁盘阵列,硬盘. 此种存 ...

最新文章

  1. html+txt+编辑器,txtPro Text Editor
  2. 解决浏览器保存密码自动填充问题
  3. 处理数字_5_非NULL值的列的个数
  4. python输入身份证号码输出对应的出生年月日_Java从身份证号码,提取用户的出生年月日,输出用户的生日信息。...
  5. matlab误码率分析,误码率分析 请大神帮忙解释下程序
  6. Java多线程——同步容器类
  7. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_08 转换流_3_转换流的原理...
  8. yield关键字 C#
  9. 互亿无线python接口
  10. SSL证书不受信任怎么办?重点关注这4点
  11. NB-IoT:它是如何工作的?第2部分
  12. Is the docker daemon running问题解决方法
  13. IntelliJ配置jenkins服务的Crumb Data
  14. 缺省波特率57600
  15. Cadence Allegro 如何修改板框大小
  16. 温暖人心的地图 腾讯地图SDK全面支持无障碍及适老化
  17. 是否每个大学生都有一段被学校强制实习,当作廉价劳动力的经历
  18. MySql 笛卡儿积
  19. C语言typedef struct详解
  20. TCP第三次握手失败会怎么样

热门文章

  1. 继承项目第13周-项目1-基类中成员的访问限定符和派生类的继承方式
  2. ctags: 提示错误ctags: unrecognized option '--format=2'
  3. 截取指定网站Html编码
  4. HDU 1245 Saving James Bond
  5. 超越RMI,高效Java remote调用
  6. 朝聚眼科完成4亿元B轮融资,兰馨亚洲和阳光融汇投资...
  7. 乐视电视明明可以降低配置,为什么偏偏要涨价?
  8. 姜宁谈红帽绩效考核:不关心员工具体做什么
  9. linux c下输入密码不回显
  10. java thread join_java中thread的join方法为什么能让线程插队