ceph存储原理_Ceph存储引擎BlueStore简析
前文我们创建了一个单节点的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_map
和file_map
两个成员。这两个成员其实就是存储文件系统中的目录和文件的一个映射。
创建文件的操作是由RocksDB触发的,比如创建一个新的SSTable文件。具体函数调用过程如图7左侧流程所示。最终调用的是BlueFS的事务接口,用于构建一个向日志文件写数据的事务。
之后,上层会触发一个刷写数据的流程,具体如图7右侧所示,最终会将数据写到日志文件中。至此,一个新的文件就创建成功了。 今天我们非常粗略的介绍了一下BlueStore及BlueFS的整体架构和一些关键的数据结构,很多细节没有介绍,大家可能有一些迷糊。后续我们将深入细节介绍每个特性的具体实现。有任何不明白的也请大家在下面留言,本号将尽力解释清楚。
原文链接:
Ceph存储引擎BlueStore简析www.itworld123.com
ceph存储原理_Ceph存储引擎BlueStore简析相关推荐
- Ceph存储引擎BlueStore简析
前文我们创建了一个单节点的Ceph集群,并且创建了2个基于BlueStore的OSD.同时,为了便于学习,这两个OSD分别基于不同的布局,也就是一个OSD是基于3中不同的存储介质(这里是模拟的,并非真 ...
- ClickHouse 数据存储原理:MergeTree引擎
文章目录 MergeTree引擎 存储结构 一级索引 稀疏索引 索引粒度index_granularity 索引的查询过程 联合主键 二级索引 跳数索引 granularity 数据标记 生成规则 工 ...
- Spark源码阅读03-Spark存储原理之存储分析
Spark存储分析 整体框架 存储级别 RDD存储调用 读数据过程 本地读取 远程读取 写数据过程 写入内存 写入磁盘 整体框架 Spark的存储采取了主从模式,即Master / Slave模式,整 ...
- java s3 与ceph的关系_Ceph存储与S3对象存储性能优化.pdf
Ceph存储与S3对象存储性能优化.pdf Ceph on Storage appliance Case Study and Performance for AWS S3 based object s ...
- ceph客户端使用_ceph存储之ceph客户端
CEPH客户端: 大多数Ceph用户不会直接往Ceph存储集群里存储对象,他们通常会选择Ceph块设备.Ceph文件系统.Ceph对象存储之中的一个或多个: 块设备: 要实践本手册,你必须先完成存储集 ...
- 8.Docker容器镜像仓库存储原理(前世今身)与搬运技巧
文章目录 0x00 镜像如何炼成 1.OCI 标准协议 image-spec - 镜像规范 runtime-spec 运行时规范 distribution-spec 镜像仓库规范 2.Dockerfi ...
- ceph存储引擎bluestore解析
原文链接:http://www.sysnote.org/2016/08/19/ceph-bluestore/ ceph后端支持多种存储引擎,以插件式的方式来进行管理使用,目前支持filestore,k ...
- ceph存储原理_赠书 | Linux 开源存储全栈详解——从Ceph到容器存储
// 留言点赞赠书我有书,你有故事么?留言说出你的存储故事留言点赞前两名,免费送此书截止日期12.27号12.30号公布名单 // 内容简介 本书致力于帮助读者形成有关Linux开源存储世界的细致的拓 ...
- ceph存储原理_【理论研究】漫谈传统IT基础设施10-存储(04)
01-按照存储类型分类 01.独享式存储 指由单台存储设备提供服务,且相同的一块存储区域同一时间只能被单台设备访问(读写). 如DAS,块存储,SAN网络下的存储,具体产品包括磁盘阵列,硬盘. 此种存 ...
最新文章
- html+txt+编辑器,txtPro Text Editor
- 解决浏览器保存密码自动填充问题
- 处理数字_5_非NULL值的列的个数
- python输入身份证号码输出对应的出生年月日_Java从身份证号码,提取用户的出生年月日,输出用户的生日信息。...
- matlab误码率分析,误码率分析 请大神帮忙解释下程序
- Java多线程——同步容器类
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_08 转换流_3_转换流的原理...
- yield关键字 C#
- 互亿无线python接口
- SSL证书不受信任怎么办?重点关注这4点
- NB-IoT:它是如何工作的?第2部分
- Is the docker daemon running问题解决方法
- IntelliJ配置jenkins服务的Crumb Data
- 缺省波特率57600
- Cadence Allegro 如何修改板框大小
- 温暖人心的地图 腾讯地图SDK全面支持无障碍及适老化
- 是否每个大学生都有一段被学校强制实习,当作廉价劳动力的经历
- MySql 笛卡儿积
- C语言typedef struct详解
- TCP第三次握手失败会怎么样
热门文章
- 继承项目第13周-项目1-基类中成员的访问限定符和派生类的继承方式
- ctags: 提示错误ctags: unrecognized option '--format=2'
- 截取指定网站Html编码
- HDU 1245 Saving James Bond
- 超越RMI,高效Java remote调用
- 朝聚眼科完成4亿元B轮融资,兰馨亚洲和阳光融汇投资...
- 乐视电视明明可以降低配置,为什么偏偏要涨价?
- 姜宁谈红帽绩效考核:不关心员工具体做什么
- linux c下输入密码不回显
- java thread join_java中thread的join方法为什么能让线程插队