CEPH OBJECTSTORE API介绍
Thomas是本人在Ceph中国社区翻译小组所用的笔名,该文首次公布在Ceph中国社区。现转载到本人博客,以供大家传阅
CEPH OBJECTSTORE API介绍
本文由 Ceph中国社区-Thomas翻译,陈晓熹校稿 。
英文出处:THE CEPH OBJECTSTORE API 欢迎加入 翻译小组
简单介绍
object store是Ceph OSD的一部分,它完毕实际的数据存储。当前有三种不同的object store可用:
- FileStore: 文件系统+日志后备的存储
- KeyValueStore: 基于KV数据库(如:RocksDB。 LevelDB)
- MemStore: 以内存作为存储(译注:全部数据全部位于内存中的STL::Map或者bufferlist)
(译注:眼下还有NewStore,或称BlueStore正在开发)
相关文档
代码
object store源代码位于Ceph源代码文件夹下的os子文件夹。为方便:ceph github repository。
以下的描写叙述基于Ceph commit-ish 6f8b54c from 2015-01-13。
ObjectStore API
抽象类ObjectStore是OSD实现存储訪问的主要API。

这是一套类文件系统API。可是囊括了将状态转化为事务的操作。存储的是对象,而不是文件。
一个对象包括:
- 字节数据 - 相似于文件系统中的文件内容
- 扩展属性 - 相似于文件系统中文件的扩展属性。是键值对集合。
- omap - 在概念上与扩展属性相似,但有着不同的地址空间大小及訪问模式。
一个对象由下述两个id标示:
- 集合id -
coll_tcid(一个集合就是一组对象) - 对象id -
ghobject_toid
操作
以下不是一个完整的列表;仅仅是给你一个印象。注意:有些操作仅仅对事务可用。
事务操作:以事务作为參数
apply_transactionqueue_transactions
常规文件系统操作:
mountumountmkfsmkjournalstatfsneed_journalsyncflushsnapshot
对象操作:以coll_t cid和ghobject_t oid为參数
existsstatreadfiemapgetattrgetattrs
集合操作:以coll_t cid为參数
collection_getattrcollection_emptycollection_listlist_collectionscollection_existscollections_getattrs
Omap操作:
omap_getomap_get_headeromap_get_keysomap_get_valuesomap_check_keys
延伸阅读
- ObjectStore.h - 凝视部分
事务
定义:事务是原始的变更操作序列。类定义ObjectStore::Transaction。
支持的操作(摘自ObjectStore.h):
class Transaction {
public:
enum {
OP_NOP = 0,
OP_TOUCH = 9, // cid, oid
OP_WRITE = 10, // cid, oid, offset, len, bl
OP_ZERO = 11, // cid, oid, offset, len
OP_TRUNCATE = 12, // cid, oid, len
OP_REMOVE = 13, // cid, oid
OP_SETATTR = 14, // cid, oid, attrname, bl
OP_SETATTRS = 15, // cid, oid, attrset
OP_RMATTR = 16, // cid, oid, attrname
OP_CLONE = 17, // cid, oid, newoid
OP_CLONERANGE = 18, // cid, oid, newoid, offset, len
OP_CLONERANGE2 = 30, // cid, oid, newoid, srcoff, len, dstoff
OP_TRIMCACHE = 19, // cid, oid, offset, len **DEPRECATED**
OP_MKCOLL = 20, // cid
OP_RMCOLL = 21, // cid
OP_COLL_ADD = 22, // cid, oldcid, oid
OP_COLL_REMOVE = 23, // cid, oid
OP_COLL_SETATTR = 24, // cid, attrname, bl
OP_COLL_RMATTR = 25, // cid, attrname
OP_COLL_SETATTRS = 26, // cid, attrset
OP_COLL_MOVE = 8, // newcid, oldcid, oid
OP_STARTSYNC = 27, // start a sync
OP_RMATTRS = 28, // cid, oid
OP_COLL_RENAME = 29, // cid, newcid
OP_OMAP_CLEAR = 31, // cid
OP_OMAP_SETKEYS = 32, // cid, attrset
OP_OMAP_RMKEYS = 33, // cid, keyset
OP_OMAP_SETHEADER = 34, // cid, header
OP_SPLIT_COLLECTION = 35, // cid, bits, destination
OP_SPLIT_COLLECTION2 = 36, /* cid, bits, destination
doesn't create the destination */
OP_OMAP_RMKEYRANGE = 37, // cid, oid, firstkey, lastkey
OP_COLL_MOVE_RENAME = 38, // oldcid, oldoid, newcid, newoid
OP_SETALLOCHINT = 39, // cid, oid, object_size, write_size
OP_COLL_HINT = 40, // cid, type, bl
};
// ...
}
每个操作都在事务类中有一个相应的函数实现(如 OP_ZERO:zero(cid, oid off, len))
一个事务能够有例如以下三个回调:
on_appliedon_commiton_applied_sync
ObjectStore::Transaction对象主要用来发送来自OSD的操作序列。比如,OSD:mkfs运行下述操作来初始化meta集合:
ObjectStore::Transaction t;
t.create_collection(META_COLL);
t.write(META_COLL, OSD_SUPERBLOCK_POBJECT, 0, bl.length(), bl);
ret = store->apply_transaction(t);
ObjectStore::Transaction类还能从Buffer中反序列出操作序列(注:即从字节流重建Transcation对象)。日志重做机制就是使用这样的方式来重做事务(注:从日志中读取字节流重建出Transcation对象,再Apply这个对象)。
日志
日志对故障恢复非常重要。
基类ObjectStore没有实现日志功能。在子类JournalingObjectStore中加入了日志能力。

