OpenStack Swift and ProxyFS

Kota Tsuyuzaki
nttlabs
Published in
14 min readJan 29, 2019

こんにちは、NTTの露崎です。

今日はOpenStack® Swiftを紹介した日本OpenStackユーザ会第41回勉強会のレポートと、そこで紹介したOpenStack SwiftのエコシステムであるProxyFSの使い方、設定の仕方について紹介したいと思います。

日本OpenStackユーザ会第41回勉強会

日本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をサポートすることが可能になっています。

ProxyFS Concept (出典: https://proxyfs.org/index.html)

具体的なアーキテクチャやデータ管理の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 fmtgo generatego installgo test 、python言語の tox 、及び、必要なC言語のモジュールの make が実行されProxyFSの実行に必要な proxyfsdmkproxyfs がインストールされます。

次に、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の dloversioned_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は,オープンソースコミュニティで共に活動する仲間を募集しています.ぜひ弊社 ソフトウェアイノベーションセンタ紹介ページ及び,採用情報ページをご覧ください.

--

--

Kota Tsuyuzaki
nttlabs
Writer for

Research Engineer at Nippon Telegraph and Telephone Corporation (NTT). OpenStack Swift core team member, OpenStack Storlets Project Team Lead.