文档章节

Ceph源码分析-KeyValueStore

 惊浪
发布于 2014/12/29 14:18
字数 882
阅读 791
收藏 4

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

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 的方法实现。

struct OpWQ定义了操作队列

op_tp定义了线程池

主要 IO 路径

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

KeyValueStore.h中相关定义如下

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)


© 著作权归作者所有

粉丝 15
博文 32
码字总数 19096
作品 0
福州
程序员
私信 提问
ceph osd 报错!!!

-4> 2015-05-26 07:56:17.139147 7f42a6bf6700 10 monclient: get_version osdmap req 0x6e0f400 -3> 2015-05-26 07:56:17.139180 7f42a6bf6700 10 monclient: _send_mon_message to mon.nod......

ice_lee
2015/05/26
480
0
浅谈wireshark解析ceph网络通信

一、安装wireshark wireshark从2.0版开始支持ceph协议解析 下载地址:https://www.wireshark.org/download/ 二、ceph网络抓包 使用tcpdump在ceph集群上抓包,e.g.:tcpdump -i ens33 -s 0 -...

zrz11
2018/11/05
144
2
Qemu打开rbd镜像的源码分析

Ceph 0.94.1 Qemu 2.4.0 rbd.c 在qemurbdopen函数中,操作了一个重要的数据结构——结构体BDRVRBDState,这个结构体保存了非常重要的信息。 typedef struct BDRVRBDState { rados_t cluster;...

wikison
2015/11/03
874
0
Hyperledger Fabric 客户端开发三

前面两篇文章介绍了Hyperledger Fabric SDK并使用一个实例介绍如何通过SDK和Hyperledger Fabric Blockchain交互, 现在详细分析相关的过程。 首先看 enroll (登录) admin 过程。 和其他所有程...

十一月不远
2018/07/23
92
0
闲聊Ceph目前在中国的发展&Ceph现状

近年来,大型企业以及开源社区不断的推动中国开源技术的发展,今天的中国已然成为OpenStack & Ceph等开源技术大放光彩的乐土。 图为 Ceph中国行各地沙龙 Ceph国内用户生态 Ceph作为全球最火热...

Devin
2017/06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
9
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
5
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部