多段上传
多段上传允许将单个对象作为一组段分别上传。每个段都是对象数据的连续部分。您可以独立上传以及按任意顺序上传这些对象的段。如果其中某个段传输失败,可以重新传输该段且不会影响其他段。当对象的所有段都上传后,OBS将这些段合并起来,然后创建对象。一般而言,如果您的对象大小达到了100MB,您应该考虑使用多段上传,而不是在单个操作中上传对象。例如:您有1个500MB大小的对象,需要上传到OBS桶中,您可以使用OBS Browser+工具进行多段上传,此工具会将该对象自动切分为多个小对象进行上传;或者使用OBS提供的多段上传API进行上传,最大程度提高上传效率同时避免您的任务失败。
使用多段上传可提供以下优势:
- 提高吞吐量:您可以并行上传段以提高吞吐量。
- 从任何网络问题中快速恢复:较小的段大小可以将由于网络错误而需重启失败的上传所产生的影响降至最低。
- 暂停和恢复对象上传:您可以随时上传对象段。启动多段上传后,不存在过期期限;您必须显式地完成或取消多段上传任务。
- 在得知最终对象大小之前开始上传:您可以在创建对象的同时上传对象。
多段上传API允许您多段上传大型对象。您可以使用此API上传新的大型对象或创建现有对象的副本。
多段上传有三个步骤:开始上传(初始化上传段任务)、上传每个段,完成多段上传(合并段)。收到合并段请求后,OBS将构建由上传的段组成的对象,然后您可以像在您的桶中访问任何其他对象一样访问该对象。
您可以列出所有正在进行的多段上传任务,或获取特定多段上传任务已上传的段列表。以上每个操作都在本节中进行了说明。
初始化上传段任务
当您发送请求以开始多段上传时,OBS将返回具有上传ID的响应,此ID是多段上传的唯一标识符。无论您何时上传段、列举已上传的段、合并段或取消多段上传任务,您都必须包括此上传ID。
上传段
上传段时,除了指定上传ID,还必须指定段编号。您可以选择1和10000之间的任意段编号。段编号在您正在上传的对象中唯一地标示了段及其位置。如果您使用之前上传的段的同一段编号上传新段,则之前上传的段将被覆盖。无论您何时上传段,OBS都将在其响应中返回ETag标头。对于每个段上传任务,您必须记录每个段编号和ETag值。您需要在随后的请求中包括这些值以完成多段上传。
初始化上传段任务并上传一个或多个段之后,您必须合并段或取消多段上传任务,才能停止收取上传的段的存储费用。仅当在合并段或取消多段上传任务之后,OBS才释放段存储并停止向您收取段存储费用。
多并发上传同一对象的同一段时,服务端遵循Last Write Win策略,但“Last Write”的时间定义为段元数据创建时间。为了保证数据准确性,客户端需要加锁保证同一对象的同名段上传的并发性。同一对象的不同段并发上传不需要加锁。
拷贝段
多段上传任务创建后,用户可以通过指定多段上传任务号,为特定的任务上传段。添加段的方式还包括调用段拷贝接口。允许客户将已上传对象的一部分或全部拷贝为段。
拷贝段的结果不能仅根据HTTP返回头域中的status_code来判断请求是否成功,头域中status_code返回200时表示服务端已经收到请求,且开始处理拷贝段请求。拷贝是否成功会在响应消息的body中,只有body体中有ETag标签才表示成功,否则表示拷贝失败。
将源对象object拷贝为一个段part1,如果在拷贝操作之前part1已经存在,拷贝操作执行之后老段数据part1会被新拷贝的段数据覆盖。拷贝成功后,只能列举到最新的段part1,老段数据将会被删除。因此在使用拷贝段接口时请确保目标段不存在或者已无价值,避免因拷贝段导致数据误删除。拷贝过程中源对象object无任何变化。
合并段和取消多段上传任务
合并段时,OBS通过按升序的段编号规范化多段来创建对象。如果在初始化上传段任务中提供了任何对象元数据,则OBS会将该元数据与对象相关联。成功完成请求后,段将不再存在。合并段请求必须包括上传ID以及段编号和相应的ETag值的列表。OBS响应包括可唯一地识别组合对象数据的ETag。此ETag无需成为对象数据的MD5哈希。您可以选择取消多段上传任务,取消多段上传任务之后无法再次使用该上传ID上传任何段。然后,OBS将释放被取消的多段上传任务中的每个段数据的所有存储。如果任何多段上传已在进行中,即使您已执行中止操作,它们仍可以上传成功或失败。如果要释放所有分段使用的所有存储,必须在完成所有多段上传后再取消多段上传任务。
如果上传了10个段,但合并时只选择了9个段进行合并,那么未被合并的段将会被系统自动删除,未被合并的段删除后不能恢复。在进行合并之前请使用列出已上传的段接口进行查询,仔细核对所有段,确保没有段被遗漏。
列举已上传的段
您可以列出特定多段上传任务或所有正在进行的多段上传任务的分段。列举已上传的段操作将返回您已为特定多段上传任务而上传的段信息。对于每个列举已上传的段请求,OBS将返回有关特定多段上传任务的分段信息,最多为1000个分段。如果多段上传中的段超过1000个,您必须发送一系列列举已上传的段请求以检索所有段。请注意,返回的分段列表不包括已合并的分段。
仅使用返回的列表进行验证。发送完成多段上传请求时,您不应使用此列表的结果。但是,当上传段和OBS返回的相应的ETag值时,将保留您自己的指定段编号的列表。
列举多段上传任务
通过列举桶中的多段上传任务,您可以获得已初始化多段上传任务的列表,已初始化多段上传任务是指初始化后还未合并以及未取消的多段上传任务。每个请求将返回最多1000个多段上传任务,如果正在进行的多段上传任务超过1000个,您需要发送其他请求以检索剩余的多段上传任务。
列举多段上传任务的限制如表1所示:
多段上传API和权限
用户必须具有使用多段上传操作的所需权限。您可以使用ACL、桶策略或用户策略来授予用户以执行这些操作的权限。下表列出了使用ACL、桶策略或用户策略时,各种多段上传操作的所需权限。
操作 |
所需权限 |
---|---|
初始化上传段任务 |
您必须要有执行PutObject操作的权限,才能初始化上传段任务。 桶所有者可以允许其他委托人执行PutObject。 |
上传段 |
您必须要有执行PutObject操作的权限,才能上传段。 仅多段上传任务的发起者可以上传段。桶所有者必须赋予多段任务发起者执行PutObject操作的权限,以便发起者可以上传该对象的段。 |
拷贝段 |
您必须要有执行PutObject操作的权限,同时因为您正在将一个已存在的对象作为一个段来上传,因此您也必须要有对拷贝源对象执行GetObject操作的权限才可以拷贝段。 仅多段上传任务的发起者可以拷贝段。桶所有者必须赋予多段任务发起者对对象执行PutObject操作的权限,以便发起者可以上传该对象的段。 |
合并段 |
您必须要有执行PutObject操作的权限,才能进行合并段操作。 仅多段上传任务的发起者可以合并段。桶所有者必须赋予多段任务发起者对对象执行PutObject操作的权限,以便发起者可以完成该对象的多段上传。 |
取消多段上传任务 |
您必须要有执行AbortMultipartUpload操作的权限,才能取消多段上传任务。 默认情况下,允许桶所有者和多段上传任务的发起者执行此操作。除了这些默认情况之外,桶所有者可以允许其他委托人对对象执行AbortMultipartUpload操作。桶所有者可以拒绝任何委托人,使其无法执行AbortMultipartUpload操作。 |
列举已上传的段 |
您必须得到可以执行ListMultipartUploadParts操作的权限,才能在多段上传中列举已上传的段。 在默认情况下,桶所有者有权为任何针对桶的多段上传列举已上传的段。多段上传任务的发起人有权为特定多段上传列举已上传的段。 除了这些默认情况之外,桶所有者可以允许其他委托人对对象执行ListMultipartUploadParts操作。桶所有者也可以拒绝任何委托人,使其无法执行ListMultipartUploadParts操作。 |
列举多段上传任务 |
您必须得到可以对桶执行ListBucketMultipartUploads操作的权限,才能列出正在上传到该桶的多段上传。 除了默认情况之外,桶所有者可以允许其他委托人对桶执行ListBucketMultipartUploads操作。 |
使用适用于多段上传的REST API
对象存储服务API参考中的以下章节介绍适用于多段上传的REST API。
- 列举桶中已初始化多段任务
- 初始化上传段任务
- 上传段
- 拷贝段
- 列举已上传的段
- 合并段
- 取消多段上传任务