日向夏特殊応援部隊

俺様向けメモ

MogileFS::Plugin::FilePaths, MogileFS::Client::FilePathsを試してみる

はじめに

MogileFS::Client::FilePathsのドキュメントですが、激しく適当に書かれているのと、使い方だとかセットアップの仕方とかは笑えるくらい情報が無いので、ソース嫁しか手段が無い事を予めお断りしておきます。

FilePathsプラグインとは?

MogileFSでは実際のファイルシステムのようにパスが存在する訳では無く、実態としては

  • domain
  • key

によって管理されています。

特定のdomainに存在するファイルの探索はlist_keysメソッドで探すと言う手法しかデフォルトではありません。

で、MogileFSのサーバー側のプラグインとして、FilePathsプラグインと言う物がありますが、こちらを有効にしておくと実際のファイルシステムのようにパスと言う概念を持ち込む事が出来るようになります。

インストール

mogdbsetupコマンドを実行する際にpluginsオプションを付けて実行します。

$ mogdbsetup --plugins FilePaths

ユーザー名とかデータベース名はデフォルトのままだとして、mogilefsデータベースにmysqlコマンドでログインして、

mysql> SHOW TABLES LIKE 'plugin_%';
+-------------------------------+
| Tables_in_mogilefs (plugin_%) |
+-------------------------------+
| plugin_filepaths_domains      | 
| plugin_filepaths_paths        | 
| plugin_metadata_data          | 
| plugin_metadata_names         | 
+-------------------------------+
4 rows in set (0.00 sec)

とするとplugin用のテーブルが生成されているのが分かります。

mysql> desc plugin_filepaths_domains;
+-------+----------------------+------+-----+---------+-------+
| Field | Type                 | Null | Key | Default | Extra |
+-------+----------------------+------+-----+---------+-------+
| dmid  | smallint(5) unsigned | NO   | PRI |         |       | 
+-------+----------------------+------+-----+---------+-------+
1 row in set (0.00 sec)

このテーブルですが、FilePathsが有効なdomain一覧を管理するテーブルになっているようです。
手動で有効にしたいdomainのdmidを突っ込みましょう。

mysql> SELECT * FROM domain;
+------+------------+
| dmid | namespace  |
+------+------------+
|    1 | testdomain | 
+------+------------+
1 row in set (0.01 sec)

と言う状態なので、

mysql> INSERT INTO plugin_filepaths_domains(dmid) VALUES(1);
Query OK, 1 row affected (0.00 sec)

として設定しておきます。
これで多分完了です。(ぇ

MogileFS::Client::FilePathsを使ってFilePathsを実感してみる

普通のClientでは何も起きません。あしからず。
MogileFS::Client::FilePathsを使って、対応しているdomainにアクセスする時のみ有効になります。

/home/zigorou/fizzbuzz.plをMogileFS上のパスで/mogdata/zigorou/fizzbuzz.plとしてデータをstoreする例です。

#!/usr/bin/perl

use strict;
use warnings;

use MogileFS::Client::FilePaths;

my $mogc = MogileFS::Client::FilePaths->new(
             host => [qw/127.0.0.1:7001/],
             domain => q|testdomain|
           );

$mogc->store_file('/mogdata/zigorou/fizzbuzz.pl', 'testclass', '/home/zigorou/fizzbuzz.pl');

次に、/mogdata/zigorouをリストアップしてみる例です。

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dump qw(dump);
use MogileFS::Client::FilePaths;

my $mogc = MogileFS::Client::FilePaths->new(
             host => [qw/127.0.0.1:7001/],
             domain => q|testdomain|
           );

print dump($mogc->list("/mogdata/zigorou"));

とすれば、

{ is_file => 1, name => "fizzbazz.pl", path => "/mogdata/zigorou/fizzbuzz.pl", size => 256 }

のように返って来ます。

雑感

  • Serverはpluginによる拡張が可能
  • Client側の機能拡張もplugin化しないと使い勝手が悪すぎる
  • Pathのように扱う事は不可能じゃないけど、domainを極力分ける事が肝要

特に最後のdomainを細かく分ける利点は、

mysql> SHOW CREATE TABLE file\G
*************************** 1. row ***************************
       Table: file
Create Table: CREATE TABLE `file` (
  `fid` int(10) unsigned NOT NULL,
  `dmid` smallint(5) unsigned NOT NULL,
  `dkey` varchar(255) default NULL,
  `length` int(10) unsigned default NULL,
  `classid` tinyint(3) unsigned NOT NULL,
  `devcount` tinyint(3) unsigned NOT NULL,
  PRIMARY KEY  (`fid`),
  UNIQUE KEY `dkey` (`dmid`,`dkey`),
  KEY `devcount` (`dmid`,`classid`,`devcount`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

UNIQUE制約としてdmid, dkeyの組み合わせを持って来てるので、予めdmidで絞り込めればSELECTが速くなるからです。

PerlbalのPluginはMFさんが有名ですけど、MogileFS自体も拡張出来るんだぜーって話でした。

ここら辺ですかね。