一、概述

  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. canvas语法糖

  2. listview下拉刷新 上拉(滑动分页)加载更多

    最 近做的类似于微博的项目中,有个Android功能要使用到listview的向下拉刷新来刷新最新消息,向上拉刷新(滑动分页)来加载更多.新浪微博就是使用这种方式的典型.当用户从网络上读取微博的时候, ...

  3. logback debug 日志没有信息

    可能是项目绑定的日志不是logback的jar包,而是其他包,具体可查看tomcat启动日志 log4j:WARN No appenders could be found for logger (or ...

  4. (转)C#中Invoke的用法 一

    在用.NET Framework框架的WinForm构建GUI程序界面时,如果要在控件的事件响应函数中改变控件的状态,例如:某个按钮上的文本原先叫“打开”,单击之后按钮上的文本显示“关闭”,初学者往往 ...

  5. mysql系统变量

    http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html Table 5.2 System Variable Summar ...

  6. 使用 axios 详解

    Vue.js 1.0 我们常使用 vue-resource (官方ajax库), Vue 2.0 发布后作者宣告不再对 vue-resource 进行更新, 推荐我们使用 axios (基于 Prom ...

  7. The cast to value type 'System.Decimal' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.

    CurrentStock = db.BillEntry.Where(b => b.GoodsId == item.GoodsId).Sum(b => (decimal?)b.Qty) ?? ...

  8. 通过 Apache Commons HttpClient 发送 HTTPS 请求

    1.通过 HTTPS 发送 POST 请求: 2.HTTPS 安全协议采用 TLSv1.2: 3. 使用代理(Proxy)进行 HTTPS 访问: 4.指定 Content-Type 为:applic ...

  9. mysql改变字符串的大小写

    INITCAP:转换每个字的第一个字符为大写LOWER:转换所有字符为小写UPPER:转换所有字符为人写 eg: LOWER(phone)

  10. txt文件匹配脚本

    # -*- coding:utf-8 -*- import time start = time.clock() data=open("Data.txt","r" ...