*

Grizzlyの新機能(2) SLO ~ Swiftによるオブジェクトストレージシステムの構築(10)

公開日: 最終更新日:2014/07/25  |  By  |  Object Storage, OpenStack, Swift

by You Yamagata 2013.06.10

(Swift関連の記事の一覧は インデックス をご覧ください)
少し間があいてしまいましたが、今回は Grizzly で新しく導入された Static Large Object (SLO) について見ていきたいと思います。
Swift では1オブジェクトの最大サイズは 5GB (デフォルト) という制限があります。
この制限に対する緩和策として従来より Large Object がサポートされていました。
Large Object は大きなサイズのオブジェクトを分割してアップロードし仮想的にひとつのオブジェクトとしてダウンロードできるようにするものです。
なお SLO 導入により従来の Large Object は Dynamic Large Objects (DLO) と呼ばれるようになったようです。
SLO も同様の機能を提供するものですが、まとめ方が従来の Large Object とは異なります。
以下それぞれについて見ていきたいと思います。

1. DLO の仕組み

従来からある DLO を使うには以下のような手順で行います。

 

  • 分割してアップロードするオブジェクトを格納するコンテナを用意する
  • 分割されたファイルをコンテナにアップロードする。オブジェクト名はユニークなプレフィックスをもち、分割された順番に並ぶようなオブジェクト名にする。
  • マニフェストファイルをダウンロード時に使いたいコンテナ、オブジェクト名でアップロードする。
    マニフェストファイルは空で構いません。
  • アップロードしたマニフェストファイルのオブジェクトに X-Object-Manifest を設定します。 X-Object-Manifest に設定する値は上記でアップロードした分割ファイルのある container/prefix になります。
  • マニフェストファイルをダウンロードします。ダウンロードしたファイルが分割してアップロードしたファイルを結合したものとなっていることが確認できます。

 

 

以下、実際にやってみたいと思います。
 #(1) アップロードするデータを作ります。ファイル名: data100M  
 $ dd if=/dev/urandom of=data100M bs=1024 count=102400  
   
 #(2) data100M を10個のファイルに分割します  
 $ split -n 10 -d data100M segment_data100M_  
 $ ls data100M_part_*  
 data100M_part_00 data100M_part_02 data100M_part_04 data100M_part_06 data100M_part_08  
 data100M_part_01 data100M_part_03 data100M_part_05 data100M_part_07 data100M_part_09  
   
 #(4) 元のファイルをmvしておきます  
 $ mv data100M data100M.org  
   
 #(5) コンテナ data10M_segments へ分割したファイルをアップロードします  
 $ swift -V 2.0 -A http://localhost:5000/v2.0 -U test:tester -K testing upload data100M_segments data100M_part_0*  
 $ swift -V 2.0 -A http://localhost:5000/v2.0 -U test:tester -K testing list data100M_segments  
 data100M_part_00  
 data100M_part_01  
 data100M_part_02  
 data100M_part_03  
 data100M_part_04  
 data100M_part_05  
 data100M_part_06  
 data100M_part_07  
 data100M_part_08  
 data100M_part_09  
   
 #(6)マニフェストの設定は swift CLI でできないため、curl を使います。  
 #  curlを使うため認証トークンとStorage URL を取得します。 stat コマンドに -v を付けます。  
 $ swift -V 2.0 -A http://localhost:5000/v2.0 -U test:tester -K testing stat -v  
 StorageURL: http://127.0.0.1:8080/v1/AUTH_2471d0cfd4cd4dda96e9a45ac11904d0  
 Auth Token: aa8dc664403d4aea97596dbefb22261e  
   Account: AUTH_2471d0cfd4cd4dda96e9a45ac11904d0  
 Containers: 2  
   Objects: 11  
    Bytes: 104857600  
 Accept-Ranges: bytes  
 X-Timestamp: 1370499846.28361  
 X-Trans-Id: txe118dda31b414b42985f4cd83c47421b  
 Content-Type: text/plain; charset=utf-8  
   
 #(7) curlによりコンテナ folder1 に空のオブジェクト data100M を作成します。  
 #  その時 X-Object-Manifest を設定します。値は分割オブジェクトへパス(prefix)を設定します。  
 $ curl -X PUT -H 'X-Auth-Token: aa8dc664403d4aea97596dbefb22261e' -H 'X-Object-Manifest: data100M_segments/data100M_part_' http://127.0.0.1:8080/v1/AUTH_2471d0cfd4cd4dda96e9a45ac11904d0/folder1/data100M --data-binary ''  
   
 #(8) 作成したマニフェストファイルを確認します。Manifest が設定されているのがわかります。  
 $ swift -V 2.0 -A http://localhost:5000/v2.0 -U test:tester -K testing stat -v folder1 data100M  
     Account: AUTH_2471d0cfd4cd4dda96e9a45ac11904d0  
    Container: folder1  
     Object: data100M  
  Content Type: application/x-www-form-urlencoded  
 Content Length: 104857600  
  Last Modified: Thu, 06 Jun 2013 06:30:45 GMT  
      ETag: "5a0017dc478621286e008e17155d76e7"  
    Manifest: data100M_segments/data100M_part_  
  Accept-Ranges: bytes  
   X-Timestamp: 1370501013.02839  
   X-Trans-Id: tx1e6272ed214a485286f86ce46d319389  
   
 # これでDLOによるオブジェクトの分割アップロードは完成です。  
   
 #(9)マニフェストファイルに対してダウンロードを行います。  
 $ swift -V 2.0 -A http://localhost:5000/v2.0 -U test:tester -K testing download folder1 data100M  
   
 #(10) 実際には空のマニフェストではなく指定された分割ファイルを結合してダウンロードされています。  
 $ ls -lh data100M  
 -rw-rw-r-- 1 angler angler 100M 6月 6 15:59 data100M  
   
 #(11)ダウンロードしたファイルが元のファイルと同じものか md5値で比較します。  
 $ md5sum data100M.org data100M  
 dbadcef2198bf4d30df3f0ea4360b226 data100M.org  
 dbadcef2198bf4d30df3f0ea4360b226 data100M

