ceph rgw:s3基本概念在rados中的组织方式

架构

ceph radosgw(rgw)是ceph提供的对象存储服务,对外提供s3和swift两套API,API实现需要的各种特性都是基于rados来实现的,架构图如下:


ceph rgw:s3基本概念在rados中的组织方式_第1张图片
image.png

图中第一层代表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文件内容

解释下:

  1. rados以pool来组织数据,一个pool中包含大量object。
  2. 而一个object包含两部分内容,一部分是要存储的对象数据data,一部分是该对象的额外属性xattr。
  3. 对象的数据存储在ext文件的内容部分。
  4. 对象的额外属性可以有两个存储的部分:一个是ext4文件的属性部分,这部分往往受底层文件系统的约束,比如ext4文件系统要求其最大不超过4KB;另一个是rados实现的omap,rados使用一种机制,可以为每一个object关联一个omap。
  5. 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 name; 指bucker id; 指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:
$ radosgw-admin metadata get bucket.instance::
$ radosgw-admin metadata get user:   # get or set

user 数据被以作为object name存储在default.rgw.meta pool中,其namespace是users.uid。

bucket 数据以作为object name存储在default.rgw.meta pool中,其namespace是root。

bucket.instance 数据以.bucket.meta.:作为 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上的,如下图。

ceph rgw:s3基本概念在rados中的组织方式_第2张图片
image.png

可以这么理解,rgw首先根据object id,存放一个Header类型的数据结构到omap中,其中Header中的一个成员变量为seq,然后object具体的metadata是以seq作为key存到omap中的。

bucket index被以.dir.作为object name 存储在default.rgw.buckets.index pool中。

obeject

一个s3 object存储在一个或多个rgw object中。

object被以 _作为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.

.rgw.control
    notify.

.rgw.meta
    Multiple namespaces with different kinds of metadata:

    namespace: root
         .bucket.meta.: # 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 “” objects  and per-user lists of buckets in omaps of “.buckets” objects. The “” 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
        
.rgw.buckets.index
    Objects are named “.dir.”, each contains a bucket index. If the index is sharded, each shard appends the shard index after the marker.
    
.rgw.buckets.data
    default.7593.4__shadow_.488urDFerTYXavx4yAd-Op8mxehnvTI_1 _
    
An example of a marker would be “default.16004.1” or “default.7593.4”. The current format is “..”. 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/

你可能感兴趣的:(ceph rgw:s3基本概念在rados中的组织方式)