Ceph RGW:数据存储和寻址

RGW是一个对象处理网关。数据实际上存储在ceph集群中。使用librados的接口与ceph集群通信。RGW主要存储三种类型的数据:元数据、桶索引和数据。这三类数据一般存储在不同的池中,元数据也分为各种元数据,存储在不同的ceph池中。

1、元数据

元数据信息包括:用户、桶和桶实例。其中:

用户:主要指对象存储的用户信息。

Bucket:主要维护bucket名称和bucket实例id的映射信息。

Bucket.instance:维护Bucket实例信息。

查看用户的元数据,如下所示:

radosgw-管理元数据列表用户:

radosgw-admin元数据获取用户:testid:

radosgw-管理元数据列表桶:

radosgw-管理元数据获取存储桶:第一个:

radosgw-管理元数据列表bucket.instance:

radosgw-admin元数据获取bucket . instance:first:{ bucket _ id }

2、桶指数

桶索引主要维护一个桶中某个对象的索引信息。一个bucket对应于一个或多个radosobjects(在bucket shards下)。它维护一个key-val的映射结构,映射存储在object的omap(rocksdb)中。Key对应的rgw对象和Val是一些关于rgw对象的元数据信息,在检索存储在bucket中的对象时需要用到。Omap还包含一个头,它存储bucket帐户信息,比如bucket中对象的数量、总大小等等。

3、数据

rgw对象的内容存储在一个或多个radosobjects中。Rados对象分为头部和尾部。标头最多可以容纳512KB的数据。如果rgw对象的大小小于512KB,那么只有头。否则,剩余的数据将被条带化,并根据集群radosobject的大小划分为多个rados对象。

使用命名空间隔离池中的多个存储空间:Pool: {zone}.rgw.meta:

对于池:{zone}.rgw.log还包含多个命名空间:

当在对象存储中检索一个对象时,它将包含三个元素:user、bucket、object。用户主要由RGW用来获取认证ACL用户id的;Bucket和obejct用于确定对象在池中的位置。

用户

用户数据存储在{zone}.rgw.meta:users.uid中,如下所示:

包含两部分:ups3:用户自身信息;Ups3.buckets:用户所属的存储桶。

Ups3:用户基本信息,ACL/Bucekt额度/用户额度等。对应于rgw_common.h中定义的结构RGWUserInfo

Ups3。buckets:bucket,用户所属的键值结构,存储在omap结构中;对应的struct cls_user_bucket_entry在rgw_common.h中定义,数据操作如下:

通过{uid}找出用户拥有哪些存储桶。桶,这些桶有以下基本数据。

水桶

存储桶信息存在于{zone}.rgw.meta:root中,如下所示:

第一:记录bucket和bucket_instance_id的对应关系,对应的数据结构:struct RGWBucketEntryPoint。

. bucket . meta . first:1 C60 b 268-0a5d-4718-ad02-E4 b5 BCE 824 BF . 44166.4:bucket实例;寻址方式:。对应的结构:struct RGWBucketInfo。

Bucket ACL和IAM策略存储在Bucket实例对象的attr中。如下所示:

按如下方式获取存储桶ACL和IAM策略数据:

目标

桶索引:桶中包含的对象信息存储在一个或多个对象的omap中。这个omap是一个键值结构,键是对象的名字,值对应struct rgw _ bucket _ dir _ entry:cls _ rgw _ types . h。

存储桶索引对象:

如下所示:

在这个桶下,有一个对象:ntp.conf:

检索值:

Omap头记录了以下统计信息:

对象存储对象的数据存储在池中:{zone}。rgw.buckets.data .对象的组成和寻址可以分为以下两类:

一个RGW对象可以由一个或多个radosobjects组成。第一个对象是这个RGW的head对象,主要包含一些元数据信息,比如manifest、ACLs、contenttype、etag、自定义元数据等。这些元数据存储在这个head对象的xattr中。清单描述了这个rgw对象的分发。同时,这个head对象最多可以容纳额外的4MB数据。如果RGW对象的大小小于4MB,那么这个RGW对象不会被碎片化,只有这个头对象。

按如下方式搜索:

目前bucket下有一个ntp.conf,< 4MB .检索其清单:

如上:

Max_head_size:表示头部对象的最大尺寸;

Head_size:表示当前头部对象的大小;

前缀:用于在rados中寻址分区对象。

RGW对象ACL:

上传一个大于4MB的RGW对象,检索其清单信息:

清单信息:

根据清单检索对象:

对于一个大的RGW对象,它会被切割成几个独立的RGW Object并上传,这就是所谓的multipart。多路径的优点是断点续传。s3接口默认切割大小为15MB。

这里上传一个60MB的对象。

分四部分上传,查看rados对象:

包含三种对象,头部,多部分和阴影。

多部分下的清单:

所有对象检索都是基于上述清单信息来构建对象索引的:

在上面的信息中,这个RGW对象的大小是48128000字节,分为四段,三段15MB,最后一段是920KB。同时,rados集群中存储的每个段的条带大小为4MB。因此,15MB段也分为四个radosobjects、一个多部分头和三个阴影段。一个920KB的数据段只有一个多部分报头。

. rgw.root:

它包含区域、区域组和领域等信息。