MogileFSの冗長化機能のテストをしてみる
昨日の記事で、今度はLinux上にXenのDomainUを複数用意して実験をすると書きましたが、実験環境を用意するのに時間がかかるので、FreeBSD 6.2上の mogstored に複数の device を用意することで、冗長化機能のテストをしたいと思います。
物理的な host を複数台用意しても、その上には device を作成し、ファイルは device の上に作成される domain と class の上に生成されるので、host は1台でも device を複数用意すれば、同じような実験ができるものと考えられます。
さて、今回はMogileFS上の device が突然壊れた場合でもちゃんと冗長化機能が働いているかどうかの実験をしたいと思います。
多くの場合、あるファイルは2個所に存在していれば十分な冗長性が確保できると考えられます。仮に片方のストレージが物理的に壊れてしまっても、もう片方が生きていればファイルの消失は避けられます。2台のストレージが同時に壊れる可能性は、そんなに高くはないでしょう。
MogileFSで2個所のストレージを定義するためには、device を2つ作成する必要があります。
しかし、本当に2つで大丈夫でしょうか?
仮に2つの device うちの1つが壊れたとします。すると、この時にMogileFS上には各々のデータは1つしか存在しないことになります。1つの device が壊れている間に追加されるデータもまた、1つしか作成されていないことになります。
すぐに壊れた device を復旧することができればいいですが、常にそうできるとも限らないので、device は3つ以上あると運用上都合がよいと考えられます。3つのうち1つが壊れてしまっても、壊れたことがわかった時点ですぐにその device をMogileFSから切り離せば(device の状態を dead にする)、その device に保存されていたデータはMogileFSの冗長化機能によって他の2つの device のどちらかに作成されます。この間に新たに追加されるデータもまた、この2つの device 上に作成されます。そして、2つの device で運用できている間に壊れた device を復旧して、また3つの構成に戻せばよいのです。
では、MogileFS上に3つの device を作成してみます。
まずは現在の状態をチェックしてみます。
% sudo -u mogile mogadm --trackers=127.0.0.1:6001 check
Checking trackers...
127.0.0.1:6001 ... OK
Checking hosts...
No devices found on tracker(s).
まだ host も device も登録していないので、何も表示されています。
では、host を登録してみます。
% sudo -u mogile mogadm --trackers=127.0.0.1:6001 host add localhost --status=alive
% sudo -u mogile mogadm --trackers=127.0.0.1:6001 check
Checking trackers...
127.0.0.1:6001 ... OK
Checking hosts...
[ 1] localhost ... OK
Checking devices...
host device size(G) used(G) free(G) use% ob state I/O%
---- ------------ ---------- ---------- ---------- ------ ---------- -----
---- ------------ ---------- ---------- ---------- ------
total: 0.000 0.000 0.000 0.00%
localhostで動作する mogstored を host に登録することができました。--status オプションに alive を指定したので、OK になっています。--status オプションを指定しないとデフォルトでは down です。
続いて device を登録してみます。mogadm コマンドを実行する前に、実際にファイルを格納するためのディレクトリを作成しておきます。
% sudo -u mogile mkdir -p /home/mogile/var/mogdata/dev{1,2,3}
ディレクトリを作成したら、mogadm コマンドにて device を登録します。
% sudo -u mogile mogadm --trackers=127.0.0.1:6001 device add localhost 1 --status=alive
% sudo -u mogile mogadm --trackers=127.0.0.1:6001 device add localhost 2 --status=alive
% sudo -u mogile mogadm --trackers=127.0.0.1:6001 device add localhost 3 --status=alive
% sudo -u mogile mogadm --trackers=127.0.0.1:6001 check
Checking trackers...
127.0.0.1:6001 ... OK
Checking hosts...
[ 1] localhost ... OK
Checking devices...
host device size(G) used(G) free(G) use% ob state I/O%
---- ------------ ---------- ---------- ---------- ------ ---------- -----
[ 1] dev1 62.495 8.305 54.190 13.29% writeable 0.0
[ 1] dev2 62.495 8.305 54.190 13.29% writeable 0.0
[ 1] dev3 62.495 8.305 54.190 13.29% writeable 0.0
---- ------------ ---------- ---------- ---------- ------
total: 187.486 24.915 162.571 13.29%
ちゃと登録できているようです。
それでは domain と class を登録してみます。
% sudo -u mogile mogadm --trackers=127.0.0.1:6001 domain add testdomain
% sudo -u mogile mogadm --trackers=127.0.0.1:6001 domain list
domain class mindevcount
-------------------- -------------------- -------------
testdomain default 2
% mogadm --trackers=127.0.0.1:6001 class add testdomain testclass
% mogadm --trackers=127.0.0.1:6001 class list
domain class mindevcount
-------------------- -------------------- -------------
testdomain default 2
testdomain testclass 2
mindevcount はMogileFS上に最低いくつのコピーを作成するか、という値です。ここでは2なので、2個所にファイルが保存される、ということになります。コピーを作成する数を明示的に指定するためには --mindevcount=3 のようにしてオプションを指定します。
さて、下準備ができたところで、実際にファイルを置いてみましょう。
MogileFS ClientはPerlによるAPIが用意されていますが、プログラムを組まなくても mogtool という付属のツールを使えばとりあえずファイルを置いたり消したりするくらいのことはできます。
では、ファイルを置いてみます。
% echo 'hello mogilefs.' > hellomogilefs.txt
% sudo -u mogile mogtool --trackers=127.0.0.1:6001 --domain=testdomain --class=testclass inject hellomogilefs.txt hellomogilefs
file hellomogilefs: 6effbe3656628417f044194d21ae8559, len = 16
Spawned child 1461 to deal with chunk number 1.
chunk 1 saved in 0.14 seconds.
Child 1461 successfully finished with chunk 1.
Beginning replication wait: 1
% sudo -u mogile mogtool --trackers=127.0.0.1:6001 --domain=testdomain --class=testclass locate hellomogilefs
http://127.0.0.1:7500/dev1/0/000/000/0000000002.fid
http://127.0.0.1:7500/dev3/0/000/000/0000000002.fid
#2 paths found
2個所にファイルが置かれたことがわかります。
では dev1 が壊れたことにして、dev1 のstatusを dead にしてみます。
% sudo -u mogile mogadm --trackers=127.0.0.1:6001 device mark localhost dev1 dead
% sudo -u mogile mogadm --trackers=127.0.0.1:6001 check
Checking trackers...
127.0.0.1:6001 ... OK
Checking hosts...
[ 1] localhost ... OK
Checking devices...
host device size(G) used(G) free(G) use% ob state I/O%
---- ------------ ---------- ---------- ---------- ------ ---------- -----
[ 1] dev2 62.495 8.306 54.190 13.29% writeable 0.0
[ 1] dev3 62.495 8.306 54.190 13.29% writeable 0.0
---- ------------ ---------- ---------- ---------- ------
total: 124.991 16.611 108.380 13.29%
dev1 がなくなりました。dev1 に置かれていたファイルはどうなったでしょうか。
% sudo -u mogile mogtool --trackers=127.0.0.1:6001 --domain=testdomain --class=testclass locate hellomogilefs
http://127.0.0.1:7500/dev2/0/000/000/0000000002.fid
http://127.0.0.1:7500/dev3/0/000/000/0000000002.fid
#2 paths found
ちゃんと dev2 にコピーされていました。
以上、MogileFSのレプリケーション機能がちゃんと動作することが確認できました。画像などデータベースに格納するには大きいデータを冗長性を考慮して保持したい場合には便利なシステムだと思います。