以上のように DLO により分割してアップロードしたファイルをひとつのオブジェクトとしてダウンロードできます。

なお上記の手順では一つ一つ作業をしていきましたが、swift CLI は標準で DLO をサポートしています。
upload するときに -S で分割するバイト数を指定するとそのサイズで自動的に分割してアップロードします。

$ swift -V 2.0 -A http://localhost:5000/v2.0 -U test:tester -K testing upload -S 10240000 folder2 data100M  
 data100M segment 0  
 data100M segment 2  
 data100M segment 1  
 data100M segment 4  
 data100M segment 3  
 data100M segment 6  
 data100M segment 10  
 data100M segment 7  
 data100M segment 9  
 data100M segment 5  
 data100M segment 8  
 data100M 
$ swift -V 2.0 -A http://localhost:5000/v2.0 -U test:tester -K testing list
data100M_segments
folder1
folder2
folder2_segments

$ swift -V 2.0 -A http://localhost:5000/v2.0 -U test:tester -K testing list folder2_segments
data100M/1370501963.438865/104857600/10240000/00000000
data100M/1370501963.438865/104857600/10240000/00000001
data100M/1370501963.438865/104857600/10240000/00000002
data100M/1370501963.438865/104857600/10240000/00000003
data100M/1370501963.438865/104857600/10240000/00000004
data100M/1370501963.438865/104857600/10240000/00000005
data100M/1370501963.438865/104857600/10240000/00000006
data100M/1370501963.438865/104857600/10240000/00000007
data100M/1370501963.438865/104857600/10240000/00000008
data100M/1370501963.438865/104857600/10240000/00000009
data100M/1370501963.438865/104857600/10240000/00000010

 

 

folder2 に対して folder2_segments というコンテナを作成してその下に分割しオブジェクトを保管していることがわかります。

DLO は CLI でもサポートされており便利なのですが、問題もあります。
DLOは仕様としてコンテナが保有するオブジェクトの一覧情報に依存しています。
Swift はデータ更新の一貫性を保証していません。例えばファイルをアップロードした直後にそのコンテナのオブジェクト一覧を取得するとアップロードしたオブジェクトが表示されないということがありえます。
したがってダウンロードしたDLO オブジェクトはタイミングによってはデータが一部欠落した状態になる可能性もあります。

新しく導入された SLO ではこういった問題を解決し、より確実にデータをダウンロードすることができます。

2. SLOの仕組み

SLO ではラージオブジェクトを構成する各分割オブジェクトの情報をマニフェストファイルに記載します。
Swift 側でこの中身に基づいてデータダウンロードを行うことでラージオブジェクトを構成します。
マニフェストのアップロード(HTTP PUT)はアップロード時にクエリパラメータとして ?multipart-manifest=put を付け、以下のようなJSON形式BODYデータを渡すことで実現できます。


 [{"path": "/cont/object",  
  "etag": "etagoftheobjectsegment",  
  "size_bytes": 1048576}, ...]  

以下で実際に試してみます。
(1)~(6) は DLO と同じのため省略

#(7) curlによりコンテナ folder2 を作成します。

$ curl -kv -X PUT -H 'X-Auth-Token: c775783d22fc4d84ae2f58f03cdaf27c' http://127.0.0.1:8080/v1/AUTH_2471d0cfd4cd4dda96e9a45ac11904d0/folder2
...
 HTTP/1.1 201 Created
