36
Shibuya Perl Mongers Technical Talk Advanced MogileFS Advanced MogileFS Making plugins and tips Making plugins and tips Toru Yamaguchi Toru Yamaguchi Yet Another Hackadelic (d:id:ZIGORO Yet Another Hackadelic (d:id:ZIGORO <[email protected]> <[email protected]>

Shibuya Pm Tt08 Advanced Mogilefs

Embed Size (px)

Citation preview

Page 1: Shibuya Pm Tt08 Advanced Mogilefs

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]>

Page 2: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

AgendaAgenda

3 分で分かる MogileFS

Plugin の仕組みMogileFS::StoreMogileFS の global_hookServer コマンドの作成開発時の tips などまとめ

Page 3: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

33 分で分かる分で分かる MogileFSMogileFS

Page 4: Shibuya Pm Tt08 Advanced Mogilefs

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)

Page 5: Shibuya Pm Tt08 Advanced Mogilefs

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

Page 6: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

33 分で分かる分で分かる MogileFS (3)MogileFS (3)

MogileFS::Clientclient ライブラリserver コマンドのリクエストは MogileFS::Backend の do_request()

MogileFS::Worker::Queryclient からのコマンドリクエストを受信する worker

今回はこの辺りが主人公です

Page 7: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

pluginplugin の仕組みの仕組み

Page 8: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

pluginplugin の仕組み の仕組み (1)(1)

plugin とは?trackers(mogilefsd) を拡張するモジュールの事。MogileFS::Plugin::MetaData (fid ごとのメタデータ保存 )MogileFS::Plugin::FilePaths (file の keyを実ファイルパスのように )

この 2 つのモジュールが教科書

Page 9: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

pluginplugin の仕組み の仕組み (2)(2)

plugin で出来る事plugin 用の DB Schema の定義 (mogdbsetup を使って作成 )

global_hook を用いた hook point でのcallback 実行

Query Worker に新しいコマンドを定義 or 既存コマンド差し替え

と言う訳で、この辺りのお話をします

Page 10: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

pluginplugin の仕組み の仕組み (3)(3)

plugin module の構成load メソッド : global_hook, worker_command の登録など

unload メソッド : global_hook の削除

MogileFS::Store::TABLE_xxx メソッド : 新規テーブルの定義

大体こんな感じ

Page 11: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

MogileFS::StoreMogileFS::Store とと mogdbsetupmogdbsetup

Page 12: Shibuya Pm Tt08 Advanced Mogilefs

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() を実行してテーブル読み込み

Page 13: Shibuya Pm Tt08 Advanced Mogilefs

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;

Page 14: Shibuya Pm Tt08 Advanced Mogilefs

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!

Page 15: Shibuya Pm Tt08 Advanced Mogilefs

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();

Page 16: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

MogileFSMogileFS のの global_hookglobal_hook

Page 17: Shibuya Pm Tt08 Advanced Mogilefs

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);

Page 18: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

MogileFSMogileFS のの global_hook (2)global_hook (2)

global_hook で出来る事コールバックに渡される値は、その cmd への引数 (HASHREF) のみ

特定の hook に対して登録出来る callback は一つだけ orz…

複数の hook を登録するモジュールを作りました。 (MogileFS::Plugin::MultiHook)

Page 19: Shibuya Pm Tt08 Advanced Mogilefs

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

これだけです><

Page 20: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

MogileFSMogileFS のの global_hook (4)global_hook (4)

既知の hookpointcmd_create_open : ファイル受信開始

cmd_create_close : ファイル受信完了

file_stored : ファイル保存完了

cmd_delete : ファイル削除時

Page 21: Shibuya Pm Tt08 Advanced Mogilefs

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; });}

Page 22: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

サーバーコマンドの作成サーバーコマンドの作成

Page 23: Shibuya Pm Tt08 Advanced Mogilefs

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 でデバッグする

Page 24: Shibuya Pm Tt08 Advanced Mogilefs

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 で行う

Page 25: Shibuya Pm Tt08 Advanced Mogilefs

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 に渡されるレスポンス

Page 26: Shibuya Pm Tt08 Advanced Mogilefs

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 みたいに。

Page 27: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

開発時の開発時の tipstips などなど

Page 28: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

開発時の開発時の tipstips など など (1)(1)

Mgd::log($level, $mgs)standalone 時は STDOUT に出力daemon 時は syslog に出力

daemontools 使った管理がいい感じ

子プロセスでは使えない (query worker とか )

Page 29: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

開発時の開発時の tipstips など など (2)(2)

MogileFS::Util::debug($msg)子プロセスでも使える但し STDOUT に記載されるタイミングは不安定?改行不可なのでデータの dump は改行を落とさなければならない。

Page 30: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

開発時の開発時の tipstips など など (3)(3)

$MogileFS::DEBUGtrue にすると client, server 共にデバッグフラグが立つclient のデバッグログはレスポンスの成否とレスポンスデータの dump 等を出力するQuery Worker の ok_line($res) にデバッグデータ突っ込むのをお勧め

Page 31: Shibuya Pm Tt08 Advanced Mogilefs

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 で )

Page 32: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

まとめまとめ

Page 33: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

まとめ まとめ (1)(1)

plugin を使って出来る事特定の hook にデバッグコード入れたり監視に使えるコマンドを作ったり

File にまつわる補足データを突っ込んだり新しい hook 作ってみたり

Page 34: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

まとめ まとめ (2)(2)

ファイル配信時の問題点mogstored からの Content-Type ヘッダがでたらめ

出来れば Etag だとか Last-Modified とか自動的にあると嬉しい

Cache 系リクエストヘッダに応じてtracker に問い合わせて、よしなに処理今、作ってます orz…

Page 35: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

まとめ まとめ (3)(3)

MogileFS の plugin 開発まとめplugin 開発はわりと簡単

MultiHook プラグイン推奨 ( ないと拡張性が乏しすぎ )

ロギングは適宜方法を選ぶと良いMogileFS について分からない人はSoftware Design 9, 10, 11 月号を買うべし!w

Page 36: Shibuya Pm Tt08 Advanced Mogilefs

Shibuya Perl Mongers Technical Talk #8

ThanksThanks

ご清聴ありがとうございました。

Toru Yamaguchi<[email protected]>