一、概述

  BlueFS是个小型文件系统,小体现在功能简单,没有实现Posix接口,不支持对文件的覆盖写操作只支持追加写,没有本地文件系统的树形层次结构,只有扁平的目录到文件的映射关系。和BlueStore一样,BlueFS也依赖底层BlockDevice模块,使用它来管理磁盘空间的分配释放,将IO通过Libaio写到裸盘。和BlueStore不一样的是元数据的管理,BlueStore将元数据全权交给RocksDB,BlueFS存在的目的就是为了支持RocksDB,因此不能反过来依赖RocksDB,只能靠自己来解决元数据管理问题。

  元数据主要包括3类,第一类是文件系统自身的元数据,例如Block大小、UUID、OSDUUID、版本号等,这部分数据通常保存在超级块(Superblock)中,BlueFS也是这么做的。第二类是目录文件的inode数据以及文件目录间的层次关系,这部分内容通常以一定的结构持久化在磁盘,读取文件时根据路径(例如,/etc/ceph/ceph.conf)从根目录开始一层一层查找到目标文件的inode数据在磁盘中的位置。BlueFS并没有这么做,而是将对文件的所有操作都记录到日志文件,挂载文件系统时Replay日志,以此来得到这部分元数据。也就是说,所有的元数据都会加载到内存。第三类是用于描述磁盘哪些地方空闲哪些地方被占用的磁盘元数据。BlueFS的文件元数据包含该文件对应的磁盘空间,通过Replay日志获得所有文件的元数据后,就获得了整块磁盘的使用情况。

日志文件

BlueFS的一个重要概念是日志文件,所有操作都记录到日志文件,挂载文件系统时先Replay日志,日志文件有两个作用:首先,保证数据和元数据的一致性。普通文件的元数据保存在日志文件,通过Replay日志获取普通文件的元数据。BlueFS只支持对文件的追加操作,不支持覆盖写操作,从而就没有WAL操作的必要了。追加操作先将数据写到磁盘,然后再更新元数据,即将日志文件落盘。如果在追加数据时掉电,元数据没有更新,那么旧的元数据所描述的数据仍旧是正确的,不会出现数据和元数据不一致的问题。其次,通过Replay所有日志来获取文件目录的层级结构。BlueFS没有像Ext2文件系统那样在磁盘中持久化inode数据结构,只是在普通文件被修改时将对应的元数据作为日志项记录到日志文件。另外,文件的元数据保存了,为文件分配的磁盘空间的信息。Allocator根据这部分信息来确定磁盘中哪些空间已分配哪些空间空闲,从而构建一文提到的树形结构。因此,如果追加数据过程中主机掉电,来不及更新元数据,那么新分配的磁盘空间将被自动回收。

如何加载日志文件?
要加载日志文件,要先知道日志文件对应的磁盘空间,这部分信息记录在日志文件的元数据,而日志文件的元数据存储在Superblock超级块。Superblock是一个地址被硬编码的磁盘空间,起始位置为4K,长度为4k,挂载文件系统时首先加载这块固定区域的内容。从这块区域中读取磁盘Block大小、版本号、UUID、OSDUUID以及日志文件的元数据。日志文件的元数据内部包括:

  • 存储日志文件内容的磁盘,BlueFS同时支持3块不同的磁盘
  • 日志文件内容所在磁盘空间的位置信息
  • 文件修改时间、大小以及inode索引号,每个文件的索引号是唯一的,便于在内存中管理文件结构

根据日志元数据的前两项内容,就能够知道从哪块磁盘的什么位置读取日志文件了,然后调用Libaio接口去读取文件即可。

Compact日志。
Inode索引号0和1,由BlueFS内部使用,并且都用于日志文件。正常情况下,日志文件只使用索引号1,只有在Compact日志时才使用临时的索引号0。日志文件只支持Append操作,时间长了,日志文件会占用较大的磁盘空间,并且Replay日志时间也会变久。实际上,日志文件中有用的数据只有,目录文件的元数据以及目录和文件的对应关系。Compact日志的目是,提取这部分有用数据写入到新磁盘空间,并丢掉原来的日志数据,减少日志文件大小,释放磁盘空间。