JournalingObjectStore中加入了例如以下方法:
- journal_start
- journal_stop
- journal_write_close
- journal_replay
更要的是:
- _op_journal_transactions - 加入事务到日志
- do_transactions - 应用日志的纯虚函数.
mount过程中的replay_journal中有一个调用样例。
实现
当前仅仅有一个Journal实现:

ObjectStore 实现
FileStore
因为KeyValueStore还处于实验阶段。而MemStore很多其它的还是一种參考/demo实现,FileStore成为眼下使用最广的一种实现。

FileStore实现了JournalingObjectStore类。相应地也就实现了ObjectStore类。该类既实现了ObjectStore::Transaction中的操作也实现了其它成员操作。
事务操作在_do_transaction中实现并分发给_$OPERATION方法完毕详细的工作。因为每个文件系统的特性不同,有些操作及特性检查方法被提取出来放到了抽象类FileStoreBackend中。一个与文件系统代码相关的特殊操作是:fiemap。
关于fiemap
fiemap同意你訪问文件的扩展数据。基本上,你请求Linux系统将指向文件数据区的索引返回给你。这对稀疏文件非常实用。Ceph FileStore在FileStore::_do_sparse_copy_range中使用了它。
延伸阅读:
FileStore后端
FileStore后端将大部分与文件系统相关的优化和生僻特性从FileStore的实现中抽象剥离。
假设底层的文件系统支持检查点,FileStore后备将使用文件系统的快照特性实现检查点。它还会运行特征检查,如检測是否支持fiemap。
全部的详细类都继承至共同的基类GenericFileStoreBackend。
特定文件系统的支持情况:
- ZFS - 用ZFS快照实现检查点
- XFS - 通过
set_alloc_hint设置XFS扩展大小 - Btrfs - 用Btrfs快照实现检查点。用COW实现高效的文件克隆
KeyValueStore
KeyValueStore是ObjectStore的一个适配类同一时候是KeyValueDB的一个详细子类。
KeyValueDB是KV数据库的一个通用接口类,在Ceph代码的其它地方也实用到它。适配器中最大的一部分操作是将使用集合id及对象id的类文件系统操作映射为扁平的KV接口。KV数据库中的键值不是通常的随意大小。因此。KV映射及键值的条带化都须要类StripObjectMap来完毕。它是KeyValueStore的一部分。
对象映射

GenericObjectMap是ghobject_t、coll_t到KV映射器的公共基类。它有点相似于KeyValueDB API,但并没有实现它。而是採用KeyValueDB代理实现。
StripObjectMap
StripObjectMap是KeyValueStore源代码的一部分而且实现了GenericObjectMap。它加入了条带和缓存功能。默认条带大小为4096字节(可配置)。
数据库后端

