お使いの Object Storage システムが、この機能をサポートするかどうかを確認する場合、発見可能性 を参照してください。または、サービスプロバイダーにお問い合わせください。
オブジェクトのコンテンツは、デフォルトで 5 GB より大きくできません。しかしながら、いくつかのより小さなオブジェクトを使用して、大きなオブジェクト (ラージオブジェクト) を組み立てることができます。ラージオブジェクトは、2 種類のオブジェクトから構成されます。
分割オブジェクト
は、オブジェクトのコンテンツを保存します。コンテンツを部品に分割して、各部品を自身の分割オブジェクトにアップロードします。分割オブジェクトは、特別な機能がありません。通常のオブジェクトと同じように、分割オブジェクトを作成、更新、ダウンロード、削除します。
マニフェストオブジェクト
は、分割されたオブジェクトを 1 つの論理ラージオブジェクトに結びつけます。マニフェストオブジェクトをダウンロードすると、Object Storage は分割オブジェクトの内容を結合して応答ボディーで返します。この動作は GET
と HEAD
のリクエストで返される応答ヘッダーにも適用されます。応答ヘッダー Content-Length
の値は、全分割オブジェクトの合計サイズになります。
Object Storage は、ETag
レスポンスヘッダー値を計算するために、各セグメントの ETag
値を受け取り、それらを 1 つにまとめて、その結果の MD5 チェックサムを返します。マニフェストオブジェクト種別は以下のとおりです。
マニフェストオブジェクトの内容は、JSON 形式の分割オブジェクトの名前の順序付き一覧です。詳細は 静的ラージオブジェクト を参照してください。
マニフェストオブジェクトは、コンテンツを持ちませんが、X-Object-Manifest
メタデータヘッダーを持ちます。このヘッダーの値は CONTAINER/PREFIX
です。この CONTAINER
は、分割オブジェクトが保存されているコンテナーの名前です。また、PREFIX
は、すべての分割オブジェクトが共通に持つ文字列です。詳細は 動的ラージオブジェクト を参照してください。
注釈
ソースとしてマニフェストオブジェクトを使用して COPY
リクエストを実行する場合、新しいオブジェクトは通常オブジェクトになります。分割オブジェクトにはなりません。ソースの分割オブジェクトの合計容量が 5 GB を超えている場合、COPY
リクエストが失敗します。しかしながら、マニフェストオブジェクトを重複させることができ、この新しいオブジェクトは 5 GB より大きくできます。
静的ラージオブジェクトを作成する場合、コンテンツを部品に分割し、各部品を含む分割オブジェクトを作成 (アップロード) します。
PUT
処理が返す ETag
応答ヘッダー値を記録する必要があります。代わりに、アップロード前にそのセグメントの MD5 チェックサムを計算して、これを ETag
リクエストヘッダーに含めることもできます。このアクションにより、アップロードしたデータが破損していないことを保証できます。
順番に各分割オブジェクトの名前、容量、MD5 チェックサムを一覧表示します。
マニフェストオブジェクトを作成します。マニフェストオブジェクトの最後に ?multipart-manifest=put
クエリー文字列を含め、これがマニフェストオブジェクトであることを示します。
マニフェストオブジェクトの PUT
リクエストのボディーは JSON リストから構成され、各要素は以下の属性を含みます。
CONTAINER_NAME/OBJECT_NAME
形式のコンテナー名とオブジェクト名。ETag
と一致しなければいけません。Content-Length
と一致しなければいけません。この例は、3 分割したオブジェクトを示します。いくつかのコンテナーを使用できます。また、オブジェクト名は、動的ラージオブジェクトと異なり、特別なパターンに従う必要がありません。
[
{
"path": "mycontainer/objseg1",
"etag": "0228c7926b8b642dfb29554cd1f00963",
"size_bytes": 1468006
},
{
"path": "mycontainer/pseudodir/seg-obj2",
"etag": "5bfc9ea51a00b790717eeb934fb77b9b",
"size_bytes": 1572864
},
{
"path": "other-container/seg-final",
"etag": "b9c3da507d2557c1ddc51f27c54bae51",
"size_bytes": 256
}
]
Content-Length
リクエストヘッダーには、JSON コンテンツのサイズが入っている必要があります。分割オブジェクトの大きさではありません。しかしながら、PUT
処理の完了後は、Content-Length
メタデータが、すべての分割オブジェクトの合計サイズに設定されます。同じような状況が ETag
にも当てはまります。PUT
処理で使用される場合、JSON コンテンツの MD5 チェックサムを含める必要があります。 PUT
処理が完了すると、ETag
メタデータの値は、オブジェクトの部品の ETag
値を結合したものの MD5 チェックサムに設定されます。Content-Type
リクエストヘッダーとオブジェクトのカスタムメタデータを設定することもできます。
PUT
処理に ?multipart-manifest=put
クエリーパラメーターがある場合、リクエストボディーを読み込み、各分割オブジェクトが存在し、その容量が ETag に一致することが検証されます。一致しない場合、PUT
処理が失敗します。
すべてが一致すると、API はマニフェストオブジェクトを作成し、X-Static-Large-Object
メタデータを true
に設定して、マニフェストオブジェクトが静的オブジェクトのマニフェストであることを示します。
通常、マニフェストオブジェクトに GET
処理を実行するとき、レスポンスボディーは、分割オブジェクトのコンテンツを結合したものを含みます。マニフェスト一覧をダウンロードするために、?multipart-manifest=get
クエリーパラメーターを使用します。レスポンスにある一覧は、通常 PUT
処理に使用するマニフェストと同じように整形されていません。
マニフェストオブジェクトに DELETE
処理を実行すると、マニフェストオブジェクトが削除されます。分割オブジェクトは影響を受けません。しかしながら、?multipart-manifest=delete
クエリーパラメーターを追加すると、分割オブジェクトが削除されます。また、すべてが正常に削除されると、マニフェストオブジェクトも削除されます。
マニフェストを変更する場合、PUT
処理に ?multipart-manifest=put
クエリーパラメーターを付けて実行します。このリクエストは、マニフェストオブジェクトを作成します。オブジェクトマニフェストを通常の方法で更新することもできます。
5 GB より大きいオブジェクトをアップロードする前に、ユーザーはそのオブジェクトを分割する必要があります。他のオブジェクトと同様に分割オブジェクトをアップロードして、動的ラージマニフェストオブジェクトを作成します。マニフェストオブジェクトは、ラージオブジェクトを構成する分割オブジェクトを検索する方法を Object Storage に知らせます。分割オブジェクトに個別にアクセスできますが、マニフェストオブジェクトを取得する際には API は分割オブジェクトを結合します。1 つのラージオブジェクトには任意の数の分割オブジェクトを含めることができます。
ダウンロードをきちんと動作させるために、すべての分割オブジェクトを同じコンテナーにアップロードして、各オブジェクトの名前に同じ方法でプレフィックスを付ける必要があります。これにより、結合されるべき順番で並び替えられます。
マニフェストファイルも作成してアップロードします。マニフェストファイルは、追加の X-Object-Manifest
CONTAINER/PREFIX
ヘッダーを持つ 0 バイトのファイルです。この CONTAINER
は、オブジェクトの部品が置かれるコンテナーです。PREFIX
は、すべての部品に共通のプレフィックスです。X-Object-Manifest
ヘッダーにあるコンテナーと共通プレフィックスを UTF-8 エンコードして URL エンコードする必要があります。
まず、すべての部品をアップロードして、マニフェストを作成または更新する方法が最良です。完全なオブジェクトは、アップロードが完了するまでダウンロードすることができません。また、新しいセットの部品を 2 番目の場所にアップロードして、この場所を指し示すようにマニフェストを更新できます。新しい部品のアップロード中は、元のマニフェストが 1 番目の部品をダウンロードできるままになっています。
PUT /API_VERSION/ACCOUNT/CONTAINER/OBJECT HTTP/1.1
Host: storage.example.com
X-Auth-Token: eaaafd18-0fed-4b3a-81b4-663c99ec1cbb
ETag: 8a964ee2a5e88be344f36c22562a6486
Content-Length: 1
X-Object-Meta-PIN: 1234
レスポンスのボディーはありません。
2``nn`` レスポンスコードは、正常書き込みを意味します。 nn
は 00 から 99 までの値です。
Length Required (411)
レスポンスコードは、必要な Content-Length
や Content-Type
ヘッダーがリクエストに含まれていないことを意味します。
Unprocessable Entity (422)
レスポンスコードは、ストレージシステムに書き込まれるデータの MD5 チェックサムが、オプションの ETag 値と一致しないことを意味します。
この例に示したように、マニフェストをアップロードする前に、部品をアップロードし続けることができます。
PUT /API_VERSION/ACCOUNT/CONTAINER/OBJECT HTTP/1.1
Host: storage.example.com
X-Auth-Token: eaaafd18-0fed-4b3a-81b4-663c99ec1cbb
ETag: 8a964ee2a5e88be344f36c22562a6486
Content-Length: 1
X-Object-Meta-PIN: 1234
次に、マニフェストをアップロードします。このマニフェストは、オブジェクトの部品が置かれるコンテナーを指定するものです。なお、マニフェスト作成後に追加の部品をアップロードした場合、結合したオブジェクトが大きくなりますが、その追加部品のためにマニフェストファイルを作成し直す必要はありません。
PUT /API_VERSION/ACCOUNT/CONTAINER/OBJECT HTTP/1.1
Host: storage.clouddrive.com
X-Auth-Token: eaaafd18-0fed-4b3a-81b4-663c99ec1cbb
Content-Length: 0
X-Object-Meta-PIN: 1234
X-Object-Manifest: CONTAINER/PREFIX
[...]
マニフェストに対する GET
や HEAD
のリクエストでは、応答に Content-Type
ヘッダー値が返されます。 Content-Type
の値はマニフェストを作成した PUT
リクエストの Content-Type
リクエストヘッダー値と同じになります。 Content-Type
を変更するには、 PUT
リクエストを再発行します。
ラージオブジェクトのアップロードや他の Object Storage のトランザクションで発生したエラーのデバッグの助けとなるように、 X-Trans-Id-Extra
リクエストヘッダーを使って追加情報を含めることができます。
Object Storage API は、 X-Trans-Id-Extra
リクエストヘッダーの値の最初の 32 文字を、生成する X-Trans-Id
レスポンスヘッダーのトランザクション ID 値に追加します。 X-Trans-Id-Extra
リクエストヘッダーに値を指定する前に、追加のトランザクション情報は UTF-8 エンコードと URL エンコードを行わなければいけません。
例えば、イメージなどのラージオブジェクトをアップロードする際に追加のトランザクション情報を含めることができます。
各セグメントとマニフェストをアップロードする際、 X-Trans-Id-Extra
リクエストヘッダーに同じ値を指定します。エラーが発生した場合、 Object Storage のログからそのラージオブジェクトのアップロードに関連する全リクエストを見つけることができます。
また X-Trans-Id-Extra
はオペレーターが応答を受信できなかったリクエストのデバッグを行う際にも役立ちます。オペレーターはログで追加情報を検索できます。
静的オブジェクトと動的オブジェクトは同じような動作をしますが、この表は違いを説明しています。
説明 | 静的ラージオブジェクト | 動的ラージオブジェクト |
---|---|---|
エンド間の完全性 | 保証されます。部品の一覧は、各部品の MD5 チェックサム (ETag ) を含みます。一覧にある ETag がアップロードされる分割オブジェクトと異なる場合、マニフェストオブジェクトをアップロードできません。部品が何かしら失われていると、マニフェストオブジェクトのダウンロード試行は、エラーになります。 |
保証されません。結果整合性モデルは、分割オブジェクトをアップロードした後も、しばらくコンテナー一覧に表示されないかもしれないことを意味します。マニフェストがコンテナーに表示される前に、それをダウンロードすると、GET リクエストの応答に返された内容に入っていないかもしれません。 |
アップロード順番 | マニフェストオブジェクトをアップロードする前に、分割オブジェクトをアップロードする必要があります。 | マニフェストと分割オブジェクトを任意の順番でアップロードできます。マニフェストの早期ダウンロードに備えて、部品をアップロードした後、マニフェストオブジェクトをアップロードすることを推奨します。しかしながら、これは強制ではありません。 |
分割オブジェクトの削除または追加 | マニフェストオブジェクトから分割オブジェクトを追加したり削除したりできません。しかしながら、別のマニフェスト一覧を持つ、同じ名前の完全に新しいマニフェストオブジェクトを作成することはできます。 | 新しい分割オブジェクトをアップロードしたり、既存の部品を削除したりできます。名前は X-Object-Manifest に指定された PREFIX になります。 |
分割オブジェクトの容量および数量 | 分割オブジェクトは、デフォルトで最小 1 MB である必要があります。最後の分割オブジェクトは、任意の大きさにできます。最大 1000 分割がデフォルトでサポートされます。 | 分割オブジェクトは任意の容量にできます。 |
分割オブジェクトのコンテナー名 | マニフェスト一覧は、各オブジェクトのコンテナー名を表します。分割オブジェクトは、別々のコンテナーに置けます。 | 分割オブジェクトは、すべて同じにコンテナーになければいけません。 |
マニフェストオブジェクトメタデータ | このオブジェクトは、X-Static-Large-Object が true に設定されます。このメタデータを直接設定しません。代わりに、静的マニフェストオブジェクトを PUT するときに、システムが設定します。 |
X-Object-Manifest の値は CONTAINER/PREFIX です。分割オブジェクトが置かれている場所を表します。これを PUT 処理のリクエストヘッダーに指定します。 |
マニフェストオブジェクトのコピー | COPY リクエストに ?multipart-manifest=get クエリー文字列を含めます。新しいオブジェクトは、元のものと同じマニフェストを持ちます。分割オブジェクトはコピーされません。代わりに、元のマニフェストと新しいマニフェストが、同じ分割オブジェクトのセットを共有します。 |
COPY 処理は、マニフェストオブジェクトを作成しません。マニフェストオブジェクトを複製する場合、GET 処理を使用して X-Object-Manifest の値を読み込み、この値を PUT 処理の X-Object-Manifest リクエストヘッダーに使用します。これにより、元のマニフェストオブジェクトと同じセットの分割オブジェクトを共有する、新しいマニフェストオブジェクトが作成されます。 |
python-swiftclient
を使用して、ラージオブジェクトを簡単にアップロードできます。
--segment-size
または -S
引数を使用してセグメントサイズを指定することにより、ラージオブジェクトをアップロードします。
$ swift upload CONTAINER OBJECT_FILENAME --segment-size <bytes>
これにより、ファイルが希望するセグメントサイズに自動的に分割され、<container>_segments
という名前のコンテナーにアップロードされます。
アップロードした後、ラージオブジェクトを単一ファイルとしてダウンロードすることもできます。
$ swift download CONTAINER OBJECT_FILENAME
その他のラージオブジェクト関連の引数は、--help
を使用して見つけられます。
$ swift upload --help
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.