Ceph源码分析-KeyValueStore

KeyValueStore 是 Ceph 支持的另外一个存储引擎(第一个是FileStore),它是在 Emporer 版本中Add LevelDB support to ceph cluster backend store Design Summit 上由本人提出并实现了原型系统,在 Firely 版本中实现了与 ObjectStore 的对接。目前已经合并到 Ceph 的 Master 上。 php

KeyValueStore 相对于 FileStore 是一个轻量级实现,目标是利用其不一样 Backend 提供的能力来为 Ceph 的不一样应用场景服务。如目前的默认 engine 是 LevelDB,指望来提供高性能的写性能。 后端

主要数据结构

 

KeyValueStore主要由三部分组成,一个是继承ObjectStore 的KeyValueStore 类,另外一个是GenericObjectMap(相似于FileStore 的DBObjectMap),最后一个是继承GenericObjectMap 的StripObjectMap。GenericObjectMap 是主要用来访问后端Engine 的实现,它的做用有点相似VFS,而Engine 就是各类不一样的FileSystem,它抽象出一些基本的方法(read/write)和一些高级接口(rename/clone)等等,首先最初开始设计GenericObjectMap的时候是打算直接利用已经存在的FileStore 的DBObjectMap,可是在必定的调查后发现DBObjectMap 缺乏必定的扩展性,很难在不破坏现有接口的前提下来实现,所以最后与Sage 商定直接实现新的ObjectMap。那么什么是ObjectMap,正如在上篇FileStore 文章中所述,ObjectMap 是利用K/V 接口实现的一个多层次Map,目的是让OSD 最重要的Object 具有一个独立和高效查找的KV 空间,同时这个空间还能使用no-copy 的clone。 数据结构

     GenericObjectMap 在提供了一个面向Object 的通用KV 空间后,StripObjectMap 继承了GenericObjectMap 实现了对Object Data 的封装,ObjectStore 有三种类型的数据: Data, attr 和Omap,后二者都是单一的KV 实现,能够直接利用GenericObjectMap 的原生接口实现,可是Data 的接口是相似于Posix 须要具有Parity Write 的能力,所以简单的将一个Object 的Data 做为一个键值对是不合适的,须要作一个Strip 的工做,将一个Object 的Data 根据必定宽度划分红多个键值对,这个工做就是由StripObjectMap 来完成。 性能

   最后KeyValueStore 类利用StripObjectMap 来完成了对ObjectStore 的方法实现。 ui

struct OpWQ定义了操做队列 spa

op_tp定义了线程池
线程

主要 IO 路径

与FileStore 的实现相似,KeyValueStore 也会产生一个消息队列,全部来自上层PG 产生的IO 请求都会先放入这个队列,而后会有多个KeyValueStore 线程做为队列的消费者获取请求进行处理,由于PG 天生的隔离性,目前KeyValueStore 是利用PG 做为一个隔离单元,同一时间只有一个线程处理同一个PG 的请求。KeyValueStore 线程针对每个请求会产生一个缓冲空间,由于一个请求做为一个事务会包含多个原子操做,为了保证事务的原子性和隔离性,每个请求在中间阶段并不能写入到持久层,只能产生一些操做序列,而可能的反作用就须要被缓冲空间保存起来做为后续操做的上下文。最后KeyValueStore 线程会提交这个请求来完成此次事务。</font 设计

KeyValueStore.h中相关定义以下 code

struct Op {
 utime_t start;
 uint64_t op;
 list<Transaction*> tls;
 Context *ondisk, *onreadable, *onreadable_sync;
 uint64_t ops, bytes;
 TrackedOpRef osd_op;
 };
 struct OpWQ : public ThreadPool::WorkQueue<OpSequencer>

消息处理请求控制 继承

unsigned KeyValueStore::_do_transaction(Transaction& transaction,                                        BufferTransaction &t,                                        ThreadPool::TPHandle *handle)
相关文章
相关标签/搜索