kinetic 希捷kinetic客户端github repository
leveldb Google LevelDB
rocksdb Facebook RocksDB
MemStore
MemStore将一切都存储在内存。在mount/umount时支持转储和恢复。为便于对象和组查找,它环绕着C++对象及哈希表来构建。
与它的实现相关的第一条提交记录是对ObjectStore 1的一种參数实现。该实现仍然是1,537 SLOC.
怎样加入新的ObjectStore
因为已经有处理文件系统和KV数据库的代码。写一个全新的ObjectStore不总是有必要。
一个粗略的指南告诉你从哪里開始:
想支持的是何种后端?
- KV数据库: 从
KeyValueDB的一个实现開始(注:參考LevelDBStore.cc/h 和 RocksDBStore.cc/h) - 文件系统:
- 看下
FileStoreBackend中的detect_features方法。文件系统是否须要特殊处理? - 是否支持快照?假设是,參考
BtrfsFileStoreBackend、ZFSFileStoreBackend
- 看下
- 全然不一样的实现?看看
MemStore(注:以了解须要实现哪些方法,以及这些方法最简单的的原型实现)。
#
CEPH OBJECTSTORE API介绍的更多相关文章
- Ceph基本情况介绍
Ceph基本情况的介绍 Ceph是一个分布式存储软件. 它支持用3种方式存储数据,分别是:对象存储.块设备存储.分布式文件系统存储. Ceph最初的目标是做一个分布式文件系统,直到现在这个目标也不能算 ...
- 常用ArcGIS for Silverlight 开发API介绍
1.API介绍 2.Map对象 3.Layer对象 4.Symbol对象 5.Task对象
- Servlet基础(一) Servlet简介 关键API介绍及结合源码讲解
Servlet基础(一) Servlet基础和关键的API介绍 Servlet简介 Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中. Servlet容器负责Servl ...
- python学习笔记(win32print API介绍)
最近博主在研究用python控制打印机 这里整理下win32print的API介绍,官网地址http://timgolden.me.uk/pywin32-docs/win32print.html Op ...
- 使用html5中video自定义播放器必备知识点总结以及JS全屏API介绍
一.video的js知识点: controls(控制器).autoplay(自动播放).loop(循环)==video默认的: 自定义播放器中一些JS中提供的方法和属性的记录: 1.play()控制视 ...
- Commons-lang API介绍
4.1 Commons-lang API介绍 4.1.1 StringUtils 4.1.2 StringEscapeUtils 4.1.3 ArrayUtils 4.1.4 DateUtils 4. ...
- APP自动化框架LazyAndroid使用手册(3)--核心API介绍
作者:黄书力 概述 在前一篇博文中,简要介绍了一款安卓UI自动化测试框架LazyAndroid (http://blog.csdn.net/kaka1121/article/details/53204 ...
- Spring Boot 2.x 编写 RESTful API (一) RESTful API 介绍 & RestController
用Spring Boot编写RESTful API 学习笔记 RESTful API 介绍 REST 是 Representational State Transfer 的缩写 所有的东西都是资源,所 ...
- FastDFS api介绍
1. 命令行api介绍 FastDFS提供了可用于运维测试的命令行api,下面进行介绍: 1.1 fastdfs服务管理 tracker进程服务管理脚本 /etc/init.d/fdfs_tracke ...
随机推荐
- 斜率优化dp练习
1.HDU3507 裸题,有助于理解斜率优化的精髓. dp[i]=min(dp[j]+m+(sum[i]-sum[j])2) 很显然不是单调队列. 根据斜率优化的的定义,就是先设两个决策j,k 什么时 ...
- hashlib —— Python 的 md5 和 sha1 加密
python的md5和sha1加密 0. md5 与 sha1 MD5 的全称是 Message-Digest Algorithm 5(信息-摘要算法).128 位长度.目前 MD5 是一种不可逆算法 ...
- rhel5安装 oracle10
readhat 安装11gr2文档 需要注意的地方:必须关掉的 1,防火墙:2,SElinux . root 用户运行 setup 命令可关防火墙与SElinux 修改网络配置文件,一定要重启此文 ...
- Python的数组合并
https://blog.csdn.net/hustqb/article/details/78090365 TypeError: can only concatenate list (not &quo ...
- GOROOT,GOPATH,GOBIN,project
GOROOT,GOPATH,GOBIN,project目录 我们接下来一个一个来看关于Go语言中的三个目录的详细解释先通过go env查看go的环境变量(我这里是mac的环境,所以可能和你的不同) ...
- iOS_02_第一个C语言程序(理解编译、连接、运行)
一.开发工具的选择 1. 可以用来写代码的工具:记事本.ULtraEdit.Vim.Xcode等. 2. 选择XCode的原因:苹果公司官方提供的开发利器.简化开发的工程.有高亮显示功能. 3. 使用 ...
- Perl——正则表达式(四) 查找替换s///
转自http://blog.csdn.net/blog_abel/article/details/40589227 侵删 一. 介绍 使用 s/regex/replacement/modifiers ...
- 一起talk C栗子吧(第八回:C语言实例--素数)
各位看官们,大家好,从今天開始.我们讲大型章回体科技小说 :C栗子,也就是C语言实例. 闲话休提, 言归正转. 让我们一起talk C栗子吧! 看官们.上一回中咱们说的是进制转换的样例,这一回咱们说的 ...
- 【习题 3-5 UVA-227】Puzzle
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟题.. 输入稍微恶心了点. getchar()一个一个搞就好. [代码] #include <bits/stdc++.h& ...
- 利用VS安装项目打包软件的做法
作者:朱金灿 来源:http://blog.csdn.net/clever101 昨天摸索了一下,发现使用VS安装项目来打包软件还是挺方便的. 1. 创建一个安装项目工程,如下图: 2. 设置工程属性 ...