Archive for the 'perl' Category

Mar
13

MogileFSのmogstoredは同じホストで複数動かせない

昨日、FreeBSD 6.2上にMogileFS環境を構築するための記事を書きました。今日はMogileFSに実際にストレージスペースの設定をしてファイルを置いてみて、さらにストレージの一部が突然壊れてしまった場合にちゃんとスケールできるかどうか確認するための記事を書こうと思い、記事にするための実験をしていました。
1台のマシンを使って複数台で構成されるMogileFSの環境を作るために、 mogstored を異なるポートで複数起動しようとしたのですが、そこで手詰まりとなりました。1つのホストで動かすことのできる mogstored は1つだけのようです。
次のように2つ分の mogstored の設定ファイルと docroot で指定したディレクトリを用意して、 mogstored を起動させました。
/home/mogile/etc/mogstored1.conf

httplisten=0.0.0.0:7500
mgmtlisten=0.0.0.0:7501
docroot=/home/mogile/var/mogdata1

/home/mogile/etc/mogstored2.conf

httplisten=0.0.0.0:7502
mgmtlisten=0.0.0.0:7503
docroot=/home/mogile/var/mogdata2

% sudo -u mogile mkdir -p /home/mogile/var/mogdata{1,2}
% sudo mogstored –daemonize –config=/home/mogile/etc/mogstored1.conf
% sudo mogstored –daemonize –config=/home/mogile/etc/mogstored2.conf

とりあえず起動はします。

% ps auxww | grep mogstored
root 89967 0.0 2.5 11560 11028 ?? S 3:18PM 0:00.45 mogstored (perl)
root [...]

Mar
12

MogileFSをFreeBSD 6.2上にインストールする

MogileFSという分散ファイルシステムがあります。これは大雑把に言うと、ネットワーク上にある複数台のマシンをストレージとみなすことにより、分散ファイルシステムを実現したものです。MogileFS上に保存するファイルにはプライオリティをつけることができ、その重要度によって必要分だけMogileFS上にコピーが作成されます。各々のストレージマシンは取り外しが簡単にできるようになっていて、突然マシンが故障してファイルが取り出せなくなっても、そのマシンを使わないように設定すれば、他のマシンに保存してあったファイルを元に、また別のマシンに必要分だけコピーが生成されます。
MogileFSについてのもっと詳しい説明は、以下のページがとても参考になります。

Six Apart – Tech Talk Blog: 分散ファイルシステム MogileFS について
Six Apart – Tech Talk Blog: MogileFS のインストールと初期設定

ちなみに、MogileFSはmemcachedで有名なDanga InteractiveのBrad Fitzpatrickさんが開発したものです。
MogileFSはPerlで書かれており、CPANにも登録されているので、CPAN経由でインストールするのが楽そうです。
ですが、MogileFSについてよく知らないし、他の現在運用中の何かと競合してしまっても困るので、完全に独立したディレクトリにPerlをインストールして、そこにsvnから取ってきた最新のMogileFSをインストールすることにしました。
MogileFSのインストール方法は本家のwikiが参考になります。
また、MogileFSの司令塔であるTrackerは非root権限で動作させる必要があるので、MogileFSのための専用のアカウントを作成することにします。

% sudo groupadd mogile -g 60056
% sudo useradd mogile -u 60056 -g mogile -s /usr/sbin/nologin

ユーザmogileのホームディレクトリは /home/mogile になるので、/home/mogile 以下にMogileFS環境を構築していきます。
まずはPerlを /home/mogile/perl にインストールします。
CPANからPerlのソースを取ってきて展開します。

% sudo -u mogile mkdir /home/mogile/src
% cd /home/mogile/src
% sudo -u mogile wget ‘http://www.cpan.org/src/perl-5.10.0.tar.gz’
% sudo -u mogile tar zxvf perl-5.10.0.tar.gz
% [...]

Feb
5

[perl]できることなら1行で

jognote を運用するためのツールをperlで書くことが多々ありますが、できることなら簡潔に書きたいものです。
今回は、そんなperlのちょっとしたtipsについて書こうと思います。
例えば、次のようなコードがあったとします。

my @env;
foreach ( keys %ENV ) {
push @env, “$_=$ENV{$_}”;
}
print join ‘;’, @env;

perl実行時の環境変数を「キー=値」の形で出力し、セミコロンで区切るものです。
でも、これだけのために@envを宣言し、foreach文を書くのもなんだかスマートではない、できればprint文の後ろですべて簡潔してほしいものです。
そこで、evalを使ってforeach文でしていることを関数っぽくしてみます。

print join ‘;’, eval { my $r = ”; $r .= “$_=$ENV{$_}” foreach keys %ENV; return $r; };

これで1行になりました。
また、map を使うと、もっと簡単に書けます。

print join ‘;’, map { “$_=$ENV{$_}” } keys %ENV;

以上、perlのちょっとしたtipsの紹介でした。