Compact日志时先使用索引号0的新日志文件将有用数据写入到磁盘的新位置,然后用新日志文件的元数据更新超级块(除索引号外),将超级块Flush到磁盘。从目前实现来看,修改超级块是个危险系数很高的操作,一方面是因为超级块的重要程度,如果超级块数据出错所有文件将都无法使用,另一方面似乎没有对超级块做数据保护,只提供CRC检验。不过,正常情况下极少修改超级块的数据,写磁盘时也会绕过本地缓存。

转载于:https://www.cnblogs.com/chris-cp/p/8067439.html

Ceph BlueFS相关推荐

  1. Ceph BlueStore 和双写问题

    论开源分布式存储,Ceph大名鼎鼎.用同一个存储池融合提供块存储.对象存储.集群文件系统.在国内有近年使用量迅速攀升,Ceph Day峰会也搬到北京来开了. 大型公司内部研发云虚拟化平台,常使用开源方 ...

  2. ceph bluestore 源码分析:ceph-osd内存查看方式及控制源码分析

    文章目录 内存查看 内存控制 内存控制源码分析 通过gperftools接口获取osd进程实际内存 动态设置cache大小 动态调整cache比例 trim释放内存 本文通过对ceph-osd内存查看 ...

  3. CEPH核心理论 相关导图(持续更新)

    围绕分布式存储(ceph)绘制的技能图谱可参考分布式存储ceph 技能图谱 相关的原始编辑文件可以从github-mindMapping下载 如有缺失.不足之处欢迎指正 CEPH架构 关于系统架构,这 ...

  4. ceph存储引擎bluestore解析

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

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

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

  6. ceph 代码分析 读_Ceph OSD磁盘异常流量问题分析

    [toc] 前言 Ceph作为开源存储中的明星产品,得到了广泛应用.当前,Ceph在网易也得到了广泛使用,网易云轻舟容器云平台以及OpenStack云平台底层存储分别使用了CephFS以及RBD,这两 ...

  7. ceph1--ceph基础/搭建ceph高可用集群

    一.ceph基础 0.存储分类 单机存储 SCSI/IDE/SATA//SAS/USB/PCI-E/SSD/M.2NVME协议(提升性能) https://item.jd.com/4962067795 ...

  8. Ceph学习笔记1-Mimic版本多节点部署

    特别说明: 本方法也可以用于单节点部署,只部署一个 Monitor (只是会形成单点故障而已),最低要求是使用两个分区创建 2 个 OSD (因为默认最小副本是 2 ):如果不需要使用 CephFS ...

  9. Openstack集群-Ceph集群作为存储的部署

    1.安装Ceph集群 1.1 设置ceph的yum源 ceph版本:12.2.5 ceph-deploy版本: 2.0.0 注:此处用控制节点部署mod和mgr ,OSD部署在计算节点上 [root@ ...

最新文章

  1. 残缺的完美 送给飘
  2. 英文论文-word summary
  3. 一起来开发Android的天气软件(二)——使用LitePal搭建数据库
  4. EIGRP的AD(管理距离)、AD(宣告距离)、FD(可行距离)
  5. MIL for PRE
  6. SQL Server配置delegation实现double-hop
  7. 牛赞:音视频前端跨平台技术应用
  8. php实例之简单的留言板,PHP实例一之简单的留言板
  9. php -- 魔术方法 之 自动加载:__autoload()
  10. 一个简单的Windows
  11. ie降级,解决ie卡死,打不开,弹出页空白等问题
  12. WPF UI框架界面开发教程(一)
  13. Openg~lopengl中文手册4.5
  14. 计算机专业期刊参考文献,优秀计算机期刊文章参考文献 优秀计算机专著类参考文献有哪些-免费论文范文...
  15. dac芯片(国产dac芯片)
  16. 一篇文章解决所有的 #如何下载安装xshell链接VMware虚拟机liunx系统(如SentOS,ubuntu等等)# 等问题
  17. 【UEFI基础】EFI_HANDLE
  18. 【课程】04 土壤水动力学
  19. Windows10中好用的软件推荐
  20. LDAP搜索中的CN,OU,DC是什么?

热门文章

  1. 三层架构和MVC模式
  2. 程序员面试题精选100题(54)-C++/C#面试题(3)
  3. 草图检索和识别[开源]
  4. Hadoop之WordCount源代码
  5. 《大话数据结构》第9章 排序 9.3 冒泡排序(上)
  6. python with关键字学习
  7. 突然发现缓存这么好用
  8. Android基础(八) – Service AIDL
  9. 为什么要用GCD-Swift2.x
  10. requests基础3