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

More Related Content

What's hot

serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?Sho Hashimoto
 
Apacheチューニング
ApacheチューニングApacheチューニング
Apacheチューニングii012014
 
Cakephp勉強会@tokyo #4
Cakephp勉強会@tokyo #4Cakephp勉強会@tokyo #4
Cakephp勉強会@tokyo #4ichikaway
 
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LTNorikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LTMasahiro Nagano
 
MessagePack RPC によるドキドキ非同期通信 @関ジャバ 2012年度8月
MessagePack RPC によるドキドキ非同期通信 @関ジャバ 2012年度8月MessagePack RPC によるドキドキ非同期通信 @関ジャバ 2012年度8月
MessagePack RPC によるドキドキ非同期通信 @関ジャバ 2012年度8月Takashi Someda
 
最近の PHP の話
最近の PHP の話最近の PHP の話
最近の PHP の話y-uti
 
ポリドックにServerspecを教えよう!
ポリドックにServerspecを教えよう!ポリドックにServerspecを教えよう!
ポリドックにServerspecを教えよう!ftnk
 
カジュアルにバックアップ - MySQL Casual Talks 福岡
カジュアルにバックアップ - MySQL Casual Talks 福岡カジュアルにバックアップ - MySQL Casual Talks 福岡
カジュアルにバックアップ - MySQL Casual Talks 福岡Aya Komuro
 
FuelPHPで3種のprofilerを使ってみた
FuelPHPで3種のprofilerを使ってみたFuelPHPで3種のprofilerを使ってみた
FuelPHPで3種のprofilerを使ってみたKatsuhiro Miura
 
PowerShellを使用したWindows Serverの管理
PowerShellを使用したWindows Serverの管理PowerShellを使用したWindows Serverの管理
PowerShellを使用したWindows Serverの管理junichi anno
 
Clojureによるログ収集と解析
Clojureによるログ収集と解析Clojureによるログ収集と解析
Clojureによるログ収集と解析Yoshitaka Kawashima
 
Zabbix meeting 20101218_02-2 (Takanori Suzuki)
Zabbix meeting 20101218_02-2 (Takanori Suzuki)Zabbix meeting 20101218_02-2 (Takanori Suzuki)
Zabbix meeting 20101218_02-2 (Takanori Suzuki)takanori suzuki
 
serverspecでサーバ環境のテストを書いてみよう
serverspecでサーバ環境のテストを書いてみようserverspecでサーバ環境のテストを書いてみよう
serverspecでサーバ環境のテストを書いてみようDaisuke Ikeda
 
Serverspecを使ってサーバ5000台のBaculaクライアントをテスト
Serverspecを使ってサーバ5000台のBaculaクライアントをテストServerspecを使ってサーバ5000台のBaculaクライアントをテスト
Serverspecを使ってサーバ5000台のBaculaクライアントをテストKen Sawada
 
FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1Fumito Mizuno
 
社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)Iwana Chan
 
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Mori Shingo
 
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )hiro345
 
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅- Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅- Daisuke Ikeda
 

What's hot (20)

serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?serverspecみんなで集めて(゚Д゚)ウマー?
serverspecみんなで集めて(゚Д゚)ウマー?
 
Apacheチューニング
ApacheチューニングApacheチューニング
Apacheチューニング
 
Cakephp勉強会@tokyo #4
Cakephp勉強会@tokyo #4Cakephp勉強会@tokyo #4
Cakephp勉強会@tokyo #4
 
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LTNorikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
Norikraで作るPHPの例外検知システム YAPC::Asia Tokyo 2015 LT
 
MessagePack RPC によるドキドキ非同期通信 @関ジャバ 2012年度8月
MessagePack RPC によるドキドキ非同期通信 @関ジャバ 2012年度8月MessagePack RPC によるドキドキ非同期通信 @関ジャバ 2012年度8月
MessagePack RPC によるドキドキ非同期通信 @関ジャバ 2012年度8月
 
Nodejs
NodejsNodejs
Nodejs
 
最近の PHP の話
最近の PHP の話最近の PHP の話
最近の PHP の話
 
ポリドックにServerspecを教えよう!
ポリドックにServerspecを教えよう!ポリドックにServerspecを教えよう!
ポリドックにServerspecを教えよう!
 
カジュアルにバックアップ - MySQL Casual Talks 福岡
カジュアルにバックアップ - MySQL Casual Talks 福岡カジュアルにバックアップ - MySQL Casual Talks 福岡
カジュアルにバックアップ - MySQL Casual Talks 福岡
 
FuelPHPで3種のprofilerを使ってみた
FuelPHPで3種のprofilerを使ってみたFuelPHPで3種のprofilerを使ってみた
FuelPHPで3種のprofilerを使ってみた
 
