searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

RGW架构解析

2023-10-18 07:50:50
145
0

1、整体架构

RGW即对象存储网关,该网关同时提供了兼容AWS S3OpenStack Swift的对象存储访问接口,并且调用libradosAPI来实现数据的存储和读取。

RGW整体架构

RGW 中三个基本概念:user bucket object。三者的关系如下图所示:

RGW数据模型

2、RGW pool

RGW 中数据分三种类型:

metadata: user保存用户信息, bucket保存所有的bucket name, bucket.instance保存bucket namebucket id之间的对应关系

bucket index: 单独作为一种metadata

data: 每个RGW object 会保存在一个或多个Rados object(s)

这三部分和对象存储的核心概念一一对应,元数据是进行各种管理操作的依据,而bucket index则是bucketobjects的索引,data就是实际保存在bucket中的object了。

RGW 的数据在RADOS 层以三种形式存在:rados对象(data 部分),rados 对象扩展属性xattrrados 对象的omap中。

这些数据保存在多个pool中:

1.rgw.root:保存zone,zg,realm,period相关的信息

2{zone}.rgw.control:提供libradoswatch-notify机制保证缓存一致性如:notify.<N>

3{zone}.rgw.log:记录3种不同的日志

用户操作记录涉及opslog

多数据中心同步涉及 meta_log,data_log

记录同步失败的error-log

4{zone}.rgw.meta:users.keys:存储 key  uid 的对应关系

5{zone}.rgw.meta:users.email:存储邮箱和 uid 的对应关系

6{zone}.rgw.meta:users.swift:存储swift keyuid 的对应关系

7{zone}.rgw.meta:users.uid:分两类

{user} 对象里保存对应用户的信息 (RGWUserInfo结构体)

{user}.buckets对象的omap中保存用户的所有的bucket列表

8{zone}.rgw.meta:root:保存bucket信息,其中对象分两类

{bucket} 记录bucketinstance_id的对应关系 (RGWBucketEntryPoint结构体)

.bucket.meta.{tenant}:{bucket}:{marker} 记录bucket的动态信息 (RGWBucketInfo结构体)bucketACLIAM Policy信息存放在xattr属性中

9{zone}.rgw.otp:存储one-time password秘钥,开启MFAMulti-Factor Authentication)时使用

10{zone}.rgw.buckets.index:存储 bucket 中对象的索引

.dir.{marker}对象,每个包含一个bucket的所有objects的索引,object的索引信息保存在omap中,其中 omap key 对应 object nameomap value则保存一些必要的 object metadata,对于启用分片的情况,对象名为.dir.<marker>.<sharding_id>

11{zone}.rgw.buckets.data:存储RGW object的数据,数据保存在一个或多个RADOS object的数据部分,元数据保存在其中一个RADOS objectxattr属性中

12{zone}.rgw.buckets.non-ecmultipart upload过程中的临时数据会放这里。data_extra_pool如果不显式指定的话就会使用data_pool

3、RGW对象

 RADOS 集群提供的接口是对象形式的。从用户的角度来讲,直接用 librados 就能使用“对象存储”。其实 RGW 中的“对象”和 RADOS 中的“对象” 两个概念。

RADOS 对象,简称 RADOS object,特性有:

limited object size

mutable object

not indexed

no per-object ACLs

access with sockets

flatten namespace

RGW 对象,简称RGW object,特性有:

large objects(up to a few TB per object)

immutable object

sorted bucket listing

permissions

access with HTTP

我们看到 RGW 这一层提供了很多librados不能提供的功能。

一个RGW Object由一个或多个Rados Object组成。

rgw_max_put_size:默认5G。普通对象(非multi-part)上传的最大大小。普通对象上传的大小上限,超过这个大小的对象上传,就需要特殊的处理机制:S3 API提供了multi-part 上传机制, Swift提供了DLOSLO

rgw_max_chunk_size:默认4MRGW在访问数据对象时发送的RADOS I/O请求的大小。同时决定RGW object分成多个RADOS object时首对象的大小(head object)。

rgw_obj_stripe_size:默认4M。当一个RGW object分成多个RADOS object时中间RADOS object的大小。