...

#(8)分割オブジェクトのファイルサイズ、md5 を取得します。
$ ls -l data100M_part_0*
-rw-rw-r-- 1 angler angler 10485760 6月 6 15:28 data100M_part_00
-rw-rw-r-- 1 angler angler 10485760 6月 6 15:28 data100M_part_01
-rw-rw-r-- 1 angler angler 10485760 6月 6 15:28 data100M_part_02
-rw-rw-r-- 1 angler angler 10485760 6月 6 15:28 data100M_part_03
-rw-rw-r-- 1 angler angler 10485760 6月 6 15:28 data100M_part_04
-rw-rw-r-- 1 angler angler 10485760 6月 6 15:28 data100M_part_05
-rw-rw-r-- 1 angler angler 10485760 6月 6 15:28 data100M_part_06
-rw-rw-r-- 1 angler angler 10485760 6月 6 15:28 data100M_part_07
-rw-rw-r-- 1 angler angler 10485760 6月 6 15:28 data100M_part_08
-rw-rw-r-- 1 angler angler 10485760 6月 6 15:28 data100M_part_09

$ md5sum data100M_part_0*
0473fa349844d2cac23f7f2ca28b0407 data100M_part_00
38d547a06230e734725ab6a82c60e469 data100M_part_01
07733fc4810863031b0aa9f5f6b45e24 data100M_part_02
4cc020ea3c0690245ebec4ec205409f0 data100M_part_03
c57e34953a6cf2162571c17630da26a8 data100M_part_04
d76843dff91b068962a6672c75b778fc data100M_part_05
4a8b506fc50403c04171ad9924d1d1fe data100M_part_06
ba46cde83dbd7776d2c1ba9673a5bde0 data100M_part_07
64adc9695ead38501914c9c4a3ff2289 data100M_part_08
4c1b692a007707b9cb5e1c05cfde99f6 data100M_part_09

#(9)上記の情報を元に SLO 用のマニフェストのデータを用意します。
$ cat manifest
[{"path" : "data100M_segments/data100M_part_00", "etag": "0473fa349844d2cac23f7f2ca28b0407", "size_bytes": 10485760},
{"path" : "data100M_segments/data100M_part_01", "etag": "38d547a06230e734725ab6a82c60e469", "size_bytes": 10485760},
{"path" : "data100M_segments/data100M_part_02", "etag": "07733fc4810863031b0aa9f5f6b45e24", "size_bytes": 10485760},
{"path" : "data100M_segments/data100M_part_03", "etag": "4cc020ea3c0690245ebec4ec205409f0", "size_bytes": 10485760},
{"path" : "data100M_segments/data100M_part_04", "etag": "c57e34953a6cf2162571c17630da26a8", "size_bytes": 10485760},
{"path" : "data100M_segments/data100M_part_05", "etag": "d76843dff91b068962a6672c75b778fc", "size_bytes": 10485760},
{"path" : "data100M_segments/data100M_part_06", "etag": "4a8b506fc50403c04171ad9924d1d1fe", "size_bytes": 10485760},
{"path" : "data100M_segments/data100M_part_07", "etag": "ba46cde83dbd7776d2c1ba9673a5bde0", "size_bytes": 10485760},
{"path" : "data100M_segments/data100M_part_08", "etag": "64adc9695ead38501914c9c4a3ff2289", "size_bytes": 10485760},
{"path" : "data100M_segments/data100M_part_09", "etag": "4c1b692a007707b9cb5e1c05cfde99f6", "size_bytes": 10485760}]

#(10) curl によりマニフェストファイルをアップロードします。

$ curl -kv -X PUT -H 'X-Auth-Token: c775783d22fc4d84ae2f58f03cdaf27c'
-d '[{"path" : "data100M_segments/data100M_part_00", "etag": "0473fa349844d2cac23f7f2ca28b0407", "size_bytes": 10485760},
{"path" : "data100M_segments/data100M_part_01", "etag": "38d547a06230e734725ab6a82c60e469", "size_bytes": 10485760},
{"path" : "data100M_segments/data100M_part_02", "etag": "07733fc4810863031b0aa9f5f6b45e24", "size_bytes": 10485760},
{"path" : "data100M_segments/data100M_part_03", "etag": "4cc020ea3c0690245ebec4ec205409f0", "size_bytes": 10485760},
{"path" : "data100M_segments/data100M_part_04", "etag": "c57e34953a6cf2162571c17630da26a8", "size_bytes": 10485760},
{"path" : "data100M_segments/data100M_part_05", "etag": "d76843dff91b068962a6672c75b778fc", "size_bytes": 10485760},
{"path" : "data100M_segments/data100M_part_06", "etag": "4a8b506fc50403c04171ad9924d1d1fe", "size_bytes": 10485760},
{"path" : "data100M_segments/data100M_part_07", "etag": "ba46cde83dbd7776d2c1ba9673a5bde0", "size_bytes": 10485760},
{"path" : "data100M_segments/data100M_part_08", "etag": "64adc9695ead38501914c9c4a3ff2289", "size_bytes": 10485760},
{"path" : "data100M_segments/data100M_part_09", "etag": "4c1b692a007707b9cb5e1c05cfde99f6", "size_bytes": 10485760}]'

