架构
ceph radosgw(rgw)是ceph提供的对象存储服务,对外提供s3和swift两套API,API实现需要的各种特性都是基于rados来实现的,架构图如下:
图中第一层代表rgw对外提供的接口,第二层表示rgw作为对外API和底层rados的转换层,第三层表示rgw通过librados与rados集群进行交互,第四层表示rados集群的结构。
各部分的概念可以去ceph文档和s3文档方便得获得。
数据布局
以s3为例,说下rgw的整体数据布局。
rados存储组织
这边假设rados底层存储以使用的是默认的FileStore,假设FileStore底层是linux的ext4文件系统,那么最底层的存储方式就是一个ext4文件系统下的文件。所以其存储层次和位置如下所示:
- pool
- object
- xattr
- ext4文件属性(最大4KB)
- omap
- data
- ext4文件内容
- xattr
- object
解释下:
- rados以pool来组织数据,一个pool中包含大量object。
- 而一个object包含两部分内容,一部分是要存储的对象数据data,一部分是该对象的额外属性xattr。
- 对象的数据存储在ext文件的内容部分。
- 对象的额外属性可以有两个存储的部分:一个是ext4文件的属性部分,这部分往往受底层文件系统的约束,比如ext4文件系统要求其最大不超过4KB;另一个是rados实现的omap,rados使用一种机制,可以为每一个object关联一个omap。
- omap是一个key-value存储系统,最早是leveldb,当然也有其他选择,比如rocksdb。
radosgw为s3 API提供的实现
s3除了基本的对象,还包括一些新的概念,比如user、bucker等。究其本质,无非是属性和关系,属性本身就是一种数据,而关系也可以通过映射表等数据结构来表达,所以这些对象在rados中都可以通过在特定的pool下用object方式来存储。
metadata:user、bucket、bucket.instance
其内容如下:
- user: Holds user information and a mapping between user id and bucket name
- bucket: Holds a mapping between bucket name and bucket instance id(marker)
- bucket.instance: Holds bucket instance information[2]
可以通过下面的命令来查看和获得。
注:<bucket>
指bucket name; <marker>
指bucker id; <user>
指user id。
$ radosgw-admin metadata list
$ radosgw-admin metadata list bucket
$ radosgw-admin metadata list bucket.instance
$ radosgw-admin metadata list user
$ radosgw-admin metadata get bucket:<bucket>
$ radosgw-admin metadata get bucket.instance:<bucket>:<marker>
$ radosgw-admin metadata get user:<user> # get or set
user 数据被以<user>
作为object name存储在default.rgw.meta pool中,其namespace是users.uid。
bucket 数据以<bucket>
作为object name存储在default.rgw.meta pool中,其namespace是root。
bucket.instance 数据以.bucket.meta.<bucket>:<marker>
作为 object name存储在default.rgw.meta pool中,其namespace是root。
bucket index
bucket index是将bucket和其包含的object关联起来的映射。它算是一类特别的metadata,但和metadata分开存储。一般情况下,一个bucket会对应一个存储bucket index的object,bucket index是存储在这个object的omap中的。bucket index中的key是根据bucket所包含的object的id得到的一个seq,value是具体obejct的一些元数据(会被list buckets返回)。
之前有提到,omap是通过某种机制关联到object上的,如下图。
可以这么理解,rgw首先根据object id,存放一个Header类型的数据结构到omap中,其中Header中的一个成员变量为seq,然后object具体的metadata是以seq作为key存到omap中的。
bucket index被以.dir.<marker>
作为object name 存储在default.rgw.buckets.index pool中。
obeject
一个s3 object存储在一个或多个rgw object中。
object被以 <marker>_<key>
作为object name存储在default.rgw.buckets.data pool中,
访问流程
以s3接口为例,当用户访问rgw时,需要提供账户信息、bucket name和object name。账户信息用来获取user id,做access control;bucket name和object name用来在pool中访问object。
附录:常见pool及其内容
.rgw.root
Unspecified region, zone, and global information records, one per object.
<zone>.rgw.control
notify.<N>
<zone>.rgw.meta
Multiple namespaces with different kinds of metadata:
namespace: root
<bucket> .bucket.meta.<bucket>:<marker> # see put_bucket_instance_info()
The tenant is used to disambiguate buckets, but not bucket instances. Example:
.bucket.meta.prodtx:test%25star:default.84099.6
.bucket.meta.testcont:default.4126.1
.bucket.meta.prodtx:testcont:default.84099.4
prodtx/testcont
prodtx/test%25star
testcont
namespace: users.uid
Contains _both_ per-user information (RGWUserInfo) in “<user>” objects and per-user lists of buckets in omaps of “<user>.buckets” objects. The “<user>” may contain the tenant if non-empty, for example:
prodtx$prodt
test2.buckets
prodtx$prodt.buckets
test2
namespace: users.email
Unimportant
namespace: users.keys
47UA98JSTJZ9YAN3OS3O
This allows radosgw to look up users by their access keys during authentication.
namespace: users.swift
test:tester
<zone>.rgw.buckets.index
Objects are named “.dir.<marker>”, each contains a bucket index. If the index is sharded, each shard appends the shard index after the marker.
<zone>.rgw.buckets.data
default.7593.4__shadow_.488urDFerTYXavx4yAd-Op8mxehnvTI_1 <marker>_<key>
An example of a marker would be “default.16004.1” or “default.7593.4”. The current format is “<zone>.<instance_id>.<bucket_id>”. But once generated, a marker is not parsed again, so its format may change freely in the future.
更多细节请参考:
http://docs.ceph.com/docs/master/radosgw/layout/
http://www.wzxue.com/ceph-filestore/
http://bean-li.github.io/ceph-omap/