ラージオブジェクト

ラージオブジェクト

お使いの Object Storage システムが、この機能をサポートするかどうかを確認する場合、発見可能性 を参照してください。または、サービスプロバイダーにお問い合わせください。

オブジェクトのコンテンツは、デフォルトで 5 GB より大きくできません。しかしながら、いくつかのより小さなオブジェクトを使用して、大きなオブジェクト (ラージオブジェクト) を組み立てることができます。ラージオブジェクトは、2 種類のオブジェクトから構成されます。

  • 分割オブジェクト は、オブジェクトのコンテンツを保存します。コンテンツを部品に分割して、各部品を自身の分割オブジェクトにアップロードします。分割オブジェクトは、特別な機能がありません。通常のオブジェクトと同じように、分割オブジェクトを作成、更新、ダウンロード、削除します。

  • マニフェストオブジェクト は、分割されたオブジェクトを 1 つの論理ラージオブジェクトに結びつけます。マニフェストオブジェクトをダウンロードすると、Object Storage は分割オブジェクトの内容を結合して応答ボディーで返します。この動作は GETHEAD のリクエストで返される応答ヘッダーにも適用されます。応答ヘッダー 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 リストから構成され、各要素は以下の属性を含みます。

path
CONTAINER_NAME/OBJECT_NAME 形式のコンテナー名とオブジェクト名。
etag
分割オブジェクトのコンテンツの MD5 チェックサム。この値は、オブジェクトの ETag と一致しなければいけません。
size_bytes
分割オブジェクトの容量。この値は、オブジェクトの 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 番目の部品をダウンロードできるままになっています。

ラージオブジェクトの部品のアップロード要求: HTTP

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-LengthContent-Type ヘッダーがリクエストに含まれていないことを意味します。

Unprocessable Entity (422) レスポンスコードは、ストレージシステムに書き込まれるデータの MD5 チェックサムが、オプションの ETag 値と一致しないことを意味します。

この例に示したように、マニフェストをアップロードする前に、部品をアップロードし続けることができます。

ラージオブジェクトの次の部品のアップロード要求: HTTP

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

次に、マニフェストをアップロードします。このマニフェストは、オブジェクトの部品が置かれるコンテナーを指定するものです。なお、マニフェスト作成後に追加の部品をアップロードした場合、結合したオブジェクトが大きくなりますが、その追加部品のためにマニフェストファイルを作成し直す必要はありません。

マニフェストのアップロード要求: HTTP

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

マニフェストのアップロード応答: HTTP

[...]

マニフェストに対する GETHEAD のリクエストでは、応答に 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-Objecttrue に設定されます。このメタデータを直接設定しません。代わりに、静的マニフェストオブジェクトを PUT するときに、システムが設定します。 X-Object-Manifest の値は CONTAINER/PREFIX です。分割オブジェクトが置かれている場所を表します。これを PUT 処理のリクエストヘッダーに指定します。
マニフェストオブジェクトのコピー COPY リクエストに ?multipart-manifest=get クエリー文字列を含めます。新しいオブジェクトは、元のものと同じマニフェストを持ちます。分割オブジェクトはコピーされません。代わりに、元のマニフェストと新しいマニフェストが、同じ分割オブジェクトのセットを共有します。 COPY 処理は、マニフェストオブジェクトを作成しません。マニフェストオブジェクトを複製する場合、GET 処理を使用して X-Object-Manifest の値を読み込み、この値を PUT 処理の X-Object-Manifest リクエストヘッダーに使用します。これにより、元のマニフェストオブジェクトと同じセットの分割オブジェクトを共有する、新しいマニフェストオブジェクトが作成されます。

python-swiftclient を用いたラージオブジェクトのアップロード

python-swiftclient を使用して、ラージオブジェクトを簡単にアップロードできます。

  • --segment-size または -S 引数を使用してセグメントサイズを指定することにより、ラージオブジェクトをアップロードします。

    $ swift upload CONTAINER OBJECT_FILENAME --segment-size <bytes>
    

    これにより、ファイルが希望するセグメントサイズに自動的に分割され、<container>_segments という名前のコンテナーにアップロードされます。

  • アップロードした後、ラージオブジェクトを単一ファイルとしてダウンロードすることもできます。

    $ swift download CONTAINER OBJECT_FILENAME
    
  • その他のラージオブジェクト関連の引数は、--help を使用して見つけられます。

    $ swift upload --help
    
Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.