1、整体架构
RGW即对象存储网关,该网关同时提供了兼容AWS S3和OpenStack Swift的对象存储访问接口,并且调用librados的API来实现数据的存储和读取。
RGW整体架构
RGW 中三个基本概念:user, bucket, object。三者的关系如下图所示:
RGW数据模型
2、RGW pool
RGW 中数据分三种类型:
metadata: user保存用户信息, bucket保存所有的bucket name, bucket.instance保存bucket name与bucket id之间的对应关系
bucket index: 单独作为一种metadata
data: 每个RGW object 会保存在一个或多个Rados object(s)
这三部分和对象存储的核心概念一一对应,元数据是进行各种管理操作的依据,而bucket index则是bucket对objects的索引,data就是实际保存在bucket中的object了。
RGW 的数据在RADOS 层以三种形式存在:rados对象(data 部分),rados 对象扩展属性xattr,rados 对象的omap中。
这些数据保存在多个pool中:
1).rgw.root:保存zone,zg,realm,period相关的信息
2){zone}.rgw.control:提供librados的watch-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 key和uid 的对应关系
7){zone}.rgw.meta:users.uid:分两类
{user} 对象里保存对应用户的信息 (RGWUserInfo结构体)
{user}.buckets对象的omap中保存用户的所有的bucket列表
8){zone}.rgw.meta:root:保存bucket信息,其中对象分两类
{bucket} 记录bucket与instance_id的对应关系 (RGWBucketEntryPoint结构体)
.bucket.meta.{tenant}:{bucket}:{marker} 记录bucket的动态信息 (RGWBucketInfo结构体),bucket的ACL、IAM Policy信息存放在xattr属性中
9){zone}.rgw.otp:存储one-time password秘钥,开启MFA(Multi-Factor Authentication)时使用
10){zone}.rgw.buckets.index:存储 bucket 中对象的索引
.dir.{marker}对象,每个包含一个bucket的所有objects的索引,object的索引信息保存在omap中,其中 omap key 对应 object name,omap value则保存一些必要的 object metadata,对于启用分片的情况,对象名为.dir.<marker>.<sharding_id>
11){zone}.rgw.buckets.data:存储RGW object的数据,数据保存在一个或多个RADOS object的数据部分,元数据保存在其中一个RADOS object的xattr属性中
12){zone}.rgw.buckets.non-ec:multipart 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提供了DLO和SLO。
rgw_max_chunk_size:默认4M。RGW在访问数据对象时发送的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 object的xattr属性中。
(1)整体上传
如果应用上传的RGW object大小小于rgw_max_chunk_size,RGW object只对应一个RADOS object,数据存储在该RADOS object的数据部分,元数据存储在该RADOS object的xattr属性中,该RADOS object称为head object。
如果上传的RGW object大小大于rgw_max_chunk_size,RGW object分解成一个大小等于rgw_max_chunk_size的首对象,多个大小等于rgw_obj_stripe_size的中间对象,一个大小小于或者等于rgw_obj_stripe_size的尾对象。首对象的数据部分保存了RGW object的前rgw_max_chunk_size字节的数据,RGW object的元数据存储在该RADOS object的xattr属性中,该对象称为head object,中间对象和尾对象都称为tail object。
以上传15MB的对象为例:
整体上传对象的数据分布
(2)分段上传
分段上传一个RGW object时,RGW object会生成一个大小等于0的首对象,RGW服务会根据rgw_obj_stripe_size将每个分段分成多个RADOS object:每个分段生一个大小等于rgw_obj_stripe_size的part对象,多个大小等于rgw_obj_stripe_size的中间对象,一个大小小于或者等于rgw_obj_stripe_size的尾对象。首对象的大小为0,RGW object的元数据存储在该RADOS object的xattr属性中,该对象称为head object。每个分段的中间对象与尾对象都是tail object。
上传20MB的对象,以s3cmd工具默认分段大小15MB为例:
分段上传对象的数据分布