Upload
shuichi-yukimoto
View
565
Download
5
Embed Size (px)
Citation preview
PBOX on SoftLayer第1回福岡SoftLayer勉強会
2014.11.21
雪本 修一Shuichi Yukimoto株式会社MNU 代表取締役社長 電気通信大学の認定ベンチャーとして起業。 現在も現役プログラマとしてコードを書いている。 好きな言語はJavaScript,Scheme,Lisp,Python SoftLayerを使い始めて一年ぐらい 弊社はSoftLyerのリフェラルパートナーです。
twitter:@nsas454 facebook:shuichi.yukimoto
今日の内容Object Storageを使ったファイル共有アプリケーションをつくってみた。
ファイルサーバとしても十分使える!
Object Storageの便利な機能をしってもらおう!
せっかくなので、宣伝もしたい!
この機会に、ぜひ使ってみてください
PBOXSoftLayer専用オンラインストレージアプリ
概要• 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 swiftclientSWIFT_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 swiftclientSWIFT_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, '%s\n%s\n%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リクエスト認証/ストレージ情報