RGW服务对单个RGW object提供了两种上传接口:整体上传与分段上传。

如果上传的RGW object小于rgw_max_put_size,可以整体上传。

如果上传的RGW object大于rgw_max_put_size,必须分段上传。

RGW object的数据存储在:{zone}.rgw.buckets.data池中。应用上传的RGW object包括数据与元数据,数据保存在一个或多个RADOS object的数据部分,元数据保存在其中一个RADOS objectxattr属性中。

(1)整体上传

如果应用上传的RGW object大小小于rgw_max_chunk_sizeRGW object只对应一个RADOS object,数据存储在该RADOS object的数据部分,元数据存储在该RADOS objectxattr属性中,该RADOS object称为head object

如果上传的RGW object大小大于rgw_max_chunk_sizeRGW object分解成一个大小等于rgw_max_chunk_size的首对象,多个大小等于rgw_obj_stripe_size的中间对象,一个大小小于或者等于rgw_obj_stripe_size的尾对象。首对象的数据部分保存了RGW object的前rgw_max_chunk_size字节的数据,RGW object的元数据存储在该RADOS objectxattr属性中,该对象称为head object,中间对象和尾对象都称为tail object

以上传15MB的对象为例:

整体上传对象的数据分布

(2)分段上传

分段上传一个RGW object时,RGW object会生成一个大小等于0的首对象,RGW服务会根据rgw_obj_stripe_size将每个分段分成多个RADOS object:每个分段生一个大小等于rgw_obj_stripe_sizepart对象,多个大小等于rgw_obj_stripe_size的中间对象,一个大小小于或者等于rgw_obj_stripe_size的尾对象。首对象的大小为0RGW object的元数据存储在该RADOS objectxattr属性中,该对象称为head object。每个分段的中间对象与尾对象都是tail object

上传20MB的对象,以s3cmd工具默认分段大小15MB为例:

分段上传对象的数据分布

0条评论
0 / 1000
黄****锐
4文章数
1粉丝数
黄****锐
4 文章 | 1 粉丝
黄****锐
4文章数
1粉丝数
黄****锐
4 文章 | 1 粉丝
原创

RGW架构解析

2023-10-18 07:50:50
145
0

1、整体架构

RGW即对象存储网关,该网关同时提供了兼容AWS S3OpenStack Swift的对象存储访问接口,并且调用libradosAPI来实现数据的存储和读取。

RGW整体架构

RGW 中三个基本概念:user bucket object。三者的关系如下图所示:

RGW数据模型

2、RGW pool

RGW 中数据分三种类型:

metadata: user保存用户信息, bucket保存所有的bucket name, bucket.instance保存bucket namebucket id之间的对应关系

bucket index: 单独作为一种metadata

data: 每个RGW object 会保存在一个或多个Rados object(s)

这三部分和对象存储的核心概念一一对应,元数据是进行各种管理操作的依据,而bucket index则是bucketobjects的索引,data就是实际保存在bucket中的object了。

RGW 的数据在RADOS 层以三种形式存在:rados对象(data 部分),rados 对象扩展属性xattrrados 对象的omap中。

这些数据保存在多个pool中:

1.rgw.root:保存zone,zg,realm,period相关的信息

2{zone}.rgw.control:提供libradoswatch-notify机制保证缓存一致性如:notify.<N>

3{zone}.rgw.log:记录3种不同的日志

用户操作记录涉及opslog

多数据中心同步涉及 meta_log,data_log

记录同步失败的error-log

4{zone}.rgw.meta:users.keys:存储 key  uid 的对应关系

5{zone}.rgw.meta:users.email:存储邮箱和 uid 的对应关系

6{zone}.rgw.meta:users.swift:存储swift keyuid 的对应关系

7{zone}.rgw.meta:users.uid:分两类

{user} 对象里保存对应用户的信息 (RGWUserInfo结构体)

{user}.buckets对象的omap中保存用户的所有的bucket列表

8{zone}.rgw.meta:root:保存bucket信息,其中对象分两类

{bucket} 记录bucketinstance_id的对应关系 (RGWBucketEntryPoint结构体)

