swift_v3 - Eucalyptus (OSS Elastic Computing) 日本語情報

Swiftの機能・利用方法の説明
北陸先端科学技術大学院大学
松井 大輔
一般社団法人クラウド利用促進機構(CUPA)
荒井 康宏
自己紹介
• 名前:松井大輔
– スポーツ選手ではありません
– そんな名前で大丈夫か?
• 職業:学生
– 修士課程を修了済み
– 現在研究生
• 研究分野
– クラウド関連
• Swift、OpenNebula
– テストベッド
• StarBED、PlanetLab
• その他
– Twitter: @nanodayo
– ブログ: http://nanodayo.com/
Swiftの概要
• 分散オブジェクトストレージ
– ファイルのダウンロード/アップロードが可能
• 元々はRackSpaceのCloud Filesサービス
Server
– OSS化
• Amazon S3に相当
• 大容量のファイルを想定
–
–
–
–
–
バックアップ
メールデータ
VMイメージ
最大5GBのファイル
テラバイト・ペタバイトを想定
• 複数台のサーバで構築
– 規模拡張
• 容量の増設
– 冗長化
– 一般的な性能のPCを想定
• 動的にサーバを追加可能
Server
Server
File
File
サーバの拡張・冗長化
FTPの場合の規模拡張・冗長化
NFSで容量増設
FTP
Server
×
クライアント
rsyncで同期
NFSで容量増設
FTP
Server
rsyncで同期
クライアントが
他のサーバを選択
NFS
Server
NFS
Server
NFSで容量増設
FTP
Server
ミラーサーバを構築する方法
NFS
Server
NFSで容量増設
NFS
Server
FTPの場合の規模拡張・冗長化(2)
NFSで容量増設
FTP
Server
rsyncで同期
Load
Balancer
クライアント
×
NFS
Server
NFSで容量増設
FTP
Server
rsyncで同期
NFS
Server
NFSで容量増設
FTP
Server
Load Balancerを利用する方法
NFS
Server
NFSで容量増設
NFS
Server
増設・冗長化しやすい構造
×
Load
Balancer
クライアント
FTP
Server
rsyncで同期
FTP
Server
目的のファイルに合わせて
サーバ選択
FTP
Server
FTP
Server
交換などの構成変更
サーバを追加して
容量増設
FTP
Server
rsyncで同期
FTP
Server
FTP
Server
クラスタに分けて冗長化
増設後のファイル分配
増設後のクラスタ再構築
Swiftを構成するサーバ群
ファイルを保存
ユーザ認証
Proxy ServerのURLを通知
Tokenの発行
Object
Server
Auth
Server
Object
Server
ディレクトリを保存
互いに設定ファイルで指定
Container
Server
Proxy
Server
クライアント
Container
Server
クライアントは
リクエストの仲介
Proxy Serverと通信
Object
Rings
Container
Rings
Object
Container
Serverのリスト Serverのリスト
アカウントを保存
Account
Rings
Account
Server
Account
Serverのリスト
Account
Server
各サーバはRingファイルで指定
Swiftの場合の規模拡張・冗長化
ファイルを保存
Object
Server
Auth
Server
Object
Server
Object
Server
ディレクトリを保存
Container
Server
Proxy
Server
クライアント
クライアントは
Proxy Serverと通信
Container
Server
Container
Server
リクエストの仲介
アカウントを保存
Object
Rings
Container
Rings
Object
Container
Serverのリスト Serverのリスト
Account
Rings
Account
Server
Account
Serverのリスト
Account
Server
サーバを増やしてRingを更新する
PUTの段階で冗長化
Account
Server
Ringファイル
• Object/Container/Account Serverのリスト
– Proxy Serverがこれらのサーバを参照するのに使用
– Replicatorなども使用
2 replicas, 2 zones, 4 devices, …
• Ringに含まれる情報
– サーバのアドレス・ポート
– Replicaの数
– Zone
• Replicationに影響
• コマンドで作成・変更
– swift-ring-builder
• サーバを動的に追加可能
zone1-192.168.100.1:6020
zone1-192.168.100.2:6020
zone2-192.168.200.1:6020
zone2-192.168.200.2:6020
・・・
…
…
…
…
zone1
Object
Server
zone2
Object
Server
Object
Server
replicatorで同期
Object
Server
Swiftの利用方法
• サーバ
– 発表では割愛
– Eucalyptus Wiki に設定方法などを記載
•
•
•
•
•
Swiftのインストール
設定ファイルとRingファイルを作成
サーバプログラムの実行
構築用スクリプトも掲載
今回ボツになったネタも掲載予定
• クライアント
そんなクライアントで
大丈夫か?
– CloudFiles対応クライアントが必要
• GUIは現行CyberDuckのみ
• CloudFiles API Library あり
– 頑張ればcurlでも可能
大丈夫だ、問題ない
クライアントからの利用方法
Cloud Filesプロトコル
• RackSpaceでも使用
• HTTPベース
– メッセージの種類は4つ
• HEAD, GET, PUT, DELETE
– SSL対応可能
• 用語・制約
–
–
–
–
–
ファイルはobject
ディレクトリはcontainer
ObjectはContainerの中にしか作れない
Containerの中にContainerは作れない
http://<Server>:<port>/<X-Storage-Url>/<container>/<object>
• CyberDuckがCloudFilesプロトコルに対応
CyberDuck
• GUIのファイル転送クライアント
• 様々なプロトコルに対応
– FTP、FTPS、SFTP、Amazon S3などなど
• Macでは人気のクライアント
• Windows版もPrivate Betaで配布
CyberDuckからのSwift利用
• サーバのアドレスを変更できない orz
CyberDuckからの利用(2)
• Macの場合
– defaultsコマンドで設定するとサーバを変更可能
• # defaults write ch.sudo.cyberduck
protocol.cf.swift.enable true
• 変更しても接続できずorz
– 調査中
• Windowsの場合
– Defaultsコマンドに相当する設定はできない
– CyberDuckのヘルプによると変えられないらしい
あぁ、やっぱりWindowsは駄目だったよ
あいつは設定を聞かないからね
curlからの利用
• 事前準備
– Auth Server上でアカウントを作成
• swift-auth-add-userコマンド
• # swift-auth-add-user –K <adkey> –a <account> <user> <pass>
• 実行例:# swift-auth-add-user –K devauth –a test tester testing
• 認証
– # curl -v
-H 'X-Storage-User: test:tester‘
-H 'X-Storage-Pass: testing‘
http://127.0.0.1:11000/v1.0
認証の結果
# curl -v -H 'X-Storage-User: test:tester' -H 'X-Storage-Pass: testing'
http://127.0.0.1:11000/v1.0
* about to connect() to 127.0.0.1 port 11000 (#0)
* Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 11000 (#0)
> GET /v1.0 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: 127.0.0.1:11000
> Accept: */*
> X-Storage-User: test:tester
> X-Storage-Pass: testing
>
< HTTP/1.1 204 No Content
< X-Storage-Url: http://127.0.0.1:8080/v1/AUTH_8023b2fd83f34c34b8e799a7249fe9aa
< X-Storage-Token: AUTH_tkc01a591b5cb140ed9b2377256c87f8c5
< X-Auth-Token: AUTH_tkc01a591b5cb140ed9b2377256c87f8c5
< Content-Length: 0
これらの値を控える
< Date: Wed, 01 Sep 2010 00:07:13 GMT
<
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0
curlからのPUTの方法
• 認証時に控えた値を指定する
– X-Storage-Url
– X-Auth-Token
• ディレクトリ作成
– # curl -X PUT -v
-H ‘X-Auth-Token: AUTH_tkc01a591b5cb140ed9b2377256c87f8c5 ‘
http://127.0.0.1:8080/v1/AUTH_8023b2fd83f34c34b8e799a7249fe9a
a/aaaa
• ファイルアップロード
– # curl -X PUT -T test -v
-H 'X-Auth-Token: AUTH_tkc01a591b5cb140ed9b2377256c87f8c5‘
http://127.0.0.1:8080/v1/AUTH_8023b2fd83f34c34b8e799a7249fe9a
a/aaaa
PUTの結果(ディレクトリ)
# curl -X PUT -v -H 'X-Auth-Token: AUTH_tkc01a591b5cb140ed9b2377256c87f8c5'
http://127.0.0.1:8080/v1/AUTH_8023b2fd83f34c34b8e799a7249fe9aa/aaaa
* About to connect() to 127.0.0.1 port 8080 (#0)
* Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> PUT /v1/AUTH_8023b2fd83f34c34b8e799a7249fe9aa/aaaa 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: 127.0.0.1:8080
> Accept: */*
> X-Auth-Token: AUTH_tkc01a591b5cb140ed9b2377256c87f8c5
>
< HTTP/1.1 201 Created
< Content-Length: 18
< Content-Type: text/plain; charset=UTF-8
< Date: Mon, 15 Nov 2010 06:39:52 GMT
<
201 Created
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0
PUTの結果前半(ファイル)
# curl -X PUT -T test -v -H 'X-Auth-Token:
AUTH_tkc01a591b5cb140ed9b2377256c87f8c5‘ http://127.0.0.1:8080/v1/AUTH_8023b2fd
83f34c34b8e799a7249fe9aa/aaaa
* About to connect() to 127.0.0.1 port 8080 (#0)
* Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> PUT /v1/AUTH_8023b2fd83f34c34b8e799a7249fe9aa/aaaa/test 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: 127.0.0.1:8080
> Accept: */*
> X-Auth-Token: AUTH_tkc01a591b5cb140ed9b2377256c87f8c5
> Content-Length: 45
> Expect: 100-continue
>
後半に続く
PUTの結果後半(ファイル)
< HTTP/1.1 100 Continue
< HTTP/1.1 201 Created
< Content-Length: 118
< Content-Type: text/plain; charset=UTF-8
< Etag: 922c0f15457dfc631ae9ff06abd1bc82
< Last-Modified: Mon, 15 Nov 2010 06:45:17 GMT
< Date: Mon, 15 Nov 2010 06:45:18 GMT
<
<html>
<head>
<title>201 Created</title>
</head>
<body>
<h1>201 Created</h1>
<br /><br />
</body>
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0
curlからのGETの方法
• 認証時に控えた値を指定する
– X-Auth-Token
– X-Storage-Url
– PUTと同様
• ファイルでもディレクトリでも同様(URLの違いのみ)
– # curl -X GET -v
-H ‘X-Auth-Token: AUTH_tkc01a591b5cb140ed9b2377256c87f8c5 ‘
http://127.0.0.1:8080/v1/AUTH_8023b2fd83f34c34b8e799a7249fe9a
a/aaaa
– # curl -X GET -v
-H ‘X-Auth-Token: AUTH_tkc01a591b5cb140ed9b2377256c87f8c5 ‘
http://127.0.0.1:8080/v1/AUTH_8023b2fd83f34c34b8e799a7249fe9a
a/aaaa/test
GETの結果(ディレクトリ)
# curl -X GET -v -H 'X-Auth-Token: AUTH_tkc01a591b5cb140ed9b2377256c87f8c5'
http://127.0.0.1:8080/v1/AUTH_8023b2fd83f34c34b8e799a7249fe9aa/aaaa
* About to connect() to 127.0.0.1 port 8080 (#0)
* Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET /v1/AUTH_8023b2fd83f34c34b8e799a7249fe9aa/aaaa 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: 127.0.0.1:8080
> Accept: */*
> X-Auth-Token: AUTH_tkc01a591b5cb140ed9b2377256c87f8c5
>
< HTTP/1.1 200 OK
< X-Container-Object-Count: 1
< X-Container-Bytes-Used: 45
< Content-Length: 5
< Content-Type: text/plain; charset=utf8
< Date: Mon, 15 Nov 2010 06:48:38 GMT
<
test
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0
ファイル一覧が表示される
GETの結果(ファイル)
# curl -X GET -v -H 'X-Auth-Token: AUTH_tkc01a591b5cb140ed9b2377256c87f8c5'
http://127.0.0.1:8080/v1/AUTH_8023b2fd83f34c34b8e799a7249fe9aa/aaaa/test
* About to connect() to 127.0.0.1 port 8080 (#0)
* Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET /v1/AUTH_8023b2fd83f34c34b8e799a7249fe9aa/aaaa/test 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: 127.0.0.1:8080
> Accept: */*
> X-Auth-Token: AUTH_tkc01a591b5cb140ed9b2377256c87f8c5
>
< HTTP/1.1 200 OK
< Last-Modified: Mon, 15 Nov 2010 06:45:17 GMT
< Etag: 922c0f15457dfc631ae9ff06abd1bc82
< Content-Length: 45
< Content-Type: application/octet-stream
< Date: Mon, 15 Nov 2010 06:50:51 GMT
<
オトートノ
カタキヲ
トルノデス
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0
ファイルの中身が表示される
Cloud Files API
• RackSpaceが公開
– http://www.rackspacecloud.com/cloud_hosting
_products/files/api
• Githubにもあり
• 対応している言語
– PHP
– Python
– Ruby
– Java
– .NET(C#)
一番いいクライアントを頼む
まとめ
• Swiftの機能と概要
–
–
–
–
–
Auth Server
Proxy Server
Object Server
Container Server
Account Server
• 動的にサーバを追加可能
– 容量の増設
– 冗長化
大丈夫だ、(Swiftはきっと)問題ない
• サーバの構築方法
– 詳しくはWikiに
• クライアントからの利用
– CyberDuckからはまだ繋げず
– curlでも一応可能
• Wikiにcurl用スクリプトも記載
– APIあり
そうだな、次はこれを見ている人にも
手伝ってもらおうかな
おわりに
• 資料置き場
– http://eucalyptus.linux4u.jp/wiki/index.php?Swift/概要
• Eucalyputas WikiのSwift/概要のページ
– インストール・設定方法など
– Eucalyputs 日本語 Wikiに記載
– http://eucalyptus.linux4u.jp/wiki/
• CloudFiles
– http://tech-rumble.blogspot.com/2009/08/rackspacecloudfiles.html
• CloudFiles API
– http://www.rackspacecloud.com/cloud_hosting_products/files/api
• CyberDuck
– http://cyberduck.ch/
おわりに(のおまけ)
• 今回没になったネタ
– 各種サーバの設定
– Swiftのメッセージの流れ
• エルシャダイ
– http://elshaddai.jp/
• エルシャダイWiki
– http://www16.atwiki.jp/enoch/pages/1.html
– セリフ集