MogileFS::Client と MogileFS 内部でのファイルノード管理
※本記事は、旧 Tech Talk Blog 内の 「MogileFS::Client と MogileFS 内部でのファイルノード管理 (http://www.sixapart.jp/techtalk/2006/10/mogilefsclient_mogilefs.html) 」 で公開されていた記事を移転しました。
酒井です。今回は MogileFS の Client API について簡単に紹介したいと思います。また、MogileFS 内でのファイルのノード管理方法についても少し触れてみたいと思います。
MogileFS::Client で利用できる機能
MogileFS::Client モジュールが Perl の Client API ライブラリです。PHP や Java を利用した Client API ライブラリもあるようですが、配布物に含まれているのは Perl の API のみです。
現在の最新バージョン(revesion 421)では以下のメソッドが利用可能です。
コンストラクタ
- new({ host, domain, timeout })
- tracker の IPアドレス/ポート番号 (host)と、MogileFS の domain を指定し、インスタンスを生成します。
ファイル操作系
- new_file($key, $class )
- 新規にファイル作成するためのファイルハンドラを作成します。
- store_content($key, $class, $content)
- new_fileした後に、$content の値を書き込み、ファイルハンドルを close します。
- store_file($key, $class, $file)
- new_fileした後に、$file で指定されたファイルの内容を書き込み、ファイルハンドラを close します。
- delete($key)
- ファイルを削除します。
- get_file_data($key)
- ファイルを読み込みます。
key 操作系
- get_paths($key)
- ファイルの URL を返します。
- list_keys($prefix, $after, $limit )
- $prefix で始まる key を返します。
- rename($from_key, $to_key)
- $form_key から $to_key に key を変更します。
インスタンス状態操作系
- readonly($boolean)
- このインスタンスをファイル読み込み専用のインスタンスにしたり、それを解除したりします。
- reload({ host })
- 指定した trackers に再接続し、インスタンスを生成しなおします。
- set_pref_ip($ip)
- 複数の tracker がある場合、指定した ip で稼動している tracker を優先的に使用します。
- sleep($seconds)
- $seconds 秒だけ trackers を sleep させます。
エラー処理系
- errcode()
- 最後に発生したラーのエラーコードを返します。
- errstr()
- 最後に発生したエラーのエラーメッセージ文字列を返します。
サンプル:新規作成して、読み込んで表示。
#!/usr/bin/perl
use strict;
use warnings;
use MogileFS::Client;
## MogileFS インスタンス作成
my $mogfs = MogileFS::Client->new(
domain => 'sixapart',
hosts => [ '127.0.0.1:7001' ],
);
die "Unable to initialize MogileFS object."
unless $mogfs;
## key 名 "hello" のファイルを normal クラス(mindevcount=2)で新規ファイル作成
my $fh = $mogfs->new_file("hello", "normal")
or die $mogfs->errstr;
## 書き込み
$fh->print("Hello, MogileFS!!")
or die $mogfs->errstr;
## 閉じる
$fh->close
or die $mogfs->errstr;
## key 名 hello のファイルを読み込んで表示
my $data = $mogfs->get_file_data("hello");
die $mogfs->errstr unless $data;
print $$data . "\n";
MogileFS 内部でのファイルノード管理
上記のサンプルを実行した場合を例に、MogileFS 内部でのファイルのノード管理を少し追いかけてみたいと思います。
% perl hello.pl
Hello, MogileFS!!
% ls /var/mogdata/**/*.fid
/var/mogdata/dev1/0/000/000/0000000012.fid
/var/mogdata/dev2/0/000/000/0000000012.fid
MogileFS 内部で管理されている VFS 上のファイルの拡張子は .fid です。今回は前回の初期設定時に作成した、mindevcount = 2 の normal class を指定したので dev1, dev2, 2つの device にコピーされています。コピーされる device は使用可能なもの (status = alive) の中からランダム選ばれます。
ここで、データベースの中を少しのぞいてみます。
% mysql -u mogile -p mogilefs
mogilefs> select * from file;
+-----+------+-------+--------+---------+----------+
| fid | dmid | dkey | length | classid | devcount |
+-----+------+-------+--------+---------+----------+
| 12 | 1 | hello | 17 | 1 | 2 |
+-----+------+-------+--------+---------+----------+
1 row in set (0.00 sec)
mogilefs> select * from file_on;
+-----+-------+
| fid | devid |
+-----+-------+
| 12 | 1 |
| 12 | 2 |
+-----+-------+
2 rows in set (0.00 sec)
MogileFS ではファイルを fid と呼ばれる id で管理し、file テーブルでファイルの key, class を保存しています。また、file_on テーブルではファイルがどの device にコピーされているかが管理されています。
これらと、device、host の情報をあわせ、ファイルの URL を組み立て操作します。
- key から fid を取得(file テーブル)→ /0/000/000/0000000012.fid が決定する
- fid から device id を取得(file_on テーブル)→ /dev1, /dev2 が決定する
- device id から host id を取得(device テーブル)
- host id から host 情報を取得 (host テーブル) → http://localhost:7500 が決定する
以上から、"hello" の実体を指し示す最終的な URL、
- http://localhost:7500/dev1/0/000/000/0000000012.fid
- http://localhost:7500/dev2/0/000/000/0000000012.fid
が出来上がります(get_paths() で取得できる URL もこれです)。
mogtool
コマンドラインから MogileFS にファイルを出し入れするには、utilties に含まれている mogtool というコマンドが利用できます。ただ、単純にファイルの出し入れをするだけでなく、
- gzip で圧縮してファイルを保存
- 大きなファイルを分割して保存
- MD5 チェックサムでファイルの検証
- ファイルに簡単な説明を付け加えて保存
- ファイルを保存しつつ指定メールアドレスに詳細を連絡
など、いろいろな機能もついていたりして、とても便利なツールになっています。
オプションの詳細については man mogtool で確認できますので参照してください。
もうすこしだけ続きます...
今回紹介したサンプルでは、get_file_data() でファイルを取得し出力するという内容でしたが、Web アプリでの利用を考えた場合、このような使い方をするのはあまり効率がよいとはいえません。次回はその辺の構成などについて、Apache2::Mogile::Dispatch や Perlbal を使う例を紹介したいと思います。
Six Apart をフォローしませんか?