http://127.0.0.1:8080/v1/AUTH_2471d0cfd4cd4dda96e9a45ac11904d0/folder2/data100M?multipart-manifest=put

...
$ HTTP/1.1 201 Created
...

#(11) ダウンロードして確認します。
$ swift -V 2.0 -A http://localhost:5000/v2.0 -U test:tester -K testing download folder2 data100M
data100M: md5sum != etag, dbadcef2198bf4d30df3f0ea4360b226 != "5a0017dc478621286e008e17155d76e7"

$ md5sum data100M data100M.org
dbadcef2198bf4d30df3f0ea4360b226 data100M
dbadcef2198bf4d30df3f0ea4360b226 data100M.org

(11) で swift CLI によりダウンロードをすると md5のチェックエラーが出ますが、こちらは無視してください。最新の python-swiftclient のコードでは修正されているようです。

以上のように SLO が実際に使えることがわかりました。

以上 DLO, SLO について見ていきました。
SLO はマニフェストファイルを用意するのが面倒ではありますが、分割オブジェクトの一覧、各オブジェクトのサイズとmd5値を持つことで、より確実にラージオブジェクトのダウンロードができるようになります。

どちらを使うかはケースバイケースかもしれませんが個人的には SLO のほうが安心感があり好ましいと思っています。

関連記事

no image

Swiftの概要 ~ Swiftによるオブジェクトストレージシステムの構築(1)

(Swift関連の記事の一覧はこちらをご覧ください)はじめまして、山縣と申します。私はビットアイル総

記事を読む

IMG_0870

OpenStack Summit San Diegoに参加しています

by hasegawa 2012/10/16ビットアイル総研の長谷川です。10月15日(月)〜18日

記事を読む

no image

Swift のグローバルクラスタ (3) Icehouse 開発版でのテスト結果

2014.4.14 by You Yamagata 山縣です。 前回・前々回でグローバルクラスタ対応

記事を読む

affinity_swift-get-node

Swift のグローバルクラスタ(2) affinity の設定

Swift のグローバルクラスタ(2) affinity 山縣です。Havana 版(1.10.0)

記事を読む

top

OpenStack API でSoftLayerを操作する “Jumpgate”

by Ikuo Kumagai (@kumagai19o) この記事はAdvent Calen

記事を読む

検証構成

RDOを使用したOpenStack Juno環境の構築

ビットアイル総合研究所 田波です。 今回はRDOを使用してOpenStack Juno環境を構築し

記事を読む

newton

Juju Manual Cloud で OpenStack 環境構築

本当にご無沙汰しております。 この投稿はOpenStack Advent Calendar 201

記事を読む

no image

Nova Availability Zone と Cinder Availability Zone

OpenStack 担当 石川です。 実際に自分が使うか使わないかは置いておき、気になったオプ

記事を読む

no image

OpenStack DBaas (Trove) を動かした話

本記事はOpenStack Advent Calendar 2015 12/17 のエントリー記事で

記事を読む

no image

Grizzlyの新機能(1) ~ Swiftによるオブジェクトストレージシステムの構築(8)

by You Yamagata 2013.04.24(Swift関連の記事の一覧はこちらをご覧くださ

記事を読む

no image

ビットアイル総合研究所は、クラウド技術に関する調査&研究を通して、社会と会社に寄与していくことを目的に、ビットアイル・エクイニクスの企業内研究所として2011年8月に設立されました。

openstack-figure1-2x
COHO DataStream のCinder連携

OpenStack Cinder のストレージバックエンドとしてはCe

blog-ocata
Jujuで Ocataを含む様々なバージョンのOpenStack をデプロイする方法

祝OpenStack Ocata リリース!! ということで、早速デプ

newton
Juju Manual Cloud で OpenStack 環境構築

本当にご無沙汰しております。 この投稿はOpenStack Adve

top
HACK! THE Juju/MAAS

6/8~6/10まで幕張メッセで開催されたInterop 2016。皆

dpdk
OpenStack OVS VXLAN ネットワークの高速化

少し前の話になりますが、3月2日に開催された 日本仮想化技術株式会社様

→もっと見る

PAGE TOP ↑