shibuya pm tt08 advanced mogilefs
TRANSCRIPT
Shibuya Perl Mongers Technical Talk #8
Advanced MogileFSAdvanced MogileFSMaking plugins and tipsMaking plugins and tips
Toru YamaguchiToru Yamaguchi
Yet Another Hackadelic (d:id:ZIGOROu)Yet Another Hackadelic (d:id:ZIGOROu)<[email protected]><[email protected]>
Shibuya Perl Mongers Technical Talk #8
AgendaAgenda
3 分で分かる MogileFS
Plugin の仕組みMogileFS::StoreMogileFS の global_hookServer コマンドの作成開発時の tips などまとめ
Shibuya Perl Mongers Technical Talk #8
33 分で分かる分で分かる MogileFSMogileFS
Shibuya Perl Mongers Technical Talk #8
33 分で分かる分で分かる MogileFS (1)MogileFS (1)
MogileFS とは?Perl で出来た DFS(Distribute File System)
MogileFS の構成tracker (mogilefsd)
storage node (mogstored)
database (mysql)
Shibuya Perl Mongers Technical Talk #8
33 分で分かる分で分かる MogileFS (2)MogileFS (2)
trackers (mogilefsd : 7001)
storage node (mogstored: 7500)database (mysql)
mogilefs client
reverse proxy(Perlbal)
request
MogileFS::Backend::do_command()
Query
X-Reproxy-URL
Shibuya Perl Mongers Technical Talk #8
33 分で分かる分で分かる MogileFS (3)MogileFS (3)
MogileFS::Clientclient ライブラリserver コマンドのリクエストは MogileFS::Backend の do_request()
MogileFS::Worker::Queryclient からのコマンドリクエストを受信する worker
今回はこの辺りが主人公です
Shibuya Perl Mongers Technical Talk #8
pluginplugin の仕組みの仕組み
Shibuya Perl Mongers Technical Talk #8
pluginplugin の仕組み の仕組み (1)(1)
plugin とは?trackers(mogilefsd) を拡張するモジュールの事。MogileFS::Plugin::MetaData (fid ごとのメタデータ保存 )MogileFS::Plugin::FilePaths (file の keyを実ファイルパスのように )
この 2 つのモジュールが教科書
Shibuya Perl Mongers Technical Talk #8
pluginplugin の仕組み の仕組み (2)(2)
plugin で出来る事plugin 用の DB Schema の定義 (mogdbsetup を使って作成 )
global_hook を用いた hook point でのcallback 実行
Query Worker に新しいコマンドを定義 or 既存コマンド差し替え
と言う訳で、この辺りのお話をします
Shibuya Perl Mongers Technical Talk #8
pluginplugin の仕組み の仕組み (3)(3)
plugin module の構成load メソッド : global_hook, worker_command の登録など
unload メソッド : global_hook の削除
MogileFS::Store::TABLE_xxx メソッド : 新規テーブルの定義
大体こんな感じ
Shibuya Perl Mongers Technical Talk #8
MogileFS::StoreMogileFS::Store とと mogdbsetupmogdbsetup
Shibuya Perl Mongers Technical Talk #8
MogileFS::StoreMogileFS::Store とと mogdbsetup mogdbsetup (1)(1)
新しいテーブルを作るplugin モジュールの中で package MogileFS::Store; を宣言して、その中で sub TABLE_plugin_table_name {} を作り、テーブル定義を文字列で返す
MogileFS::Store->add_extra_tables() を実行してテーブル読み込み
Shibuya Perl Mongers Technical Talk #8
MogileFS::StoreMogileFS::Store とと mogdbsetup mogdbsetup (2)(2)
plugin_sample_test を作るサンプルpackage MogileFS::Plugin::Sample;
### ここに plugin の処理
package MogileFS::Store;
sub TABLE_plugin_sample_test { return ‘CREATE TABLE plugin_sample_test ( id int primary key, name varchar(255))’; }
__PACKAGE__->add_extra_tables(‘plugin_sample_test’); 1;
Shibuya Perl Mongers Technical Talk #8
MogileFS::StoreMogileFS::Store とと mogdbsetup mogdbsetup (3)(3)
mogdbsetup でテーブル作成
$ mogdbsetup --plugins Sample --verbose --yes
scheme_version が最新のとき
mysql > UPDATE server_settings SET value = value - 1 WHERE field = ‘schema_version’;
一時的にバージョンを下げればおk!
Shibuya Perl Mongers Technical Talk #8
MogileFS::StoreMogileFS::Store とと mogdbsetup mogdbsetup (4)(4)
Plugin 中での $dbh の取得MogileFS::Server を use した時に読まれる Mgd::get_dbh(); を引数無しで取得
my $dbh = Mgd::get_dbh();
Shibuya Perl Mongers Technical Talk #8
MogileFSMogileFS のの global_hookglobal_hook
Shibuya Perl Mongers Technical Talk #8
MogileFSMogileFS のの global_hook (1)global_hook (1)
global_hook とは?予め cmd 中に用意された hook ポイントで任意のコールバックを実行出来る。MogileFS::register_global_hook($hookname, $callback);MogileFS::unregister_global_hook($hookname);MogileFS::run_global_hook($hookname);
Shibuya Perl Mongers Technical Talk #8
MogileFSMogileFS のの global_hook (2)global_hook (2)
global_hook で出来る事コールバックに渡される値は、その cmd への引数 (HASHREF) のみ
特定の hook に対して登録出来る callback は一つだけ orz…
複数の hook を登録するモジュールを作りました。 (MogileFS::Plugin::MultiHook)
Shibuya Perl Mongers Technical Talk #8
MogileFSMogileFS のの global_hook (3)global_hook (3)
MultiHook の install
$ sudo cpan -I MogileFS::Plugin::MultiHook
setup (mogilefsd.conf)
plugins = MultiHook, FilePaths
これだけです><
Shibuya Perl Mongers Technical Talk #8
MogileFSMogileFS のの global_hook (4)global_hook (4)
既知の hookpointcmd_create_open : ファイル受信開始
cmd_create_close : ファイル受信完了
file_stored : ファイル保存完了
cmd_delete : ファイル削除時
Shibuya Perl Mongers Technical Talk #8
MogileFSMogileFS のの global_hook (5)global_hook (5)
MultiHook のサンプルpackage MogileFS::Plugin::Sample;use MogileFS::Server;use MogileFS::Util;use MogileFS::Worker::Query;
sub load { MogileFS::register_global_hook('fire_stored', sub { my $args = shift; ### 保存された storage node の URL をログに記載 MogileFS::Util::debug("stored to " . $args->{path}); return 1; });}
Shibuya Perl Mongers Technical Talk #8
サーバーコマンドの作成サーバーコマンドの作成
Shibuya Perl Mongers Technical Talk #8
サーバーコマンドの作成 サーバーコマンドの作成 (1)(1)
基本的な流れMogileFS::register_worker_command($cmd_name, $cmd_code); を実行
MogileFS::Worker::Query で” cmd_plugin_${cmd_name}” と言うメソッドになる
MogileFS::Backend->do_request でデバッグする
Shibuya Perl Mongers Technical Talk #8
サーバーコマンドの作成 サーバーコマンドの作成 (2)(2)
MogileFS::Backend から直接サーバーコマンドを叩く
my $mogc = MogileFS::Client->new( hosts => $hosts, domain => $domain); $mogc->{backend}->do_request("plugin_echo_show_args", { foo => 1, bar => 2 });
自分で作った cmd の動作確認は do_request で行う
Shibuya Perl Mongers Technical Talk #8
サーバーコマンドの作成 サーバーコマンドの作成 (3)(3)
引数をそのまま返す cmd の作成sub load { MogileFS::register_worker_command("plugin_echo_show_args", sub { my MogileFS::Worker::Query $self = shift; my $args = shift; $self->ok_line($args); });}
ok_line($res) の $res(HASHREF) は client に渡されるレスポンス
Shibuya Perl Mongers Technical Talk #8
サーバーコマンドの作成 サーバーコマンドの作成 (3)(3)
引数のハッシュの値は全て scalar のみ$mogc->{backend}->do_request("test", {
foo => { bar => 1 }, baz => [qw/1 2/] });
こういうのは NG です。baz_0 => 1, baz_1 => 2 みたいに。
Shibuya Perl Mongers Technical Talk #8
開発時の開発時の tipstips などなど
Shibuya Perl Mongers Technical Talk #8
開発時の開発時の tipstips など など (1)(1)
Mgd::log($level, $mgs)standalone 時は STDOUT に出力daemon 時は syslog に出力
daemontools 使った管理がいい感じ
子プロセスでは使えない (query worker とか )
Shibuya Perl Mongers Technical Talk #8
開発時の開発時の tipstips など など (2)(2)
MogileFS::Util::debug($msg)子プロセスでも使える但し STDOUT に記載されるタイミングは不安定?改行不可なのでデータの dump は改行を落とさなければならない。
Shibuya Perl Mongers Technical Talk #8
開発時の開発時の tipstips など など (3)(3)
$MogileFS::DEBUGtrue にすると client, server 共にデバッグフラグが立つclient のデバッグログはレスポンスの成否とレスポンスデータの dump 等を出力するQuery Worker の ok_line($res) にデバッグデータ突っ込むのをお勧め
Shibuya Perl Mongers Technical Talk #8
開発時の開発時の tipstips など など (4)(4)
テスト時の plugin の読み込みlocal @ARGV = qw/--skipconfig --plugins MultiHook/; eval { MogileFS::Config->load_config; };
@ARGV を一時的に捏造--skipconfig : 設定ファイルを読み飛ばす--plugins : plugin の指定 (suffix で )
Shibuya Perl Mongers Technical Talk #8
まとめまとめ
Shibuya Perl Mongers Technical Talk #8
まとめ まとめ (1)(1)
plugin を使って出来る事特定の hook にデバッグコード入れたり監視に使えるコマンドを作ったり
File にまつわる補足データを突っ込んだり新しい hook 作ってみたり
Shibuya Perl Mongers Technical Talk #8
まとめ まとめ (2)(2)
ファイル配信時の問題点mogstored からの Content-Type ヘッダがでたらめ
出来れば Etag だとか Last-Modified とか自動的にあると嬉しい
Cache 系リクエストヘッダに応じてtracker に問い合わせて、よしなに処理今、作ってます orz…
Shibuya Perl Mongers Technical Talk #8
まとめ まとめ (3)(3)
MogileFS の plugin 開発まとめplugin 開発はわりと簡単
MultiHook プラグイン推奨 ( ないと拡張性が乏しすぎ )
ロギングは適宜方法を選ぶと良いMogileFS について分からない人はSoftware Design 9, 10, 11 月号を買うべし!w
Shibuya Perl Mongers Technical Talk #8
ThanksThanks
ご清聴ありがとうございました。
Toru Yamaguchi<[email protected]>