
「楽天クラウド オブジェクトストレージ」をファイルシステムとして直接マウントしてみた。
朴 建一
クラウドプラットフォーム技術部 クラウド基盤運用グループ
オブジェクトストレージのマウントツール
「楽天クラウド オブジェクトストレージ」は低価格、無制限で使えるデータ保全性に優れたサービスです。
次のようなインターフェースに対応しています。
・API(HTTPS)
・GUI:オブジェクトストレージポータル
オブジェクトストレージでは、データの読み書きをHTTP(RestAPI)ベースで行います。
アプリケーションからデータを読み書きする場合は、SDKを利用することも可能ですが、S3バケットをOSにマウントして使用することも期待されています。
今回はマウントツールに有名なs3fsと、GOLANGで開発されたgoofys、この2つのOpensourceを使い「楽天クラウド オブジェクトストレージ」を「楽天クラウドRed Hat OpenStack Platform」環境のインスタンス(仮想サーバー)上にマウントし、サーバーのディスクとして活用する方法をご紹介します。
環境
セキュリティキー証明書確認
「楽天クラウド オブジェクトストレージ」ポータルにアクセスします。
https://console.objectstorage.rakuten-cloud.net/
右上のUserID部分から、「セキュリティ証明書」をクリックします。
表示される画面より「アクセスキーID」と「シークレットキー」を確認しメモしておいてください。
s3fsの紹介
s3fs はFUSE(Filesystem in Userspace)(※)を利用してS3のバケットを Linux または Mac OS X 上にマウントさせるツールです
・s3fs-fuse/s3fs-fuse · GitHub: https://github.com/s3fs-fuse/s3fs-fuse
「楽天クラウド オブジェクトストレージ」をファイルシステムとして使うことができ、S3 APIを利用しなくてもファイルの入出力ができます。
※FUSE(Filesystem in Userspace)
Unix系コンピュータオペレーティングシステム用のソフトウェアインタフェースである。権限を持たないユーザーがカーネルコードを修正することなく独自のファイルシステムを作成できる機能を提供する。これは、ファイルシステムのコードをユーザー空間で実行することでなされるもので、その際FUSEモジュールは実際のカーネルインタフェースへの「橋渡し」しか提供しない。(参考:ウィキペディア - Filesystem in Userspace)
s3fsのインストール
必要パッケージをインストールします。
# yum install automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel
s3fsをインストールします。
# yum install epel-release
# yum install s3fs-fuse
Version確認します。
# s3fs --version
Amazon Simple Storage Service File System V1.87 (commit:unknown) with OpenSSL
Copyright (C) 2010 Randy Rizun <rrizun@gmail.com>
License GPL2: GNU GPL version 2 <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
まず、S3への接続に利用するパスワードファイルを作成します。
# echo "[access_key]:[secret_access_key]" > /etc/passwd-s3fs
# chmod 600 /etc/passwd-s3fs
※[access_key]:[secret_access_key]は上記「セキュリティ証明書」を参照します。
マウントするディレクトリを作成します。
# mkdir -p /s3fs
S3バケットを作成します。
「楽天クラウド オブジェクトストレージ」ポータルにアクセスします。
「新規バケット追加」をクリックし、例:「s3fs-bucket」と入力し、「作成」をクリックします。
マウントします。
# s3fs bucket[:/path] mountpoint [options]
↓記入例
# s3fs s3fs-bucket /s3fs -o allow_other,url=https://s3.jp3.objectstorage.rakuten-cloud.net,endpoint=jp3,passwd_file=/etc/passwd-s3fs
マウント確認
# df -Th
Filesystem Type Size Used Avail Use% Mounted on
s3fs fuse.s3fs 256T 0 256T 0% /s3fs
アンマウントします。
# umount /s3fs
OS起動時に自動マウントするため、/etc/fstabにエントリを追加します。
# vi /etc/fstab
s3fs#[bucket_name] [mountpass] fuse nonempty,allow_other,url=[endpoint],endpoint=[region],passwd_file=[上記作成したパスワードファイル] 0 0
↓追記例
s3fs#s3fs-bucket /s3fs fuse nonempty,allow_other,url=https://s3.jp3.objectstorage.rakuten-cloud.net,endpoint=jp3,passwd_file=/etc/passwd-s3fs 0 0
# mount -a
オプションの説明
マウントを確認します。
# df -Th
Filesystem Type Size Used Avail Use% Mounted on
…
s3fs fuse.s3fs 256T 0 256T 0% /s3fs
…
テストファイルを作成します。
# touch s3fs_test.txt
# ll
total 0
-rw-rw-rw- 1 root root 0 Nov 02 12:24 s3fs_test.txt
「楽天クラウド オブジェクトストレージ」ポータルからファイルの作成を確認します。
s3fs動作確認
ファイル作成します。
# cd /s3fs
# i=1; time while [ $i -le 500 ]
> do
> touch s3fs_test_$i > /dev/null 2>&1
> i=$((i+1))
> done
real 0m36.314s
user 0m0.634s
sys 0m1.341s
ファイル一覧表示します。
# time ls -laR /s3fs > /dev/null
real 0m0.115s
user 0m0.005s
sys 0m0.019s
ddコマンドでファイル作成します。
# cd /s3fs
# dd if=/dev/zero of=ddtest bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 17.0114 s, 61.6 MB/s
CPコマンド実行し、1Gbファイルをローカルへダウンロードします。
# time cp /s3fs/ddtest /ddtest_s3fs_download > /dev/null
real 0m11.152s
user 0m0.037s
sys 0m1.535s
CPコマンド実行し、1Gbファイルをローカルからアップロードします。
# time cp /ddtest_s3fs_download /s3fs/ddtest_upload > /dev/null
real 0m15.713s
user 0m0.022s
sys 0m1.105s
これで動作確認は完了しました。
goofysの紹介
goofysではs3fsと同じく、「楽天クラウド オブジェクトストレージ」をファイルシステムとしてマウントすることができます。パフォーマンスを優先し、ディスク上のデータキャッシュ(checkout catfs)を持たない特徴があります。
また、s3fsよりもパフォーマンスが優れているとされていますが、ファイルコピーは早い一方で、ファイルの編集ができないなど、s3fsよりもPOSIX互換性は落ちるため、使用できるコマンドは少ないです。
・GitHub - kahing/goofys: a Filey System for Amazon S3 written in Go: https://github.com/kahing/goofys
goofysのインストール
まず、関連ツールをインストールします。
# yum install golang fuse git
go 環境設定を行います。
workspace作成
# mkdir -p /usr/local/golang
環境変数設定し反映
# vi ~/.bash_profile
以下を追記
export GOROOT=/usr/lib/golang
export GOBIN=$GOROOT/bin
export GOPATH=/usr/local/golang
export PATH=$PATH:$GOROOT/bin
# source ~/.bash_profile
変数確認
# go env
GOBIN="/usr/lib/golang/bin"
GOPATH="/usr/local/golang"
GOROOT="/usr/lib/golang"
goofysインストール
# go get github.com/kahing/goofys
# go install github.com/kahing/goofys
マウントするディレクトリを作成します。
# mkdir -p /goofys
S3バケットを作成します。
「楽天クラウド オブジェクトストレージ」ポータルにアクセスします。
「新規バケット追加」をクリックし、例:「goofys-bucket」と入力し、「作成」をクリックします。
マウントします。
# goofys [global options] bucket[:prefix] mountpoint
↓記入例
# /root/go/bin/goofys --endpoint https://s3.jp3.objectstorage.rakuten-cloud.net goofys-bucket /goofys
マウント確認
# df -Th
Filesystem Type Size Used Avail Use% Mounted on
goofys-bucket fuse 1.0P 0 1.0P 0% /goofys
アンマウントします。
# umount /goofys
OS起動時に自動マウントするため、/etc/fstabにエントリを追加します。
# vi /etc/fstab
/root/go/bin/goofys #[bucket_name] [mountpass] fuse _netdev,allow_other,--file-mode=XXXX,--dir-mode=XXXX,--endpoint=[endpoint] 0 0
↓追記例
/root/go/bin/goofys#goofys-bucket /goofys fuse _netdev,allow_other,--file-mode=0666,--dir-mode=0777,--endpoint=https://s3.jp3.objectstorage.rakuten-cloud.net 0 0
# mount -a
オプションの説明
マウントを確認します。
Filesystem Type Size Used Avail Use% Mounted on
…
20201014 fuse 1.0P 0 1.0P 0% /root/mount-goofys
…
テストファイルを作成します。
# touch /goofys/goofys_test.txt
# ll
total 0
-rw-rw-rw- 1 root root 0 Oct 30 15:03 goofys_test.txt
「楽天クラウド オブジェクトストレージ」ポータルからファイルの作成を確認します。
goofys動作確認
ファイル作成します。
# cd /goofys
# i=1; time while [ $i -le 500 ]
> do
> touch goofys_test_$i > /dev/null 2>&1
> i=$((i+1))
> done
real 0m10.370s
user 0m0.590s
sys 0m1.241s
ファイル一覧表示します。
# time ls -laR /goofys > /dev/null
real 0m0.123s
user 0m0.002s
sys 0m0.030s
ddコマンドでファイル作成します。
# cd /goofys
# dd if=/dev/zero of=ddtest bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 7.27981 s, 144 MB/s
CPコマンド実行し、1Gbファイルをローカルへダウンロードします。
# time cp /goofys/ddtest /ddtest_goofys_download > /dev/null
real 0m7.033s
user 0m0.039s
sys 0m1.637s
CPコマンド実行し、1Gbファイルをろーかるからアップロードします。
# time cp /ddtest_goofys_download /goofys/ddtest_upload > /dev/null
real 0m0.979s
user 0m0.024s
sys 0m0.953s
これで動作確認は完了しました。
まとめ
今回はS3サービスマウントツールのs3fsとgoofysについてインストール・検証を実施しました。
インストールから検証まで複雑な設定などなく設定しやすかったと思います。
また、容量を気にせずファイルシステムとして使えることは驚きでした。
ただ、s3fsとgoofys、それぞれに特徴があるため、皆さんの環境に合う方を選択してみてください。
またDBのような頻繁にランダムアクセスが行われるケースには向かないので注意が必要です。
オブジェクトストレージをサーバにマウントして使用しようと検討中の方は是非参考にしていただけると嬉しいです。
楽天クラウド:https://cloud.rakuten.co.jp/
朴 建一
インフラエンジニアとして、サーバ設計・構築を担当しています。
10年以上、クラウドやLinux、Zabbixなどを主として職務しており、現在はRakutenオブジェクトストレージ構築担当として従事しています。
韓国のジェジュ島が故郷で海が好きで、泳ぐのが好きです。
永住者になり3人家族と一緒に日本の色んなものを楽しみにしています。
趣味:食べ物(ラーメン)、キャンプ、スキー、食べ物、旅行