应用上传的对象包括数据和元数据两部分,数据部分保存在一个或多个RADOS对象的数据部分中,元数据保存在其中1个rados 对象的扩展属性中。RGW 对单个对象提供了两种上传接口:整体上传 和 分段上传。不同的上传接口RGW对象和RADOS对象对应关系不同。
首先介绍两个宏值和一个类:
-
rgw_max_chunk_size
该宏值用来表示RGW下发到RADOS集群单个I/O大小,同时决定应用分成多个RADOS对象时首对象的大小,这里我们简称分块大小。 -
rgw_obj_stripe_size
该宏值用来指定当一个对象被分成多个RADOS对象时中间对象的大小,这里我们简称条带大小。 -
Class RGWObjMainfest
用来管理用户上传的对象和RADOS对象的对应关系。
下面我们分场景讨论:
整体上传1个对象时,当对象小于分块时
用户上传的一个对象只对应一个RADOS对象,该RADOS对象以应用对象名称命名,应用对象的元数据也保存在该RADOS对象的扩展属性中。
image.png
整体上传1个对象时,当对象大于分块时
当用户上传的对象大于分块时,被分解成一个大小等于条带大小的首对象,多个大小等于条带大小的中间对象,和一个小于等于条带大小的尾对象。
其中首对象以应用对象名称命名,在RGW网关中将该对象称为 head_obj,该对象的数据部分保存了RGW对象前rgw_max_chunk_size字节的数据,扩展属性部分保存了RGW对象的元数据信息 和 mainfest 信息。
中间对象和尾对象保存RGW对象剩余的数据
image.png
分段上传
分段上传一个对象时,RGW网关对象按照条带大小将每个分段分成多个RADOS对象,每个分段的:
第一个RADOS对象名称为: "_multipart_" + "用户上传对象名称" + "分段上传ID" + "分段编号",
其余对象的名称为: "_shadow_" + "用户上传的对象名称" + "分段上传ID" + "分段编号" + "_" + "条带编号",
当所有的分段上传对象完成之后,RGW会生成另外一个RADOS对象,用于保存对象元数据和所有分段的mainfest
image.png
实践
定位普通上传的对象
TODO
定位分片上传RGW对象
先用s3cmd 上传一个分片对象go 到 test bucket 中。
- 首先确定bucket 的 bucketindex
# radosgw-admin bucket stats test | grep id
"id": "98ce6ddc-de14-4b54-bab6-9233246c0670.14152.1",
-
根据bucketindex的id拼属性对象的名字,查找uploadid
-
先找到含有mainfest 属性的对象,格式为:{bucketindexid}_{objectname}
所以,我们这里对象名字为:98ce6ddc-de14-4b54-bab6-9233246c0670.14152.1_go -
获取manifest属性,利用dencoder可以解码出属性dencoder使用
# rados -p default.rgw.buckets.data listxattr 98ce6ddc-de14-4b54-bab6-9233246c0670.14152.1_go user.rgw.acl user.rgw.content_type user.rgw.etag user.rgw.idtag user.rgw.manifest user.rgw.pg_ver user.rgw.source_zone user.rgw.tail_tag user.rgw.x-amz-content-sha256 user.rgw.x-amz-date user.rgw.x-amz-meta-s3cmd-attrs # rados -p default.rgw.buckets.data getxattr 98ce6ddc-de14-4b54-bab6-9233246c0670.14152.1_go user.rgw.manifest > manifest.go.txt查找到uploadid 为
- 查找所有的multipart 和 shadow 文件
multipart 格式:
这里的就是:{bucketindexid}__multipart_{objectname}.{uploadid}.{partnumber}
98ce6ddc-de14-4b54-bab6-9233246c0670.14152.1__multipart_go.2~H4phPtiw2upIlezw_thHZYyYliWn5vc.1
...
shadow格式:
这里的就是:{bucketindexid}__shadow_{objectname}.{uploadid}.{partnumber}_{shardnum}
98ce6ddc-de14-4b54-bab6-9233246c0670.14152.1__shadow_go.2~H4phPtiw2upIlezw_thHZYyYliWn5vc.1_1
-
知道了分片对象怎么保存的,那么我们现在上传一个分片对象go2中途中止,就会发现:
image.png
从上面可以看出来,我们的分片成功上传了3片。
# rados -p default.rgw.buckets.index listomapkeys .dir.98ce6ddc-de14-4b54-bab6-9233246c0670.14152.1
image.png
圈出来的数据就是临时omap数据,上传失败或者取消了会存留下来。
其中的 2~H4phPtiw2upIlezw_thHZYyYliWn5vc 就是 uploadid
# rados -p default.rgw.buckets.non-ec ls
multpart.png
在这里,我们可以看出,这个bucket 记录的是分片对象上传中的中间产物(只涉及go2对象的,不涉及go对象)
# rados -p default.rgw.buckets.data stat 98ce6ddc-de14-4b54-bab6-9233246c0670.14152.1__multipart_go2.2~H4phPtiw2upIlezw_thHZYyYliWn5vc.1
image.png
image.png
我们使用s3 abort 的接口终止掉
# s3cmd abortmp s3://test/go2 2~H4phPtiw2upIlezw_thHZYyYliWn5vc -c ./s3cfg
image.png
在查看 rgw.buckets.non-ec bucket 时,已经没有数据。
image.png
不过,这里为什么 default.rgw.buckets.data 还有数据呢 ?








网友评论