Ceph BlueFS
一、概述
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的更多相关文章
- BlueStore-先进的用户态文件系统《二》-BlueFS
https://zhuanlan.zhihu.com/p/46362124 简介 上一篇文章中,介绍了BlueStore的诞生背景.逻辑架构以及设计思想,提到了在BlueStore中元数据都是存放在R ...
- ceph存储引擎bluestore解析
原文链接:http://www.sysnote.org/2016/08/19/ceph-bluestore/ ceph后端支持多种存储引擎,以插件式的方式来进行管理使用,目前支持filestore,k ...
- ceph mimic版本 部署安装
ceph 寻址过程 1. file --- object映射, 把file分割成N个相同的对象 2. object - PG 映射, 利用静态hash得到objectID的伪随机值,在 "位 ...
- Ceph的BlueStore总体介绍
整体架构 bluestore的诞生是为了解决filestore自身维护一套journal并同时还需要基于系统文件系统的写放大问题,并且filestore本身没有对SSD进行优化,因此bluestore ...
- ceph存储 ceph Bluestore的架构
ceph 目前是开源社区比较流行的分布式块存储系统,其以良好的架构,稳定性和完善的数据服务功能,获得的了广泛的部署和应用. 目前ceph 最大的问题是其性能相对较差,特别是无法发挥SSD等高速设备的硬 ...
- 分布式存储ceph集群实践
1.环境规划,三台主机 10.213.14.51/24 10.213.14.52/24 10.213.14.53/24 集群网络 172.140.140.11. ...
- [ ceph ] BlueStore 存储引擎介绍
为什么需要 BlueStore 首先,Ceph原本的FileStore需要兼容Linux下的各种文件系统,如EXT4.BtrFS.XFS.理论上每种文件系统都实现了POSIX协议,但事实上,每个文件系 ...
- 手动部署 Ceph Mimic 三节点
目录 文章目录 目录 前文列表 部署拓扑 存储设备拓扑 网络拓扑 基础系统环境 安装 ceph-deploy 半自动化部署工具 部署 MON 部署 Manager 部署 OSD 部署 MDS 部署 R ...
- 开源实践分享:Ceph bluestore部署实践
https://blog.51cto.com/99cloud/2119884 Ceph bluestore部署 首先为大家分享Ceph bluestore具体该如何部署,使用环境如下• 单节点• Ce ...
随机推荐
- sql-获取指定年份指定月份的天数
declare @年月 varchar(6) set @年月= '201803' --查询2015年2月有多少天 select day(dateadd(month,1,@年月+ '01 ')-1)
- Java-JUC(十一):线程8锁
题目: 判断以下8种情况,输出的内容 题目一:一个Number实例对象number,两个非静态同步方法getOne,getTwo,两个线程打印输出(一个线程调用number.getOne,另外一个线程 ...
- 如何用Client OM获取页面上一个Content web part的内容
[解决方法] According to Wictor Wilén, The Client Object Model is fairly limited when it comes to working ...
- POI中setDefaultColumnWidth方法不起作用的原因
sheet.setDefaultRowHeight((short) (2 * 256)); //设置默认行高,表示2个字符的高度 sheet.setDefaultColumnWidth(17); ...
- phpmyadmin误删表后如何恢复
用mysqlbinlog php处理代码: 将mysql-bin.xxxxxx文件导出为可读文本: <?php //导出mysql-bin.000xxx文件为可读性txt文本 //0为执行成功, ...
- OSX系统的sublime配置php执行编译
OSX系统的sublime配置php执行编译 1).进入如下菜单 2)弹出内容如下: { "cmd": ["make"] } 修改为: { "cmd& ...
- Linux开机自动启动某一程序
Linux开机启动程序详解我们假设大家已经熟悉其它操作系统的引导过程,了解硬件的自检引导步骤,就只从Linux操作系统的引导加载程序(对个人电脑而言通常是LILO)开始,介绍Linux开机引导的步骤. ...
- PSQL命令小结
经常使用psql查询数据,现在总结几个常用的命令参数,供以后参考 -h 数据库地址 -U 数据库用户名 -t 不打印字段等信息 -c 执行的SQL语句 -s 单步执行,就是执行的时 ...
- 安装了XAMPP,PHP怎么显示中文
1.输出前加文件头.header("Content-type: text/html; charset=utf-8"); 另外注意你的文件编码要和 charset一致. 2. 可能是 ...
- webapck 速度优化策略
一.概述 1.使用高版本Webpack 2.多进程/多实例构建 3.分包 4.缓存 5.缩小构建目标 二.多进程/多实例构建 (1)happypack happypack:https://www.np ...