一、概述

  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检验。不过,正常情况下极少修改超级块的数据,写磁盘时也会绕过本地缓存。

Ceph BlueFS的更多相关文章

  1. BlueStore-先进的用户态文件系统《二》-BlueFS

    https://zhuanlan.zhihu.com/p/46362124 简介 上一篇文章中,介绍了BlueStore的诞生背景.逻辑架构以及设计思想,提到了在BlueStore中元数据都是存放在R ...

  2. ceph存储引擎bluestore解析

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

  3. ceph mimic版本 部署安装

    ceph 寻址过程 1. file --- object映射, 把file分割成N个相同的对象 2. object - PG 映射, 利用静态hash得到objectID的伪随机值,在 "位 ...

  4. Ceph的BlueStore总体介绍

    整体架构 bluestore的诞生是为了解决filestore自身维护一套journal并同时还需要基于系统文件系统的写放大问题,并且filestore本身没有对SSD进行优化,因此bluestore ...

  5. ceph存储 ceph Bluestore的架构

    ceph 目前是开源社区比较流行的分布式块存储系统,其以良好的架构,稳定性和完善的数据服务功能,获得的了广泛的部署和应用. 目前ceph 最大的问题是其性能相对较差,特别是无法发挥SSD等高速设备的硬 ...

  6. 分布式存储ceph集群实践

    1.环境规划,三台主机 10.213.14.51/24            10.213.14.52/24       10.213.14.53/24    集群网络 172.140.140.11. ...

  7. [ ceph ] BlueStore 存储引擎介绍

    为什么需要 BlueStore 首先,Ceph原本的FileStore需要兼容Linux下的各种文件系统,如EXT4.BtrFS.XFS.理论上每种文件系统都实现了POSIX协议,但事实上,每个文件系 ...

  8. 手动部署 Ceph Mimic 三节点

    目录 文章目录 目录 前文列表 部署拓扑 存储设备拓扑 网络拓扑 基础系统环境 安装 ceph-deploy 半自动化部署工具 部署 MON 部署 Manager 部署 OSD 部署 MDS 部署 R ...

  9. 开源实践分享:Ceph bluestore部署实践

    https://blog.51cto.com/99cloud/2119884 Ceph bluestore部署 首先为大家分享Ceph bluestore具体该如何部署,使用环境如下• 单节点• Ce ...

随机推荐

  1. OpenGL ES 3.0之Texturing纹理详解(二)

    Texture Filtering and Mipmapping 纹理过滤与多级纹理 前面我们已经讲了单个2D图像的2D纹理的介绍,这篇文章主要讲解多级纹理.纹理坐标是用于生成一个2D索引,当放大和缩 ...

  2. 【视频教学】如何利用高德地图IOS SDK进行开发?

    Step1:使用IOS SDK可以做什么高德地图 iOS SDK 是一套基于 iOS 5.1.1 及以上版本的地图应用程序开发接口.通过该接口,用户可使用高德地图数据和服务轻松构建功能丰富.交互性强的 ...

  3. file: /SourceCache/IOKitUser_Sim/IOKitUser-920.1.11/hid.subproj/IOHIDEventQueue.c, line: 512

    //修改main.m 文件. typedef int (*PYStdWriter)(void *, const char *, int); static PYStdWriter _oldStdWrit ...

  4. Vue.js 2.0 独立构建和运行时构建的区别

    Vue.js 2.0 独立构建和运行时构建的区别 在使用 Vue.js 2.0 时,有独立构建(standalone)和运行时构建(runtime-only)两种版本可供选择.而在 Vue.js 1. ...

  5. Android 手把手带你玩转自己定义相机

    本文已授权微信公众号<鸿洋>原创首发,转载请务必注明出处. 概述 相机差点儿是每一个APP都要用到的功能,万一老板让你定制相机方不方?反正我是有点方. 关于相机的两天奋斗总结免费送给你. ...

  6. java 反汇编class文件

      Created by Marydon on 1.情景展示 如何使用Java命令将字节码文件(class文件)反汇编? 2.解决方案 反汇编:将java文件编译后的class文件反汇编进而看到jav ...

  7. kettle 如何将excel文件导入oracle数据库?

      1.情景展示 昨日,有一批数据需要导入数据库,但是,plsql不知为何不能导了,于是,我选择使用kettle完成excel数据的导入. 2.准备工作 将对应的数据库所需的jar包拷贝至其lib目录 ...

  8. python 什么叫迭代

    # -*- coding: cp936 -*- #xiaodeng #python 27 #什么叫迭代 #如果给定一个list/tuple,可以通过for循环遍历出来,这种遍历我们称之为迭代 #案例3 ...

  9. Java中的Random()函数 【转载】

        今天在做Java练习的时候注意到了Java里面的一个随机函数——Random,刚开始只是知道这个函数具有随机取值的作用,于是上网搜索了资料一番,做了一下一些关于Random函数的总结:   J ...

  10. Spring Cloud开发实践 - 04 - Docker部署

    Docker的安装和命令可以参考 https://www.cnblogs.com/milton/p/9866963.html . 资源规划 这一步要区分传统资源和Docker资源, 为后面的细节定好基 ...