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