PowerShellを使用したWindows Serverの管理
PowerShellを使用したWindows Serverの管理PowerShellを使用したWindows Serverの管理
PowerShellを使用したWindows Serverの管理
 
Clojureによるログ収集と解析
Clojureによるログ収集と解析Clojureによるログ収集と解析
Clojureによるログ収集と解析
 
Zabbix meeting 20101218_02-2 (Takanori Suzuki)
Zabbix meeting 20101218_02-2 (Takanori Suzuki)Zabbix meeting 20101218_02-2 (Takanori Suzuki)
Zabbix meeting 20101218_02-2 (Takanori Suzuki)
 
serverspecでサーバ環境のテストを書いてみよう
serverspecでサーバ環境のテストを書いてみようserverspecでサーバ環境のテストを書いてみよう
serverspecでサーバ環境のテストを書いてみよう
 
Serverspecを使ってサーバ5000台のBaculaクライアントをテスト
Serverspecを使ってサーバ5000台のBaculaクライアントをテストServerspecを使ってサーバ5000台のBaculaクライアントをテスト
Serverspecを使ってサーバ5000台のBaculaクライアントをテスト
 
FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1FuelPHP Osu Nagoya vol.1
FuelPHP Osu Nagoya vol.1
 
社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)社内勉強会資料(Varnish Module)
社内勉強会資料(Varnish Module)
 
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋
 
15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )15分でCakePHPを始める方法(Nseg 2013-11-09 )
15分でCakePHPを始める方法(Nseg 2013-11-09 )
 
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅- Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
Serverspecを自分好みにアレンジ スクリーンショットで証跡保存を撲滅-
 

Similar to Shibuya Pm Tt08 Advanced Mogilefs

〜Apache Geode 入門 gfsh によるクラスター構築・管理
〜Apache Geode 入門 gfsh によるクラスター構築・管理〜Apache Geode 入門 gfsh によるクラスター構築・管理
〜Apache Geode 入門 gfsh によるクラスター構築・管理Akihiro Kitada
 
Ruby on Rails Tutorial
Ruby on Rails TutorialRuby on Rails Tutorial
Ruby on Rails TutorialKen Iiboshi
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1Ryosuke IWANAGA
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12kenjis
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法博文 斉藤
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするKiyoshi Sawada
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1kenjis
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugY Watanabe
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoyakenjis
 
EC-CUBEプラグイン講義
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義ria1201
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするKiyoshi Sawada
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterMasanori Oobayashi
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回Naoyuki Yamada
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01Yusuke Ando
 
社内向けTech Talk資料~Fluentdの基本紹介~
社内向けTech Talk資料~Fluentdの基本紹介~ 社内向けTech Talk資料~Fluentdの基本紹介~
社内向けTech Talk資料~Fluentdの基本紹介~ Daisuke Ikeda
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!Yohei Fushii
 

Similar to Shibuya Pm Tt08 Advanced Mogilefs (20)

〜Apache Geode 入門 gfsh によるクラスター構築・管理
〜Apache Geode 入門 gfsh によるクラスター構築・管理〜Apache Geode 入門 gfsh によるクラスター構築・管理
〜Apache Geode 入門 gfsh によるクラスター構築・管理
 
Ruby on Rails Tutorial
Ruby on Rails TutorialRuby on Rails Tutorial
Ruby on Rails Tutorial
 
G * magazine 1
G * magazine 1G * magazine 1
G * magazine 1
 
tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1tcpdump & xtrabackup @ MySQL Casual Talks #1
tcpdump & xtrabackup @ MySQL Casual Talks #1
 
10分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/1210分でわかるFuelPHP @ 2011/12
10分でわかるFuelPHP @ 2011/12
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
 
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1 10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
10分でわかるFuelPHP @ 2013/04 FuelPHP入門ハンズオン vol.1
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
 
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya 10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
10分でわかるFuelPHP @ 2012/05 OSC2012 Nagoya
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
EC-CUBEプラグイン講義
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義
 
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスするEWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
EWD 3トレーニングコース#19 JavaScriptからGlobalストレジにアクセスする
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
 
データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回データマイニング+WEB勉強会資料第6回
データマイニング+WEB勉強会資料第6回
 
Openresty
OpenrestyOpenresty
Openresty
 
20091030cakephphandson 01
20091030cakephphandson 0120091030cakephphandson 01
20091030cakephphandson 01
 
社内向けTech Talk資料~Fluentdの基本紹介~
社内向けTech Talk資料~Fluentdの基本紹介~ 社内向けTech Talk資料~Fluentdの基本紹介~
社内向けTech Talk資料~Fluentdの基本紹介~
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
 

Recently uploaded

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 

Recently uploaded (8)

CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 

Shibuya Pm Tt08 Advanced Mogilefs

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

Editor's Notes

  1. テスト