Ceph源码解析:读写流程(6)

Striper::file_to_extents(cct, ino, layout, offset, len, truncate_size, extents);//将要读取数据的长度和偏移转化为要访问的对象,extents沿用了brtfs文件系统的概念
objecter->sg_read_trunc(extents, snap, bl, flags, truncate_size, truncate_seq, onfinish, op_flags);//向osd发起请求

对于读操作而言:

1.客户端直接计算出存储数据所属于的主osd,直接给主osd上发送消息。

2.主osd收到消息后,可以调用Filestore直接读取处在底层文件系统中的主pg里面的内容然后返回给客户端。具体调用函数在ReplicatedPG::do_osd_ops中实现。

CEPH_OSD_OP_MAPEXT||CEPH_OSD_OP_SPARSE_READ

r = osd->store->fiemap(coll, soid, op.extent.offset, op.extent.length, bl);

CEPH_OSD_OP_READ

r = pgbackend->objects_read_sync(soid, miter->first, miter->second, &tmpbl);

五、Ceph写流程

OSD端写操作处理流程

image

而对于写操作而言,由于要保证数据写入的同步性就会复杂很多:

1.首先客户端会将数据发送给主osd,

2.主osd同样要先进行写操作预处理,完成后它要发送写消息给其他的从osd,让他们对副本pg进行更改,

3.从osd通过FileJournal完成写操作到Journal中后发送消息告诉主osd说完成,进入5

4.当主osd收到所有的从osd完成写操作的消息后,会通过FileJournal完成自身的写操作到Journal中。完成后会通知客户端,已经完成了写操作。

5.主osd,从osd的线程开始工作调用Filestore将Journal中的数据写入到底层文件系统中。

写的逻辑流程图如图:

Ceph源码解析:读写流程

从图中我们可以看到写操作分为以下几步:
1.OSD::op_tp线程从OSD::op_wq中拿出来操作如本文开始的图上描述,具体代码流是

Ceph源码解析:读写流程

ReplicatePG::apply_repop中创建回调类C_OSD_OpCommit和C_OSD_OpApplied

FileStore::queue_transactions中创建了回调类C_JournaledAhead

2.FileJournal::write_thread线程从FileJournal::writeq中拿出来操作,主要就是写数据到具体的journal中,具体代码流:

Ceph源码解析:读写流程

3.Journal::Finisher.finisher_thread线程从Journal::Finisher.finish_queue中拿出来操作,通过调用C_JournalAhead留下的回调函数FileStore:_journaled_ahead,该线程开始工作两件事:首先入底层FileStore::op_wq通知开始写,再入FileStore::ondisk_finisher.finisher_queue通知可以返回。具体代码流:

Ceph源码解析:读写流程

4.FileStore::ondisk_finisher.finisher_thread线程从FileStore::ondisk_finisher.finisher_queue中拿出来操作,通过调用C_OSD_OpCommit留下来的回调函数ReplicatePG::op_commit,通知客户端写操作成功

Ceph源码解析:读写流程

5.FileStore::op_tp线程池从FileStore::op_wq中拿出操作(此处的OP_WQ继承了父类ThreadPool::WorkQueue重写了_process和_process_finish等函数,所以不同于OSD::op_wq,它有自己的工作流程),首先调用FileStore::_do_op,完成后调用FileStore::_finish_op。

Ceph源码解析:读写流程

6. FileStore::op_finisher.finisher_thread线程从FileStore::op_finisher.finisher_queue中拿出来操作,通过调用C_OSD_OpApplied留下来的回调函数ReplicatePG::op_applied,通知数据可读。

Ceph源码解析:读写流程

此文主要整理了ceph客户端读写流程,OSD端读写流程等。

CentOS 7.1 上安装分布式存储系统 Ceph 

Ceph环境配置文档 PDF  

CentOS7下部署Ceph集群(版本10.2.2)

Ceph的安装过程  

如何升级Ceph版本及注意事项 

HOWTO Install Ceph On FC12, FC上安装Ceph分布式文件系统  

实验环境Ceph 9.2.1部署笔记

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/bccb0f79f96239680a8dd2c94f779512.html