OpenStack Swift and ProxyFS
こんにちは、NTTの露崎です。
今日はOpenStack® Swiftを紹介した日本OpenStackユーザ会第41回勉強会のレポートと、そこで紹介したOpenStack SwiftのエコシステムであるProxyFSの使い方、設定の仕方について紹介したいと思います。
日本OpenStackユーザ会第41回勉強会
日本OpenStackユーザ会第41回勉強会は1月18日(金)に虎ノ門にあるKDDI DEGITAL GATEを会場にお借りして開催されました。OpenStackの様々な機能や動向を紹介してきた勉強会ですが、今回はオブジェクトストレージ OpenStack Swiftをテーマに全3本の発表が実施されました。
発表は主に、筆者の露崎から、OpenStack Swiftの概要紹介(基本的なアーキテクチャと利用シーン)、最近導入された機能や性能改善への取り組み、エコシステムについて紹介させて頂き、NTTテクノクロス社須田さんよりOpenStack Swiftが現在取り組んでいる小さいファイル向けの性能改善の紹介、NEC元木さんから、それらを含めたOpenStack全体の動向についてご紹介頂きました。
OpenStack SwiftはOpenStack創設当初から存在し、商用実績もある安定したプロダクトですが、その最新動向やエコシステムについては意外と知られておらず、この勉強会を通じてその方向性などが共有できたと思います。勉強会で出た質問等のログはEtherpadに残っていますので、こちらもチェックして見てください。
また、次回の勉強会についても既に募集が始まっています。NTTドコモ様、LINE様の事例紹介とOpenStackの大規模運用に関する検討や課題のディスカッションを弊社の田町オフィスにて開催予定ですのでご都合が合う方は是非ご参加ください。
Swift Eco-System — ProxyFS
さてここからは勉強会で解説したOpenStack SwiftのEco-SystemであるProxyFSについて触れていきます。実際にインストールする方法や操作の仕方を解説しますので、概要のみを知りたい方は勉強会資料の方を参照すると良いと思います。
ProxyFSはOpenStack Swift上のデータをファイルシステム経由でアクセス可能とするソフトウェアです。ProxyFSはApache 2.0のライセンスで提供されているオープンソースソフトウェアでGo言語で書かれています。
ProxyFSの最大の特徴は単にOpenStack Swiftのオブジェクトを簡易的なファイルシステムとしてエミュレートするわけではなく、OpenStack Swift上にLog-Structuredファイルシステムを構築し、完全なファイルシステムの操作を提供します。またファイルシステム経由で書かれたデータをSwiftのオブジェクトストレージAPI経由でも操作可能な点に特徴があり、この設計によって、OpenStack Swiftのスケーラビリティや対障害耐性の恩恵を受けつつ、ユーザにとっては使いやすいファイルシステムのAPIをサポートすることが可能になっています。
具体的なアーキテクチャやデータ管理のWorkFlowは公式HPで確認できますので、ここでは早速、動かしてみたいと思います。
まずはOpenStack Swiftの実行環境を用意します。既にOpenStack Swiftの環境をお持ちの方は読み飛ばして頂いて大丈夫です。私の知る限り最も簡単にOpenStack Swiftを利用する方法はVagrant Swift All In Oneを使う方法なので、こちらを紹介します。
VagrantとVirtualBoxがインストールされている環境であれば
git clone https://github.com/swiftstack/vagrant-swift-all-in-one.git
cd vagrant-swift-all-in-one
vagrant up
の3ステップでOpenStack SwiftのインストールされたUbuntu 16.04がVirtualBox上に立ち上がります。立ち上がった環境には vagrant ssh
でログインできます。ProxyFSではProxyFSを会したデータの読み書きに認証のないOpenStack SwiftのProxyサーバを必要としますがVagrant Swift All In Oneではデフォルトで localhost:8090
に設定してくれますので、こちらについての追加の設定は必要ありません。
次にProxyFSのセットアップを行います。
若いプロジェクトなのであまり設定に関するdocsがまだなさそうですが、とりあえず、go言語をinstallしておきます。例えば私の環境では
ubuntu@saio:~$ echo $GOPATH
/home/ubuntu/go
ubuntu@saio:~$ go version
go version go1.10.1 linux/amd64
という設定が入ってます。ちょっと古いですが、公式では Install/update to at least Go 1.8.3
と言っているので大丈夫でしょう。Go言語のインストールが終わったら、次はProxyFSをダウンロードします。
ubuntu@saio:~$ mkdir -p $GOPATH/src/github.com/swiftstack
ubuntu@saio:~$ cd $GOPATH/src/github.com/swiftstack
ubuntu@saio:~/go/src/github.com/swiftstack$ git clone https://github.com/swiftstack/ProxyFS.git
ubuntu@saio:~/go/src/github.com/swiftstack$ cd ProxyFS
ubuntu@saio:~/go/src/github.com/swiftstack/ProxyFS$ git checkout 1.6.4
ubuntu@saio:~/go/src/github.com/swiftstack/ProxyFS$ git submodule update --init --recursive
こんな感じです。公式ではgitプロトコルで紹介されていますが自分は Permission Denied
で怒られてしまったのでhttps経由で実施しました。httpsで実施するには git submodule
する際の参照先もhttpsに変更する必要があります。また、記事作成時の最新は 1.9.0
なのですが go
のバージョンによるものなのかビルドで警告が出るので、動作確認実績のある 1.6.4
にチェックアウトしています。
git submodule
まで完了したら基本的な資材はダウンロードできていますので次にProxyFSをビルドします。公式ではテストを実行するため ./regression_test.py
を実行しろと書いてありますが、色々とつまづいたのと冗長なものもありそうだったので、オススメは
ubuntu@saio:~/go/src/github.com/swiftstack/ProxyFS$ make
です。リポジトリの直下にMakefileがありますので、こちらを使ってコンパイルしていきます。但し、こちらもそのままでは動かなかったのdiffをgistにまとめました。変更点としてはSamba VFSのビルドにSambaモジュールが必要だったので取り除いた(Linuxでの動作のみでよかったため)のとProxyFSのモジュールがlint違反をしていてテストが通らなかったのを外したのみです。Makefileの修正が必要なあたりが、まだ若いプロジェクトらしいですね。
正しく make
が進行すると go fmt
、 go generate
、 go install
、 go test
、python言語の tox
、及び、必要なC言語のモジュールの make
が実行されProxyFSの実行に必要な proxyfsd
と mkproxyfs
がインストールされます。
次に、OpenStack SwiftでProxyFS経由でアクセスされたファイルを読み書きするための設定追加します。OpenStack Swiftからの双方向読み書きが不要な場合はこの設定はスキップできます。
Swift All In Oneでは認証付きProxyサーバの設定は /etc/swift/proxy-server/proxy-server.conf.d/20_settings.conf
にあるのでこちらを編集します。
[filter:pfs]
use = egg:pfs_middleware#pfs
proxyfsd_host = 127.0.0.1
proxyfsd_port = 12345[filter:tempauth]
use = egg:swift#tempauth
<中略>
user_proxyfs_peer0 = proxyfs .admin
このように [filter:pfs]
のセクションを追加し、 [filter:tempauth]
のセクションに proxyfs
ユーザーを追加します。 proxyfs
ユーザは、この後ファイルシステムを作成し利用するユーザのアカウントになります。各セクションを追加したら最後に pfs
middlewareをpipelineの dlo
と versioned_writes
の間に挿入します。サンプルとしては
[pipeline:main]
pipeline = catch_errors healthcheck proxy-logging cache listing_formats container_sync bulk tempurl s3api tempauth staticweb slo dlo pfs versioned_writes symlink keymaster encryption proxy-logging proxy-server
のような形です。編集が完了したらこの設定を反映するために swift-init main restart
でOpenStack Swiftを再起動しましょう。なお、OpenStack Swiftの認証系の設定に関する情報はこちら、Middlewareの仕組みについてはこちらにドキュメントがあります。
ProxyFSとOpenStack Swiftの設定が完了したら、次はProxyFSでアクセスするファイルシステムを初期化します。先ほどビルドされた mkproxyfs
コマンドを利用します。 mkproxyfs
はOpenStack Swiftのアカウントに対してファイルシステムを構築します。標準の設定は $GOPATH/src/github.com/swiftstack/ProxyFS/proxyfsd/default.conf
にまとまっていて、ほぼそのまま流用できますが、今回の環境で実行するために必要だった変更がありますので、こちらもgistにまとめておきました。主に、利用するIPアドレス、アカウントやSwiftへの保存の仕方の設定をSwift All In One向けに変更する、といった作業です。今回ファイルシステムとして作成するボリュームの CommonVolume
については 先ほど設定した、AUTH_proxfs
というアカウントを利用領域を作るアカウントとして設定しています。
ここまでくればもう一息です。必要なProxyFSとOpenStack Swiftの設定は整っていますので以下のコマンドでProxyFSのボリュームを初期化します。
ubuntu@saio:~$ mkproxyfs -I CommonVolume /etc/proxyfsd.conf
その出力に下記のようなメッセージが何回か出ますが正常です。
time="2019-01-29T08:45:02.985313Z" level=error msg="swiftclient.containerHead(\"AUTH_proxyfs/.__checkpoint__\") got readHTTPStatusAndHeaders() bad status" error="HEAD AUTH_proxyfs_test3/.__checkpoint__ returned HTTP StatusCode 404" function=containerHead goroutine=1 package=swiftclient
level=error
となっていますが、事前にアカウントがないか、上書きしないかチェックをしているのでそのリクエスト結果が出力されています。念のため初期化が成功しているかを見るには認証なしProxyサーバで下記の curl
コマンドを打って、
ubuntu@saio:~$ curl http://localhost:8090/v1/AUTH_proxyfs
.__checkpoint__
この .__checkpoint__
コンテナが作られていれば大丈夫です。
これでようやく準備が整いました。ProxyFSを起動します。ProxyFSはデフォルトでフォアグランドで立ち上がるので回避する場合は &
をつけるか screen
でも起動しておくといいでしょう
ubuntu@saio:~$ proxyfsd /etc/proxyfsd.conf
これで proxyfsd
が立ち上がり、ファイルシステムが /mnt/CommonMountPoint
上にマウントされています。
ubuntu@saio:~$ mount
<中略>
/mnt/CommonMountPoint on /mnt/CommonMountPoint type fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000,allow_other)
これで /mnt/CommonMountPoint
上で新しいファイルの作成なり、エディタを使った編集なりができるようになりました。また、 /mnt/CommonMountPoint
配下に作ったディレクトリは1階層まではコンテナとして扱われます。例えば
ubuntu@saio:~$ mkdir -p /mnt/CommonMountPoint/proxyfs
ubuntu@saio:~$ echo 'hello world!' > /mnt/CommonMountPoint/proxyfs/test_file
のようにファイルを作成し、これをOpenStack SwiftのAPIで眺めてみます。認証情報は先ほどProxyサーバで設定した user_proxyfs_peer0 = proxyfs .admin
を使います。
ubuntu@saio:~$ curl http://localhost:8080/auth/v1.0 -H 'X-Auth-User: proxyfs:peer0' -H 'X-Auth-Key: proxyfs' -v
こちらで X-Auth-Token
を取得して…
ubuntu@saio:~$ curl http://localhost:8080/v1/AUTH_proxyfs/proxyfs/test_file -H 'X-Auth-Token: <取得したToken>'hello world!
先ほど作成したファイルを取得できました!
これでProxyFSのマウントしたファイルシステム、OpenStack Swiftの両方のAPIからのアクセスが確認できました。例では扱いませんでしたがOpenStack Swiftでアップロードしたファイルをエディタで編集する、といった操作も可能になっていますので、ここまで設定された方は是非色々と動作を試していただければと思います。
最後にProxyFSはまだ若いプロジェクトで制約等もありますが、今後も仕組みを改善していく予定です。githubでのissue対応やSlackでの議論にも積極的ですので、興味があれば、是非、覗いてみてください。
おわりに:
私たちNTTは,オープンソースコミュニティで共に活動する仲間を募集しています.ぜひ弊社 ソフトウェアイノベーションセンタ紹介ページ及び,採用情報ページをご覧ください.