.bucket.meta.{tenant}:{bucket}:{marker} 记录bucket的动态信息 (RGWBucketInfo结构体)bucketACLIAM Policy信息存放在xattr属性中

9{zone}.rgw.otp:存储one-time password秘钥,开启MFAMulti-Factor Authentication)时使用

10{zone}.rgw.buckets.index:存储 bucket 中对象的索引

.dir.{marker}对象,每个包含一个bucket的所有objects的索引,object的索引信息保存在omap中,其中 omap key 对应 object nameomap value则保存一些必要的 object metadata,对于启用分片的情况,对象名为.dir.<marker>.<sharding_id>

11{zone}.rgw.buckets.data:存储RGW object的数据,数据保存在一个或多个RADOS object的数据部分,元数据保存在其中一个RADOS objectxattr属性中

12{zone}.rgw.buckets.non-ecmultipart upload过程中的临时数据会放这里。data_extra_pool如果不显式指定的话就会使用data_pool

3、RGW对象

 RADOS 集群提供的接口是对象形式的。从用户的角度来讲,直接用 librados 就能使用“对象存储”。其实 RGW 中的“对象”和 RADOS 中的“对象” 两个概念。

RADOS 对象,简称 RADOS object,特性有:

limited object size

mutable object

not indexed

no per-object ACLs

access with sockets

flatten namespace

RGW 对象,简称RGW object,特性有:

large objects(up to a few TB per object)

immutable object

sorted bucket listing

permissions

access with HTTP

我们看到 RGW 这一层提供了很多librados不能提供的功能。

一个RGW Object由一个或多个Rados Object组成。

rgw_max_put_size:默认5G。普通对象(非multi-part)上传的最大大小。普通对象上传的大小上限,超过这个大小的对象上传,就需要特殊的处理机制:S3 API提供了multi-part 上传机制, Swift提供了DLOSLO

rgw_max_chunk_size:默认4MRGW在访问数据对象时发送的RADOS I/O请求的大小。同时决定RGW object分成多个RADOS object时首对象的大小(head object)。

rgw_obj_stripe_size:默认4M。当一个RGW object分成多个RADOS object时中间RADOS object的大小。

RGW服务对单个RGW object提供了两种上传接口:整体上传与分段上传。

如果上传的RGW object小于rgw_max_put_size,可以整体上传。

如果上传的RGW object大于rgw_max_put_size,必须分段上传。

RGW object的数据存储在:{zone}.rgw.buckets.data池中。应用上传的RGW object包括数据与元数据,数据保存在一个或多个RADOS object的数据部分,元数据保存在其中一个RADOS objectxattr属性中。

(1)整体上传

如果应用上传的RGW object大小小于rgw_max_chunk_sizeRGW object只对应一个RADOS object,数据存储在该RADOS object的数据部分,元数据存储在该RADOS objectxattr属性中,该RADOS object称为head object

如果上传的RGW object大小大于rgw_max_chunk_sizeRGW object分解成一个大小等于rgw_max_chunk_size的首对象,多个大小等于rgw_obj_stripe_size的中间对象,一个大小小于或者等于rgw_obj_stripe_size的尾对象。首对象的数据部分保存了RGW object的前rgw_max_chunk_size字节的数据,RGW object的元数据存储在该RADOS objectxattr属性中,该对象称为head object,中间对象和尾对象都称为tail object

以上传15MB的对象为例:

整体上传对象的数据分布

(2)分段上传

分段上传一个RGW object时,RGW object会生成一个大小等于0的首对象,RGW服务会根据rgw_obj_stripe_size将每个分段分成多个RADOS object:每个分段生一个大小等于rgw_obj_stripe_sizepart对象,多个大小等于rgw_obj_stripe_size的中间对象,一个大小小于或者等于rgw_obj_stripe_size的尾对象。首对象的大小为0RGW object的元数据存储在该RADOS objectxattr属性中,该对象称为head object。每个分段的中间对象与尾对象都是tail object

上传20MB的对象,以s3cmd工具默认分段大小15MB为例:

分段上传对象的数据分布

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
1
1