第 5 章 マルチパートオブジェクト

オブジェクトは 1 つあたりのサイズに 5GB までという制限があり、5GB を超える場合は複数のオブジェクトに分割して保存する必要があります。Swift は、このように複数に分割して保存されたオブジェクト群を、あたかも一つのオブジェクトであるように扱うための機能を備えています。
この機能を利用するための手順と条件は以下の通りです。

 

  • これら分割後のオブジェクトは、共通プレフィクスから始まる名前を持っていなければならない。
  • 分割後のオブジェクト群を、オブジェクト名で辞書順に並べたものが、分割順序に一致しなければならない。
  • 分割後のオブジェクト群を代表するメタオブジェクトを作成する。このオブジェクトは、マニフェストファイルと呼ばれる。

マニフェストファイルは、通常のオブジェクトと同じく、マニフェストファイルとなるオブジェクトを指定して、PUT リクエストを送ることにより作成します。通常のオブジェクト作成時の PUT リクエストと異なるのは、次の拡張ヘッダを指定するという点です。

X-Object-Manifest: コンテナ名/プレフィクス

“コンテナ名” は分割後のオブジェクト群が置かれているコンテナの名前であり、”プレフィクス” は、その分割後のオブジェクトに付けられた名前の共通部分です。また、マニフェストファイルは空のオブジェクトで構いません。分割後のオブジェクト群が置かれているコンテナとは別のコンテナに、マニフェストファイルを置いても問題ありません。

このマニフェストファイルを指定してGETリクエストを送ると、分割後のオブジェクト群を結合した、ひとつの大きなオブジェクトとして取得できます。
この機能は、オブジェクトを分割し、それぞれを同時にアップロードすることで、オブジェクトのアップロード時間を短縮する目的でも利用することができます。

【実行例】

コンテナshelfの下に、毎日のシステム運用ログをオブジェクトとしてアップロードしているものと仮定します。
コンテナshelfの下に、syslog-0728, syslog-0729, syslog-0730, syslog-0731, syslog-0801, syslog-0802 が置かれていた場合、この中から 7 月分のログだけを集めたオブジェクトを定義します。

7 月の運用ログのオブジェクトの名前は、全て同じプレフィクス “syslog-07” を持っているため、それらを辞書順に並べると結合したい日付順になります。
コンテナ shelf に GET リクエスト (format 指定あり) を送り、shelf 配下にあるオブジェクトとそれぞれのオブジェクトサイズを確認します。

GET /v1/AUTH_orion-cabinet/shelf?format=json HTTP/1.1
User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: objstore.example.jp
Accept: */*
X-Auth-Token: AUTH_tk55dbfd33f2d44ccb9f254555f0975142
HTTP/1.1 200 OK
X-Container-Object-Count: 4
X-Container-Bytes-Used: 362904
Content-Length: 1066
Content-Type: application/json; charset=utf8
Date: Mon, 03 Aug 2011 01:57:57 GMT

[{"name":"syslog-0728","hash":"fc7510d59dc06ba4da9f6d72e467b88d","bytes":7347,
  "content_type":"application/x-www-form-urlencoded",
  "last_modified":"2011-07-29T01:38:24.155270"},
{"name":"syslog-0729","hash":"f49162bc09df5a6db81bf9cf7c105c8f","bytes":919,
  "content_type":"application/x-www-form-urlencoded",
  "last_modified":"2011-07-30T01:38:34.630770"},
{"name":"syslog-0730","hash":"c7e330322b421b480ba79fcab4ef0111","bytes":24024,
  "content_type":"application/x-www-form-urlencoded",
  "last_modified":"2011-07-31T01:56:42.285210"},
{"name":"syslog-0731","hash":"992606b8f66af9012b750e76067972ff","bytes":292292,
  "content_type":"application/x-www-form-urlencoded",
  "last_modified":"2011-08-01T01:57:10.127310"},
{"name":"syslog-0801","hash":"fa56c06de7135cdde8d4f701df73aefa","bytes":1028,
  "content_type":"application/x-www-form-urlencoded",
  "last_modified":"2011-08-02T01:57:16.137920"},
{"name":"syslog-0802","hash":"4808deba36e11d131efa810a2ae9b1ce","bytes":37294,
  "content_type":"application/x-www-form-urlencoded",
  "last_modified":"2011-08-03T01:57:37.227280"}]

7 月の運用ログのオブジェクト群をまとめるマニフェストファイルを作成します。

 

  • これから作成するマニフェストファイル “systemlog-July” を指定して、PUT リクエストを送ります。
  • 拡張ヘッダとして “X-Object-Manifest: shelf/syslog-07″を設定します。
  • 7 月の運用ログのオブジェクトの共通プレフィクス “syslog-07” を指定します。

上記の例では、システムログのオブジェクトが置かれたコンテナ shelf とは別のコンテナ record の下に、マニフェストファイル systemlog-July を作成します。

PUT /v1/AUTH_orion-cabinet/record/systemlog-July HTTP/1.1
User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: objstore.example.jp
Accept: */*
X-Auth-Token: AUTH_tk55dbfd33f2d44ccb9f254555f0975142
X-Object-Manifest: shelf/syslog-07
Content-Length: 0
Content-Type: application/x-www-form-urlencoded
HTTP/1.1 201 Created
Content-Length: 118
Content-Type: text/html; charset=UTF-8
Etag: d41d8cd98f00b204e9800998ecf8427e
Last-Modified: Mon, 25 Jul 2011 04:02:28 GMT
Date: Mon, 03 Aug 2011 04:02:28 GMT

<html>
 <head>
  <title>201 Created</title>
 </head>
 <body>
  <h1>201 Created</h1>
  

 </body>
</html>

作成したマニュフェストファイルを指定して GET リクエストを送ると、7 月の運用ログを納めたオブジェクトが結合されたものを読み出すことができます。
読み出せたデータの大きさ 324582 バイト (Content-Length: 324582) が、syslog-0728 (7347バイト), syslog-0729 (919バイト), syslog-0730 (24024バイト), syslog-0731 (292292バイト) の合計に一致することも確認できます。

GET /v1/AUTH_orion-cabinet/record/systemlog-July HTTP/1.1
User-Agent: curl/7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Host: objstore.example.jp
Accept: */*
X-Auth-Token: AUTH_tk55dbfd33f2d44ccb9f254555f0975142
HTTP/1.1 200 OK
X-Object-Manifest: shelf/syslog-07
Content-Type: application/x-www-form-urlencoded
Etag: 320366cada15207c5b977966ad30f2dc
Content-Length: 324582
Last-Modified: Mon, 25 Jul 2011 01:57:10 GMT
Date: Aug, 03 Jul 2011 04:49:07 GMT
  (以下実際のデータ)
      :
      :