RGW 数据组织之 object

2024-02-24  本文已影响0人  wayyyy

应用上传的对象包括数据和元数据两部分,数据部分保存在一个或多个RADOS对象的数据部分中,元数据保存在其中1个rados 对象的扩展属性中。RGW 对单个对象提供了两种上传接口:整体上传 和 分段上传。不同的上传接口RGW对象和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 中。

  1. 首先确定bucket 的 bucketindex
# radosgw-admin bucket stats test | grep id
  "id": "98ce6ddc-de14-4b54-bab6-9233246c0670.14152.1",
  1. 根据bucketindex的id拼属性对象的名字,查找uploadid

    1. 先找到含有mainfest 属性的对象,格式为:{bucketindexid}_{objectname}
      所以,我们这里对象名字为:98ce6ddc-de14-4b54-bab6-9233246c0670.14152.1_go

    2. 获取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 为

    1. 查找所有的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 还有数据呢 ?

上一篇 下一篇

猜你喜欢

热点阅读