Ceph OS模块介绍及读写流程分析

来源:互联网 发布:cnc数控编程入门 编辑:程序博客网 时间:2024/06/06 03:36

Cephos模块,也就是ObjectStore模式,是Ceph对象存储的底层的存储机制。它是单机版的存储。基本功能如下:

1) 提供底层对象的随机读写

2) 保证读写数据的一致性

其功能主要包括以下几个模块:

FileStore

 

 

ObjectStore是对象存储的接口,主要包括对象读写,对象属性的getset操作。JournalingObjectStore 继承了ObjectStore,提供了日志提交管理相关的接口。FileStore实现了一个基于文件系统 的对象存储。FilestoreBackend提供了不同文件系统的实现的一个公共的接口。

Journl定义了日志的接口,FileJournal实现了基于文件系统的日志实现。

Omap

 

 

Omap 也就是objectMap,其用来存储对象的属性kv值的。 Omap可以保持在文件系统的扩展属性中,也可以保存在单独的kv存储系统中。如上图所示,是保存在keyvalue存储中。

ObjectMap类是一个对象的omap的接口。GenericObjectMap是所有对象保存omap的接口,可以遍历访问所有Objectomap值。GenericObjectMap也是一个抽象类,其用了KeyValueDB的接口。

KeyValueDB是所有外部kv存储系统的抽象接口,其实现目前有三种kv存储系统,KineticLevelDBRocksDB三种。默认采用LevelDB,都是开源的系统,可以自己网上搜索相关的资料。

CollectionIndex

 

 

CollectionIndex是对象在文件系统的组织方式。一个对象,在文件系统就对应一个文件,当有很多文件时,如何组织这些文件,比如几层目录,每层目录多少个文件,如何检索,这些组织不好都会影响性能。

读写流程分析

根据日志的不同,FileStore有三种写的方式:

1)Writeahead方式:一般XFS都采用这种日志,在这种情况下,数据先写入日志,并等待日志同步到日志磁盘上,然后再写到对象对应的日志文件中。

2)Parallel方式:BtrfsZFS采用这种方式,日志和数据是同时(并行)写入。由于BTRFSZFS支持checkpoint操作,如果数据在写入过程中出错,可以rollback,保证数据的一致性。

3)无日志的方式,在这种情况下,数据之间写入并同步的磁盘中。这种模式下只支持append模式的写入。不支持随机写。

 

主要写流程分析:

1int FileStore::queue_transactions(Sequencer *posr, list<Transaction*> &tls,

  TrackedOpRef osd_op,

  ThreadPool::TPHandle *handle)

 

FileStore的写的入口,写都是以事务的形式提交。

 

2_op_journal_transactions(tbl, data_align, o->op, new C_JournaledAhead(this, osr, o, ondisk),

       osd_op);

      journal->submit_entry(op, tbl, data_align, onjournal, osd_op);

 本函数调用 journal->submit_entry 接口,提交日志,也就是把日志写入日志盘。参数onjournal回调函数,当日志完成后就调用该回调函数。

 

3)当日志提交完成后,ContexC_JournaledAhead调用函数FileStore::_journaled_ahead,该函数调用queue_op函数,把该请求加入的op_wq队列中。

4)op_wq的处理线程调用FileStore::_do_op 函数,最终调用_do_transactions 实现数据真正写入对象对应的文件中。需要注意的是,这个函数直接调用文件系统的write函数,数据写缓存中就直接返回。因为此时,数据已经persistent到了日志盘中,这时候保证数据可读即可。

 

日志的写入流程


日志写入的入口函数为:journalsubmit_entry函数

1)通过加writeq_lockcompletions_lock首先把请求加入的到writeqcompletions两个队列中。

2)FileJournal的内部线程write_thread,对应的run函数write_thread_entrywriteq队列中获取请求,通过aio 写入日志磁盘

3)write_finish_thread(这里分析aio的情况)检查是否有aio请求完成 ,如果完成,则把该请求从completions队列删除,并添加到Finisher队列里。

4)Finisher队列调用日志的回调函数完成。


日志的同步


FileStore::mount方法中,会创建sync线程 sync_thread.create();

该线程的入口函数为:void FileStore::sync_entry()

该函数定期执行同步操作,当同步时,调用tp.pause, FileStore的 op_wq的线程池停止,等待正在应用的日志完成。然后调用fsycn同步内存中的数据到数据盘,当同步完成后,就可以丢弃相应的日志,释放相应的日志空间。

 

 

1 0
原创粉丝点击