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

ceph-rgw数据上传学习(三)(分段上传)

2023-10-11 03:24:42
150
0

分段上传一个数据文件的时候,需要分三个步骤和过程:初始化分段上传InitMultipart,分段上传PUT,完成分段上传CompleteMultipart。

初始化分段上传(InitMultipart):在这个过程中,RGW会创建一个全局唯一的UploadID返回给用户,这个UploadID用于标识后续所有跟这次分段上传相关的操作。其次RGW还会在{zone}.rgw.buckets.non-ec这个pool池中写入一个multipart_{ObjectName}.{UploadID}.meta对象,这个对象叫做分片上传的临时元数据对象,他主要用于后续跟踪和管理分段上传的会话信息。

分段上传(PUT):这个过程,其实和原子上传的过程类似,都是将用户上传的分段数据存储到{zone}.rgw.buckets.data这个Pool中去。但是不同与原子上传的是,分段上传过程中写入的第一个对象名为{Ns}{ObjectName}.{UploadID}.{PartNum},后续中间和最后写入的对象名都为{Ns}{ObjectName}.{UploadID}.{PartNum}_{StripeNO}。其次在每个分段完成的时候,会话的属性信息Attr,这次分段实际写入的数据大小,等等信息都会被更新到FirstObject的元数据信息里面。同时还会更新桶索引。最后还会将分段过程中生成的manifest信息和其他属性信息(例如etag等等)放入到RGWUploadPartInfo结构中,然后打包以OMAP的形式更新写入到之前初始化分段上传时写入的那个临时元数据对象中去。其中OMAP的key为:part.{PartNum},value为RGWUploadPartInfo的值 。(原子上传过程中第一个数据对象我们叫HeadObject,为了和这个名称做区分,我们把每个分段上传过中生成的第一个rados数据对象叫做FirstObject。)

完成分段上传(CompleteMultipart):从临时元数据对象处读取相关的数据信息,例如分段上传过程中包含Manifest的RGWUploadPartInfo信息,然后会对分段数据的etag和partNum进行校验,然后再合并分段上传过程中的Manifest,生成一个新的Manifest信息,最后向数据存储池rgw.buckets.data中写入一个{ObjectName}对象,这个对象才是最终真正的HeadObject,且该对象的meta会带Manifest等信息,在写入这个对象的时候,还需要将之前更新到桶索引列表中的各个FirstObject从索引信息列表中删除,最后再删除之前的临时元数据对象。

最终的数据存储形式和结构:

0条评论
作者已关闭评论
李****平
5文章数
0粉丝数
李****平
5 文章 | 0 粉丝
原创

ceph-rgw数据上传学习(三)(分段上传)

2023-10-11 03:24:42
150
0

分段上传一个数据文件的时候,需要分三个步骤和过程:初始化分段上传InitMultipart,分段上传PUT,完成分段上传CompleteMultipart。

初始化分段上传(InitMultipart):在这个过程中,RGW会创建一个全局唯一的UploadID返回给用户,这个UploadID用于标识后续所有跟这次分段上传相关的操作。其次RGW还会在{zone}.rgw.buckets.non-ec这个pool池中写入一个multipart_{ObjectName}.{UploadID}.meta对象,这个对象叫做分片上传的临时元数据对象,他主要用于后续跟踪和管理分段上传的会话信息。

分段上传(PUT):这个过程,其实和原子上传的过程类似,都是将用户上传的分段数据存储到{zone}.rgw.buckets.data这个Pool中去。但是不同与原子上传的是,分段上传过程中写入的第一个对象名为{Ns}{ObjectName}.{UploadID}.{PartNum},后续中间和最后写入的对象名都为{Ns}{ObjectName}.{UploadID}.{PartNum}_{StripeNO}。其次在每个分段完成的时候,会话的属性信息Attr,这次分段实际写入的数据大小,等等信息都会被更新到FirstObject的元数据信息里面。同时还会更新桶索引。最后还会将分段过程中生成的manifest信息和其他属性信息(例如etag等等)放入到RGWUploadPartInfo结构中,然后打包以OMAP的形式更新写入到之前初始化分段上传时写入的那个临时元数据对象中去。其中OMAP的key为:part.{PartNum},value为RGWUploadPartInfo的值 。(原子上传过程中第一个数据对象我们叫HeadObject,为了和这个名称做区分,我们把每个分段上传过中生成的第一个rados数据对象叫做FirstObject。)

完成分段上传(CompleteMultipart):从临时元数据对象处读取相关的数据信息,例如分段上传过程中包含Manifest的RGWUploadPartInfo信息,然后会对分段数据的etag和partNum进行校验,然后再合并分段上传过程中的Manifest,生成一个新的Manifest信息,最后向数据存储池rgw.buckets.data中写入一个{ObjectName}对象,这个对象才是最终真正的HeadObject,且该对象的meta会带Manifest等信息,在写入这个对象的时候,还需要将之前更新到桶索引列表中的各个FirstObject从索引信息列表中删除,最后再删除之前的临时元数据对象。

最终的数据存储形式和结构:

文章来自个人专栏
ceph-rgw学习笔记
5 文章 | 1 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0