2008-06-13

MogileFS を Feodra7 on coLinux に yum で入れてみた

はてなブックマーク   livedoor clip

日野原です。

今、分散ファイルシステムが熱いです。負荷分散とか冗長化とかを考えていると、当然ファイルシステムも分散させたくなるのです。…なりますよね?

というわけで手元の Fedora7 on coLinux に分散ファイルシステムの一つの実装である MogileFS を入れてみました。

ただ、CPAN を使える人向けの情報はこのページ(Six Apart – Tech Talk Blog: MogileFS のインストールと初期設定)にすでにあるので、今回は perl をちゃんと使ったことがなくてもできるやり方でインストールしてみました。正確に言うと私が CPAN を使って入れようとしてできなかったので回避しただけなんですけど…

というわけでインストールの手順は独自ですが、その後の初期設定などは前述のページで説明されているやり方とほとんど同じです。

前提となる環境は Fedora7 (coLinux) で yum と vi と svn、make が使える状態です。

まず、必要とされているパッケージをインストールします。先ほども言ったように CPAN は使わずに yum でインストールします。とある CPAN Author に言わせると「yum で perl のモジュールを入れる感覚が受け付けない」そうですが、私は perl はまともに使ったことがないので違和感なしです。まぁ、私も yum で ActiveRecord とかをインストールされるとしょんぼりするので同じようなものなのでしょう。

% sudo yum install perl-Net-Netmask perl-Danga-Socket perl-IO-AIO \
Perlbal mysql-server

次に MogileFS も yum で提供されているので入れてしまいます。
そういえば、上で入れた yum は MogileFS を入れるときに依存関係で勝手に入ったかもしれないですね…

% sudo yum install perl-MogileFS-Client perl-MogileFS-Utils

で、これだけだとMogileFSのリポジトリのサブディレクトリの api と utilities に相当する部分しか入らないので、server の部分は自分でコンパイルします。

% svn co http://code.sixapart.com/svn/mogilefs/trunk mogilefs
% cd mogilefs/server
% perl Makefile.PL

ここで ExtUtils/MakeMaker.pm がないと言われるので入れます。

% sudo yum install perl-ExtUtils-MakeMaker
% perl Makefile.PL
Checking if your kit is complete...
Looks good
Warning: prerequisite Gearman::Client 1.07 not found.
Warning: prerequisite Gearman::Client::Async 0.93 not found.
Warning: prerequisite Gearman::Server 1.08 not found.
Writing Makefile for mogilefs-server

問題ないらしいですが、せっかくなのであった方がいいと言われている(らしい) Gearman も入れてしまいましょう。

% sudo yum install perl-Gearman perl-Gearman-Client-Async \
perl-Gearman-Server
% perl Makefile.PL
Writing Makefile for mogilefs-server

問題なさそうです。これでインストールしてしまいます。

% make
% sudo make install

これでインストールは完了です。ここから初期設定に入ります。

まずは mysql の起動とパスワードの設定

% sudo /etc/init.d/mysqld start
% mysqladmin -u root password 'rootpass'

次に MogileFS の DB スキーマを作成します。

% mogdbsetup --dbrootpass=rootpass --dbpass=mogpass

いろいろ聞かれても yes でいいです。面倒なら –yes オプションをつけるといいらしい。

ここ以降は前述のページの説明とほとんど一緒ですが、一応書いておきます。

ここからは tracker の設定です。
まずは mogilefsd 用のユーザを作ります。

% sudo /usr/sbin/useradd -s /sbin/nologin mogile

次に設定ファイルを。

% sudo mkdir /etc/mogilefs
% sudo cp conf/mogilefsd.conf /etc/mogilefs
% sudo vim /etc/mogilefs/mogilefsd.conf

変更点は daemonize の行のコメント解除と db_user、db_pass の設定です。

daemonize = 1
db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
db_user = mogile
db_pass = mogpass
listen = 127.0.0.1:7001
conf_port = 7001
listener_jobs = 10
delete_jobs = 1
replicate_jobs = 5
mog_root = /mnt/mogilefs
reaper_jobs = 1

で、mogilefsd を起動します。

% sudo -u mogile mogilefsd

次は mogstored です。

リポジトリに入っていた mogstored の config ファイルは古い形式らしくて使えないので、新しく作成します。内容は3行だけです。

% cat /etc/mogilefs/mogstored.conf
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /var/mogdata

で、docroot に指定したディレクトリを作成し、起動します。

% sudo mkdir /var/mogdata
% sudo mogstored -d

後は件のサイトの説明に従い使えるようにしていきます。

% mogadm host add localhost --port=7500
% sudo mkdir /var/mogdata/dev1
% sudo mkdir /var/mogdata/dev2
% sudo mkdir /var/mogdata/dev3
% mogadm device add localhost 1
% mogadm device add localhost 2
% mogadm device add localhost 3
% mogadm host mark localhost alive
% mogadm check
Checking trackers...
127.0.0.1:7001 ... OK

Checking hosts...
[ 1] localhost ... OK

Checking devices...
host device         size(G)    used(G)    free(G)   use%   ob state   I/O%
---- ------------ ---------- ---------- ---------- ------ ---------- -----
[ 1] dev1             3.777      1.257      2.520  33.28%  writeable   0.0
[ 1] dev2             3.777      1.257      2.520  33.28%  writeable   0.0
[ 1] dev3             3.777      1.257      2.520  33.28%  writeable   0.0
---- ------------ ---------- ---------- ---------- ------
total:    11.331      3.771      7.559  33.28%

ここまでで、とうとう ruby の mogilefs-client からさわれるようになりました。

しかし長くなってしまったので、ruby からさわるのは次回にします。
お楽しみに。

補足として、別の環境でやってはまったときの解決策も書いておきます。

mogstored を実行したときに

Weak references are not implemented in the version of perl …

というエラーが出てしまった場合、Scalar::Util を入れ直すと直ります。perl 使いの間では有名なエラーだそうです。

あと、MySQL を独自にビルドしていて socket の位置が異なる場合、
/usr/lib/perl5/site_perl/5.8.8/MogileFS/Store/MySQL.pm
の15行目(私の環境のパスです)を

return "DBI:mysql:$dbname;host=$host;mysql_socket=/tmp/mysql.sock"
               . ($port ? ";port=$port" : "");

と書き換えれば(/tmp/mysql.sockの部分はsocketの位置にしてください)とりあえず動きます。けど本当にとりあえずなのでオススメしません。自分しか困らない開発環境でだけやってください。