【備忘録】okuyamaFuseでハマったのでメモ


okuyama_logo

okuyamaとはKVSの特徴を生かし、
データをディスクやメモリに保存し、分散してアクセスする機能を持ったファイルシステムですが、
通常のファイルシステムと異なり、専用のクライアントからしか利用する事ができません。

FUSE(Filesystem in Userspace)というユーザー空間でファイルシステムとして実装できるようにし、
okuyamaを上記方法で従来通りのファイルシステムとして利用できるようにしたのがokuyamaFuseです。

現在@ITでokuyamaFuseの記事が掲載されていますが、
okuyamaFuseをCentOS6で構築する際にハマったのでメモを残しておきます。

■okuyamaの構築

okuyamaFuseが利用するための元となるokuyamaを構築します。
特に設定はしていませんので構築は簡単です。

・前提パッケージのインストール

yum -y install fuse* ant

・okuyamaユーザの追加、okuyamaのダウンロード、実行

useradd okuyama
passwd okuyama
su okuyama
wget http://iij.dl.sourceforge.jp/okuyama/57589/okuyama-0.9.4.zip
unzip okuyama-0.9.4.zip
cd okuyama-0.9.4
/usr/bin/ant serverrun

■okuyamaFuseの構築

okuyamaFuseを構築するために必要となるFUSE-Jを構築します。これがかなりハマりました。

・Java SEダウンロードページよりJDKをダウンロード
wgetで上記ファイルをダウンロードします。

tar xvzf jdk-7u25-linux-***.tar.gz

・/opt/jdkに解凍したファイルを移動

mv jdk1.7.0_25 /opt/jdk

・FUSE-Jの構築
・FUSE-Jのダウンロード

wget http://downloads.sourceforge.net/project/fuse-j/fuse-j/FUSE-J%202.4%20prerelease1/fuse-j-2.4-prerelease1.tar.gz
tar -xvzf fuse-j-2.4-prerelease1.tar.gz
mkdir fuse-j-2.4-prerelease1/build

・環境に合わせるためbuild.confを修正

vi fuse-j-2.4-prerelease1/build.conf
--------------------------------------------------
# JDK 1.5 or greater HOME
JDK_HOME=/opt/jdk

# FUSE library & headers base directory
FUSE_HOME=/usr/include
--------------------------------------------------

・環境に合わせるためjniのMakefileを修正

vi fuse-j-2.4-prerelease1/jni/Makefile
--------------------------------------------------
(変更前)
INCLUDES := -I${FUSE_HOME}/include -I${JDK_HOME}/include -I${JDK_HOME}/include/linux

(変更後/i386用)
INCLUDES := -I${FUSE_HOME}/include -I${JDK_HOME}/include -I${JDK_HOME}/include/linux -L/opt/jdk/jre/lib/i386/server
(変更後/x86_64用)
INCLUDES := -I${FUSE_HOME}/include -I${JDK_HOME}/include -I${JDK_HOME}/include/linux -L/opt/jdk/jre/lib/x86_64/server
--------------------------------------------------

・FUSE-Jのコンパイル

cd fuse-j-2.4-prerelease1
make all

コンパイル完了後にjni/libjavafs.soが作られたらOKです。
・okuyamaFuseの準備

mkdir /home/okuyama/okuyamaFuse
cp /home/okuyama-0.9.4/okuyama-0.9.4.jar /home/okuyamaFuse/
cp /home/okuyama-0.9.4/okuyamaFuse/lib/fuse-j-2.4/lib/commons-logging-1.0.4.jar /home/okuyamaFuse/
cp /home/okuyama-0.9.4/okuyamaFuse/lib/fuse-j-2.4/fuse-j.jar /home/okuyamaFuse/
cp /home/okuyama-0.9.4/okuyamaFuse/okuyamaFuse-0.0.1.jar /home/okuyamaFuse/
cp /home/okuyama-0.9.4/lib/javamail-1.4.1.jar /home/okuyamaFuse/
cp /home/fuse-j-2.4-prerelease1/jni/libjavafs.so /home/okuyamaFuse/

・okuyamaFuseの起動&マウント
前提ファイルのコピーが終わったokuyamaFuseのディレクトリへ移動し、okuyamaFuseを起動します。

cd /home/okuyamaFuse
LD_LIBRARY_PATH=./:/lib \
/opt/jdk/bin/java -classpath ./okuyamaFuse-0.0.1.jar:./fuse-j.jar:./commons-logging-1.0.4.jar:./okuyama-0.9.4.jar:./javamail-1.4.1.jar \
-Dorg.apache.commons.logging.Log=fuse.logging.FuseLog \
-Dfuse.logging.level=INFO \
-Xmx1024m -Xms1024m \
-server -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseParNewGC \
fuse.okuyamafs.OkuyamaFuse \
-f -o allow_other \
/mnt \
localhost:8888

・起動メッセージ
上記コマンドの実行により以下のメッセージが表示されます。
エラーが出る場合には、okuyamaが起動しているか、マウント先が存在しているかを確認してください。

15:27:48.312     main  INFO [fuse.okuyamafs.OkuyamaFilesystem]: okuyama file system init start...
15:27:50.156     main  INFO [fuse.okuyamafs.OkuyamaFilesystem]: okuyama file system init end...
15:27:50.180     main  INFO [fuse.FuseMount]: Mounting filesystem

・動作確認
dfを叩いてみましたが、
readmeにあるようにβ版のため11TB固定となる他、ディレクトリ全体の容量は増減しませんでした。

$ df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/sda2              20G  2.3G   17G  13% /
tmpfs                 503M     0  503M   0% /dev/shm
/dev/sda1             194M   40M  144M  22% /boot
javafs                 11T     0   11T   0% /mnt

β版状態とは言え、一通り読み書きができるレベルとなっているようです。
分散ファイルシステムは多数がAPI操作を必要とし、
FUSE経由でマウントできる物はあまり例がありませんので、今後の発展に期待したいところです。

今回用意したマシンスペックの問題も少なからずありそうですが、
okuyamaとokuyamaFuseを実行したのみで800MB近いメモリ消費と、
CPUもokuyamaで1コア×1.5GHz分ほど消費される他、
パフォーマンスも最大で5MB/s、通常は1MB/s前後とあまり振わない結果でした。

次回の@IT記事更新でパフォーマンスチューニングの内容に期待しつつ、
改めて4コア程度のマシンで環境を構築してディスク別・メモリ別でベンチマークを取ってみたいと思います。

最新ブログ一覧