PBOX on SoftLayer
第2回名古屋SoftLayer勉強会
2014.11.13
雪本 修一
Shuichi Yukimoto
株式会社MNU
代表取締役社長
電気通信大学の認定ベンチャーとして起業。
現在も現役プログラマとしてコードを書いている。
好きな言語はJavaScript,Scheme,Lisp,Python
SoftLayerを使い始めて一年ぐらい
弊社はSoftLyerのリフェラルパートナーです。
twitter:@nsas454
facebook:shuichi.yukimoto
今日の内容
Object Storageを使ったファイル共有アプリケー
ションをつくってみた。
ファイルサーバとしても十分使える!
Object Storageの便利な機能をしってもらおう!
せっかくなので、宣伝もしたい!
この機会に、ぜひ使ってみてください
PBOX
SoftLayer専用オンラインストレージアプリ
概要
• Object Storageを使ったファイル共有アプリ
• クライアントでのファイル更新をトリガにObject Storageにファイ
ルをアップロード
• 共有しているメンバのファイルを自動更新
• フォルダの権限を設定できる
• 共有URLからファイルをダウンロードできる
• 5Gを超える大きなファイルを扱える
• ダウンロードとアップロード処理を高速に行える
利用事例
• ObjectStorageをバックアップ先として利用す
るとき
• ファイル共有として利用したいとき
なぜObject Storageで?
DropBoxがAWSのS3を使っている。
AWSのS3でできるならSoftLayerのObject
Storageでも同じものが出来るんじゃないか?
Object Storage
概要
• 大容量ファイルを安全に保存する
• 保存されている全てのオブジェクトはURLを持つ
• 開発者はRESTful HTTP APIによってObjetcStorageシステムを
操作する
• オブジェクトはデフォルトでレプリカされ、一つのファイルが破
損しても自動修復される
• このレプリカは複数のデータセンターをまたがって保存され、
これによって、高い可用性が実現されている
Object Storageの制限
• ファイルアップロードの制限
• 5Gを超えるファイル
• カスタマー・ポータルでは20MBを超える
ファイルはアップロードできない
5G超えファイルについて
• 2つの方法がある
• Static Large Object (SLO)
• Dynamic Large Object (DLO)
• 共通するのはmanifestファイルを呼ばれるものを使用して、複数のObject
を1つのObjectに見せる
• manifestファイルの記述で複数のファイルを指定する
• swiftがmanifestファイルを1つの巨大なファイルとして特別に扱ってくれる
• 分割されたファイルは通常のobjectと同じ
Static Large Object
• manifestファイルにJSON型式で記述したファイ
ルをアップロードする
• アップロード手順
• ファイルを分割
• 分割したファイルをアップロード
• manifestファイルをアップロード
SLOの特徴
• ファイルの結合順はmanifestファイルで指定する
• 分割ファイルはどのコンテナのどのパスにおいてもよい
• 分割ファイルの名称は自由
• ファイルを更新する場合はmanifestファイルの更新も必須
• manifestファイルの記述に誤りがある場合、manifestファイルのアッ
プロード時にエラー
• 分割ファイルサイズは1MB以上なくてはならない
• 1000以上のファイルに分割できない
manifestファイルの仕様
[
{
"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
}
]
Dynamic Large Object
• manifestファイルで指定したprefixにマッチするobject
を1つのファイルとして扱う
• DLOの作成手順
• manifestファイルをアップロード(最後でもよい)
• ファイルを分割する
• 分割したファイルをアップロード
DLOの特徴
• ファイルの結合順はobject名のソート順
• 分割ファイルはどの1つのコンテナに置く必要がある
• 分割ファイルの名称はソートで正しい順番になるよ
うに名付ける
• manifestファイルの更新なしで巨大ファイルを更新可能
• アップロード中にもダウンロードできる!
比較
SLO DLO
ファイルの結合順 manifestファイルで指定 ファイル名のソート順
コンテナの制限 制限なし 同一のコンテナ
manifestファイルの型式 JSON 空ファイル
Temporary URL
• ログインせずに特定のファイルに対する一時的な
アクセスを許す仕組み
• ・一時URLを知ってる人は誰でもアクセスできる
• ・GET HEAD PUT POST DELETEが可能(GET
以外試してない)
• ・Dropboxの共有リンクと似ている
Dropboxとの違い
• サーバは一時URLを管理しない
• 一時URLはサーバ側で作成しない。
• シークレットキーを元に誰か(クライアントな
ど)が作成する
一時URLの生成方法
シークレットキー、オブジェクトのパス、有効期限の3つ
から一時URLのシグネチャを生成し、クエリストリングを
オブジェクトのURLの後ろに付けることで一時URLとなる。
シークレットキー
• 一時URLを作成するための「鍵」
• アカウント毎に設定する
シークレットキーの設定
• ストレージURLにPOSTすることで設定できる
• ストレージURLとは認証後に帰ってくるベースURLのこと
例えばpboxなら
https://sng01.objectstorage.softlayer.net/v1/
AUTH_a26e5e6f-76-4604-af86-x4x2089085e7
となっている
このURLに 'X-Account-Meta-Temp-URL-Key' ヘッダを
付けてポストする
python-swiftclientでシークレットキーを設定する例
import swiftclient
SWIFT_AUTH_URL = 'https://sng01.objectstorage.softlayer.net/auth/v1.0/'
SWIFT_USERNAME = 'SLOS30001'
SWIFT_KEY =
'ea9556757661db7c55rewb6ae261f1315b69880df8be68ff27eed0erc56ee'
conn = swiftclient.Connection(SWIFT_AUTH_URL, SWIFT_USERNAME, SWIFT_KEY)
conn.post_account(headers={'X-Account-Meta-Temp-URL-Key': 'my key'})
シークレットキーの取得
import swiftclient
SWIFT_AUTH_URL = 'https://sng01.objectstorage.softlayer.net/auth/v1.0/'
SWIFT_USERNAME = 'SLOS30001'
SWIFT_KEY = 'ea9556757661db7c55rewbe261f1c2315b69880df8be68ff27eed0erc56ee'
conn = swiftclient.Connection(SWIFT_AUTH_URL, SWIFT_USERNAME, SWIFT_KEY)
r = conn.head_account()
r['x-account-meta-temp-url-key'] # -> 一時URL
一時URLの生成方法
シークレットキー、オブジェクトのパス、有効期限の3つ
から一時URLのシグネチャを生成し、クエリストリングを
オブジェクトのURLの後ろに付けることで一時URLとなる。
import hmac
from hashlib import sha1
from time import time
expire_minutes = 5 # 5分
expires = int(time() + expire_minutes*60)
method = 'GET'
key = '3ac1b5c36f4d52c91d0a' # シークレットキー
path = '/v1/AUTH_a26e5e6f-7755-494-af86-e4c20960e5e7/filesync/
6fcfb4afba2f822c7368d1c9ce08af1d51458bc8' # pbox_osx.zip
sig = hmac.new(key,
'%sn%sn%s' % (method, expires, path),
sha1).hexdigest()
query = '?temp_url_sig=%s&temp_url_expires=%s' % (sig, expires)
query += '&filename=' + 'pbox_osx.zip' # ダウンロード時のファイル名を設定できる
print 'https://sng01.objectstorage.softlayer.net'+ path + query # 一時
URL
ファイルアップロード/ダウ
ンロードの高速化
• PBOXではObject Storageにファイルを
アップロードする際に高速で処理を行えるよう
な機能を実装している。
• pboxはnginx + gunicornで構成されているが、ファイルのアッ
プロード、ダウンロード処理をgunicornでやるのは高コスト
• アップロード/ダウンロードには複雑な処理は必要無いにもか
かわらず、gunicornのセッションを専有するのは良くない!
ファイル
nginx gunicorn
object
Storage
フロントエンド バックエンド ストレージ
認証/リクエスト
PUT
• nginx拡張でなるべく多くの同時リクエストを
捌きつつ、静的ファイルの送受信を行う
ファイル
nginx
object
Storagegunicorn
redis
tornade
LUA
フロントエンド バックエンド ストレージ
PUT
PUTリクエスト
認証/ストレージ情報
ファイル
ファイル
nginx
nginx
gunicorn
object
Storage
object
Storagegunicorn
redis
tornade
LUA
Bad
Good
フロントエンド
フロントエンド
バックエンド ストレージ
バックエンド ストレージ
認証/リクエスト
PUT
PUT
PUTリクエスト
認証/ストレージ情報

第2回名古屋SoftLayer勉強会 PBOX on SoftLayer