存储大对象
使用分块上传时,IBM Cloud® Object Storage 可以支持的单个对象大小最大为 10 TB。
此外,大对象还可以使用启用 Aspera 高速传输的控制台来上传。 在大多数情况下,Aspera 高速传输能显著提高数据传输性能,尤其是针对长距离传输或在网络条件不稳定的情况下传输。
分块上传对象
要将较大的对象写入 Object Storage,建议使用分块上传操作。 单个对象的上传可作为一组分块来执行,这些分块可以按任意顺序独立地、并行上传。 上传完成后,Object Storage 会将所有分块显示为单个对象。 此方法有诸多优点:网络中断不会导致大型上传操作失败,在一段时间内上传可以暂停并重新启动,并且可以在对象创建期间上传对象。
分块上传仅可用于大于 5 MB 的对象。 对于小于 50 GB 的对象,建议的分块大小为 20 MB 到 100 MB,以实现最佳性能。 对于更大的对象,可以增大分块大小,而不会对性能产生重大影响。 分块上传限制为分块数不超过 10,000 个,每个分块 5 GB,最大对象大小为 10 TB。
由于管理和优化并行上传涉及的复杂性,许多开发者会使用提供分块上传支持的库。
大多数工具(例如,CLI 或 IBM Cloud 控制台)以及大多数兼容的库和 SDK 都将自动以分块上传方式传输对象。
使用 REST API 或 SDK
未完成的分块上传会一直持久存储,直到删除对象或中止分块上传。 如果未中止未完成的分块上传,那么分块上传会继续使用资源。 设计界面时应该谨记这一点,应清除未完成的分块上传。
分块上传对象分为三个阶段:
- 启动上传并创建
UploadId
。 - 上传各个分块,并指定对象的分块序号和
UploadId
。 - 上传所有分块完成后,通过发送包含
UploadId
和 XML 块(列出每个分块编号及其各自的Etag
值)的请求来完成上传。
有关端点的更多信息,请参阅端点和存储位置。
启动分块上传
向对象发出使用查询参数 POST
的 upload
请求会创建新的 UploadId
值,然后要上传的对象的每个分块都会引用此值。
语法
POST https://{endpoint}/{bucket-name}/{object-name}?uploads= # path style
POST https://{bucket-name}.{endpoint}/{object-name}?uploads= # virtual host style
示例请求
POST /some-bucket/multipart-object-123?uploads= HTTP/1.1
Authorization: Bearer {token}
Host: s3.us.cloud-object-storage.appdomain.cloud
示例响应
HTTP/1.1 200 OK
Date: Fri, 03 Mar 2017 20:34:12 GMT
X-Clv-Request-Id: 258fdd5a-f9be-40f0-990f-5f4225e0c8e5
Accept-Ranges: bytes
Server: Cleversafe/3.9.1.114
X-Clv-S3-Version: 2.5
Content-Type: application/xml
Content-Length: 276
<InitiateMultipartUploadResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Bucket>some-bucket</Bucket>
<Key>multipart-object-123</Key>
<UploadId>0000015a-95e1-4326-654e-a1b57887784f</UploadId>
</InitiateMultipartUploadResult>
上传部件
向对象发出使用查询参数 PUT
和 partNumber
的 uploadId
请求将上传对象的一个分块。 这些分块可以按序列上传,也可以并行上传,但必须按顺序编号。
语法
PUT https://{endpoint}/{bucket-name}/{object-name}?partNumber={sequential-integer}&uploadId={uploadId}= # path style
PUT https://{bucket-name}.{endpoint}/{object-name}?partNumber={sequential-integer}&uploadId={uploadId}= # virtual host style
示例请求
PUT /some-bucket/multipart-object-123?partNumber=1&uploadId=0000015a-df89-51d0-2790-dee1ac994053 HTTP/1.1
Authorization: Bearer {token}
Content-Type: application/pdf
Host: s3.us.cloud-object-storage.appdomain.cloud
Content-Length: 13374550
示例响应
HTTP/1.1 200 OK
Date: Sat, 18 Mar 2017 03:56:41 GMT
X-Clv-Request-Id: 17ba921d-1c27-4f31-8396-2e6588be5c6d
Accept-Ranges: bytes
Server: Cleversafe/3.9.1.114
X-Clv-S3-Version: 2.5
ETag: "7417ca8d45a71b692168f0419c17fe2f"
Content-Length: 0
完成分块上传
向对象发出使用查询参数 POST
并且主体中包含相应 XML 块的 uploadId
请求将完成分块上传。
语法
POST https://{endpoint}/{bucket-name}/{object-name}?uploadId={uploadId}= # path style
POST https://{bucket-name}.{endpoint}/{object-name}?uploadId={uploadId}= # virtual host style
<CompleteMultipartUpload>
<Part>
<PartNumber>{sequential part number}</PartNumber>
<ETag>{ETag value from part upload response header}</ETag>
</Part>
</CompleteMultipartUpload>
示例请求
POST /some-bucket/multipart-object-123?uploadId=0000015a-df89-51d0-2790-dee1ac994053 HTTP/1.1
Authorization: Bearer {token}
Content-Type: text/plain; charset=utf-8
Host: s3.us.cloud-object-storage.appdomain.cloud
Content-Length: 257
<CompleteMultipartUpload>
<Part>
<PartNumber>1</PartNumber>
<ETag>"7417ca8d45a71b692168f0419c17fe2f"</ETag>
</Part>
<Part>
<PartNumber>2</PartNumber>
<ETag>"7417ca8d45a71b692168f0419c17fe2f"</ETag>
</Part>
</CompleteMultipartUpload>
示例响应
HTTP/1.1 200 OK
Date: Fri, 03 Mar 2017 19:18:44 GMT
X-Clv-Request-Id: c8be10e7-94c4-4c03-9960-6f242b42424d
Accept-Ranges: bytes
Server: Cleversafe/3.9.1.114
X-Clv-S3-Version: 2.5
ETag: "765ba3df36cf24e49f67fc6f689dfc6e-2"
Content-Type: application/xml
Content-Length: 364
<CompleteMultipartUploadResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Location>http://s3.us.cloud-object-storage.appdomain.cloud/zopse/multipart-object-123</Location>
<Bucket>some-bucket</Bucket>
<Key>multipart-object-123</Key>
<ETag>"765ba3df36cf24e49f67fc6f689dfc6e-2"</ETag>
</CompleteMultipartUploadResult>
中止未完成的分块上传
向对象发出使用查询参数 DELETE
的 uploadId
请求将删除分块上传中所有未完成的分块。
语法
DELETE https://{endpoint}/{bucket-name}/{object-name}?uploadId={uploadId}= # path style
DELETE https://{bucket-name}.{endpoint}/{object-name}?uploadId={uploadId}= # virtual host style
示例请求
DELETE /some-bucket/multipart-object-123?uploadId=0000015a-df89-51d0-2790-dee1ac994053 HTTP/1.1
Authorization: Bearer {token}
Host: s3.us.cloud-object-storage.appdomain.cloud
示例响应
HTTP/1.1 204 No Content
Date: Thu, 16 Mar 2017 22:07:48 GMT
X-Clv-Request-Id: 06d67542-6a3f-4616-be25-fc4dbdf242ad
Accept-Ranges: bytes
Server: Cleversafe/3.9.1.114
X-Clv-S3-Version: 2.5
使用 S3cmd (CLI)
S3cmd 是免费的 Linux 和 Mac 命令行工具和客户机,用于上载,检索和管理使用 S3 协议的云存储服务提供者中的数据。 S3cmd 专为熟悉命令行程序的高级用户而设计,非常适合批处理脚本和自动备份。 S3cmd 是用 Python 编写的。 这是一个开放式源代码项目,依据 GNU Public License V2 (GPLv2) 提供,免费供商业和私人使用。
S3cmd 需要 Python 2.6 或更高版本,并且与 Python 3 兼容。 安装 S3cmd 的最简单方法是使用 Python Package Index (PyPi)。
pip install s3cmd
安装软件包后,在 此处 抓取 IBM Cloud® Object Storage 示例配置文件,并使用 Cloud Object Storage (S3) 凭证对其进行更新:
$ wget -O $HOME/.s3cfg https://gist.githubusercontent.com/greyhoundforty/676814921b8f4367fba7604e622d10f3/raw/422abaeb70f1c17cd5308745c0e446b047c123e0/s3cfg
需要更新的四行如下:
access_key
secret_key
host_base
host_bucket
{: S3cmd} 无论是使用示例文件还是使用通过运行s3cmd --configure
生成的文件,都需要更新这四行。
在客户门户网站中使用 COS 详细信息更新了这些行后,就可以通过发出 s3cmd ls
命令来测试连接,这将列出帐户上的所有存储区。
$ s3cmd ls
2017-02-03 14:52 s3://backuptest
2017-02-06 15:04 s3://coldbackups
2017-02-03 21:23 s3://largebackup
2017-02-07 17:44 s3://winbackup
s3tools 站点上提供了选项和命令的完整列表以及基本用法信息。
使用 S3cmd 分块上传
尝试上传大于指定阈值的文件时,put
命令会自动运行分块上传。
s3cmd put FILE [FILE...] s3://BUCKET[/PREFIX]
阈值由 --multipart-chunk-size-mb
选项确定:
--multipart-chunk-size-mb=SIZE
Size of each chunk of a multipart upload. Files bigger
than SIZE are automatically uploaded as multithreaded-
multipart, smaller files are uploaded using the
traditional method. SIZE is in megabytes, default
chunk size is 15MB, minimum allowed chunk size is 5MB,
maximum is 5GB.
示例:
s3cmd put bigfile.pdf s3://backuptest/bigfile.pdf --multipart-chunk-size-mb=5
输出:
upload: 'bigfile.pdf' -> 's3://backuptest/bigfile.pdf' [part 1 of 4, 5MB] [1 of 1]
5242880 of 5242880 100% in 2s 1731.92 kB/s done
upload: 'bigfile.pdf' -> 's3://backuptest/bigfile.pdf' [part 2 of 4, 5MB] [1 of 1]
5242880 of 5242880 100% in 2s 2001.14 kB/s done
upload: 'bigfile.pdf' -> 's3://backuptest/bigfile.pdf' [part 3 of 4, 5MB] [1 of 1]
5242880 of 5242880 100% in 2s 2000.28 kB/s done
upload: 'bigfile.pdf' -> 's3://backuptest/bigfile.pdf' [part 4 of 4, 4MB] [1 of 1]
4973645 of 4973645 100% in 2s 1823.51 kB/s done
使用 Java SDK
Java SDK 提供了两种运行大对象上传的方法:
使用 Python SDK
Python SDK 提供了两种运行大对象上传的方法:
使用 Node.js SDK
Node.js SDK 提供了一种运行大对象上传的方法: