2012年9月アーカイブ

YAPC::Asia Tokyo 2012 始まりましたね。

それとはあまり関係なく DBIx::DSN::Resolver というモジュールを書いてリリースしました 

https://metacpan.org/release/DBIx-DSN-Resolver

何をするモジュールなのかというと、DBIでデータベースに接続する際に使うDSN中のホスト名を名前解決してくれるモジュールです。mobage本でxaicronが書いていたのを参考にして作りました

dbi:mysql:database=mytbl;host=dbserver.local

これを

dbi:mysql:database=mytbl;host=10.9.4.1

と変換してくれます。

また、名前解決する機能を差し替える事ができるので、そこでキャッシュを挟む事も可能です。Cache::Memory::Simpleを使うと以下のように書けます

use Socket;
use DBIx::DSN::Resolver;
use Cache::Memory::Simple;

my $DNS_CACHE = Cache::Memory::Simple->new(
    size => 256,
);

my $r = DBIx::DSN::Resolver->new(
   resolver => sub {
       my $host = shift;
       my $ipr = $DNS_CACHE->get($host);
       my $ip = $ipr ? $$ipr : undef;
       if ( !$ipr ) {
            $ip = Socket::inet_aton($host);
            $DNS_CACHE->set($host,\$ip,5);
        }
        return unless $ip;
        Socket::inet_ntoa($ip);
    }
);
$dsn = $resolver->resolv($dsn);

他にもData::WeightedRoundRobinと組み合わせたり、キャッシュをmemcachedで行ったりするのも簡単にできるかと思われます。

なんでこれが有用かというと、アプリケーションの設定で、

db => {
    dsn => '10.9.4.1',
    user => .., pass => ..
}

とIPアドレスで書くより

db => {
    dsn => 'dbserver.local',
    user => .., pass => ..
}

と書いた方が解りやすいし、DB障害時にDNSを使ってのfailoverもできます。けど毎回DNSに問い合わせると今度はDNSサーバに負荷がかかるし、遅いのでキャッシュをしておきたい、そんな時に使えるモジュールです

いよいよ今週末に迫った YAPC::Asia Tokyo 2012 でMySQLの運用や運用ツールの話をします。2日目の9/29 10:30からです。

1台から500台までのMySQL運用(YAPC::Asia編) - YAPC::Asia Tokyo 2012

大規模WebサービスであるlivedoorBlogのデータベースサーバ移転と集約化の話がメインですが、規模に関わらず役に立つツールや運用ノウハウを紹介しますので、朝一ではありますが、2F中教室まで来てくださいませ!

同時間帯にはこのお二方のTalkもあります。

楽しみですね!

livedoor readerユーザの皆様お久しぶりです。すっかり忘れていたけど、feedburner.jp使っていたので読めなくなっていたようです。

feedを自前に戻しました。

Apacheの設定を

Redirect permanent /index.rdf http://feeds.feedburner.jp/nomadscafejp
Redirect permanent /index.xml http://feeds.feedburner.jp/nomadscafejp
Redirect permanent /atom.xml http://feeds.feedburner.jp/nomadscafejp

↓↓↓

Redirect permanent /index.rdf http://blog.nomadscafe.jp/feedb.xml
Redirect permanent /index.xml http://blog.nomadscafe.jp/feedb.xml
Redirect permanent /atom.xml http://blog.nomadscafe.jp/feedb.xml

と変更しました。

google readerは更新読めていたんだけどgoogleさんどうやってたの?

iPhone5の発表を見ずにコード書いて寝てたわー


昨日のforeman互換のprocletコマンドに引き続き

Proclet::Declare について考えた - tokuhirom’s blog

このモジュールをProcletのディストリビューションにいれてリリースしました。

https://metacpan.org/module/Proclet

バージョンは 0.12 です

使い方

こんなスクリプト書いて

use strict;
use warnings;
use Proclet::Declare;

env(
  PLACK_ENV => 'development',
  LM_COLOR => 1,
);

service('web', 'plackup -p 9413 app.psgi');
service('memcached', qw!/usr/local/bin/memcached -p 11211!);
service('worker', sub { MyWorker->run });

worker(
    worker => 2
);

color;
run;

実行できます。

個人的にはProcfile.foremanを用意するよりこっちの方が弄りやすいし捗ると思う

Webアプリケーション開発時などに依存するバックグラウンドプロセスを管理するツールとして rubyで作られた foreman というツールがあります

Procfileという名前のファイルに

worker: ./bin/worker
web: plackup web.psgi

と書いて

$ foreman start

とやると指定したプロセスを起動してくれるらしいです。

cho45やtokuhiromからの提案もあったので、Procletをベースに同様の機能を持つprocletコマンドを作り、Procletに同梱してリリースしました。

https://metacpan.org/module/Proclet

バージョン0.11で追加されました。

インストールは

$ cpanm Proclet

使い方

実装されていない機能もあるけどだいたいforemanと一緒です

Procfileを用意して proclet start します

$ cat Procfile
worker: ./bin/worker
web: plackup web.psgi
$ proclet start

止めたい時はctrl-cです

起動するとこのようにログが出力されます

proclet-cmd.png

サービスの起動する数を変更したい場合は -c (—concurrency) を使います

$ proclet start -c worker=2,web=1

サービスごとログに色を付けたい場合は —color オプションを追加します

$ proclet start --color

環境変数は .env というファイルから読み込みます

$ cat .env
FOO=bar
BAZ=qux

.env以外から環境変数を読み込みたい場合は -e (—env) で指定します

デフォルトの起動オプションは .foremanファイルを置く事で指定できます。起動オプション名の長い方を使い、YAML形式で保存します

$ cat .foreman
concurrency: worker=2,web=1
color: 1

これで複数のプロセスを必要とするWebアプリケーション開発も捗りますね!足りない機能のpullreqお待ちしております。