解析 Ceph: FileJournal 的作用
很多的用户在提到 Ceph 性能的时候都会提到“写放大”这点,实际上就是 FileJournal 在起作用。只要使用默认的 FileStore,所有数据包括 metadata 都会在 FileJournal 上预写一份。那么本文就会介绍 FileJournal 在 FileStore 存储引擎上提供的作用。
作用

FileJournal 就是数据库中常见的 WAL(Write Ahead Log) 实现,主要提供了事务的一致性和原子性。Ceph 数据访问所提供的写操作在落到 ObjectStore 时实际上会产生多个写操作,为了保证用户层面的写操作的原子性,避免 FileStore 在执行多个操作时发生意外造成中间状态而无法追溯或者回滚,我们需要引入 Journal 来作为日志。使得 OSD 进程在非正常退出后再启动可以从 Journal 中恢复之前正在执行的操作。
除此之外,FileJournal 提供了更短的写操作耗时,因为用户 IO 操作到达 FileStore 以后,只要经过 FileJournal 存储后都可以立即回复给用户,无需等待操作正常落盘。对于大量随机小写来说,这实际上能大大提高单个 OSD 的处理能力。
工作流程
如上图所示,所有 PG 层提交事务都会在 FileStore 经过一层 Throttle 直接进入 FileJournal 队列。然后有后面的不同类型线程都是单一线程,以 Pipeline 的形式最大化 FileJournal 的吞吐量。IO 从 Journal Queue 被提取后由 Write Thread 进行处理,图上只标出了 AIO,实际上如果 OS 不支持 AIO+DIO 的方式,那么就会采用 write+flush 的组合。在这里,Write Thread 会尽可能获取多的队列事务进行批量提交,每个事务都会以页对齐的方式补零后者重新编排,最后提交 IO。Write Finish Thread 实际上只在 AIO+DIO 中存在,主要是为了收割正在进行的 IO,收购后提交给 Finisher Thread。
可能的改进
日志的实现实际上并不是一个简单的话题,它的逻辑非常简单但在 IO 程序中起到非常重要的作用,也是用户写操作最重要的延时消耗者。因此如何最大化日志来提高 IO 吞吐量和延迟的讨论早存在于学术和工业届。Pipeline、减小临界区和批量提交是主要的手段,FileJournal 采用多个线程协同的方式而不是多个独立工作线程单独工作的形式,两者各有优劣。目前 FileJournal 在设计上没有太大的问题,在实现上需要更加 SMART,解决不同大小 IO size 的相互影响。除此之外,非常大或者对象存储的工作场景下,跳过 FileJournal 直接落盘是用户期待的方式,但是目前 FileJournal 与 FileStore 耦合严重,因此社区会重起一个新的 Backend 来解决这些问题。
解析 Ceph: FileJournal 的作用的更多相关文章
- 解析CEPH: 存储引擎实现之一 filestore
Ceph作为一个高可用和强一致性的软件定义存储实现,去使用它非常重要的就是了解其内部的IO路径和存储实现.这篇文章主要介绍在IO路径中最底层的ObjectStore的实现之一FileStore. Ob ...
- 解析Ceph: RBDCache 背后的世界
转自:https://www.ustack.com/blog/ceph-internal-rbdcache/ RBDCache 是Ceph的块存储接口实现库 Librbd 的用来在客户端侧缓存数据的目 ...
- 解析Ceph: 恢复与数据一致性
转自:https://www.ustack.com/blog/ceph-internal-recovery-and-consistency/ 作为一个面向大规模的分布式存储系统,故障处理是作为一个常态 ...
- 解析Ceph: Snapshot
经常有开发者在邮件列表中会问到Ceph Snapshot的实现方式,受限于目前有限的实现文档和复杂的代码结构和代码量,弄清楚Ceph Snapshot并不是一件容易的事.正好最近在重构Ceph存储引擎 ...
- 解析Object.defineProperty的作用
对象是由多个名/值对组成的无序的集合.对象中每个属性对应任意类型的值. 定义对象可以使用构造函数或字面量的形式: 除了以上添加属性的方式,还可以使用Object.defineProperty定义新属性 ...
- 解析Ceph: 数据的端到端正确性和 Scrub 机制
转自:https://www.ustack.com/blog/ceph-internal-scrub/ Ceph 的主要一大特点是强一致性,这里主要指端到端的一致性.众所周知,传统存储路径上从应用层到 ...
- Ceph源码解析:读写流程
转载注明出处,整理也是需要功夫的,http://www.cnblogs.com/chenxianpao/p/5572859.html 一.OSD模块简介 1.1 消息封装:在OSD上发送和接收信息. ...
- ceph 初始化函数解析
global_pre_init 预初始化函数,解析ceph.conf配置文件, 初始化定义global_context 和 config的全局变量. 全局预初始化函数 CINIT_FLAG_UNPRI ...
- springmvc中的页面解析器ViewResolver不起作用,变量输出字符串的解决方案
<web-app xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"> <servlet> <servlet ...
随机推荐
- async eachSeries如何按序列执行下去
async callback要执行完才会进到一下个序列 async.mapSeries(files, function(file, outerCB) { var all = fs.readdirsyn ...
- ranch分析学习(三)
接着上一篇继续研究 上一篇结尾的时候,我们谈到了连接,监听两个监督树,今天我们就来看看这两个监督树和他们的工作者都是干什么的,怎么实现的.文件编号接上篇. 6. ranch_acceptors_sup ...
- HDU1520 Anniversary party 树形DP基础
There is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The Un ...
- tensorflow图像基本处理
tensorflow库提供的专门的图片处理库,以下只是部分示例,更多函数请参照源码'\tensorflow_api\v1\image__init__.py' 加载图像 方式1: 使用tf.gfile. ...
- cordova学习-基础篇
Cordova 学习笔记(一):快速开始 1.安装cordova Cordova安装可以通过node.js从npm上获取.npm install -g cordova 通过这个命令可以安装cordov ...
- Python学习-赋值、浅copy和深copy
Python Copy: 在Python语言中,分为浅拷贝和深拷贝两种形式,也就是官方文档中的Shadow copy和Deep copy.在对简单的对象(object)进行复制时,两者没有区别,如下面 ...
- css 常用类名
1.页面结构 容器: container 页头:header 内容:content/container 页面主体:main 页尾:footer 导航:nav 侧栏:sidebar 栏目:column ...
- bower.json 的版本范围
bower.json 的版本范围 有小伙伴问 ~2.2.0 什么意思. 而且在git 的tags 中没有了 2.2.0 版本,怎么样? 实际上 ~2.2.0 的意思是 >=2.2.0 <2 ...
- 笔记:FastAdmin 之 jQuery 选择器 $("[name$='[]']", form) 学习
笔记:FastAdmin 之 jQuery 选择器 $("[name$='[]']", form) 学习 $("[name$='[]']", form)这个是什 ...
- 【转】关于gcc、glibc和binutils模块之间的关系
原文网址:http://www.mike.org.cn/articles/linux-about-gcc-glibc-and-binutils-the-relationship-between-mod ...