shibuya pm tt08 advanced mogilefs

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

Upload: guest172cfb

Post on 20-Aug-2015

2.846 views

Category:

Technology


0 download

TRANSCRIPT

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