dainamoを書きました

ちょっと前からdainamoというプロジェクトを始めました。

元々各プロジェクトの雛形にgearman/schwartz/qudoのworkerのスクリプトがあり、そこから自動生成させて、微妙にカスタマイズしつつ、使っていたのでした。
しかし、その自動生成させたやつに微妙にバグがあったり、もうちょい色々機能がほしかったのでまとめてなおすついでに共通化できそうだな、とおもってつくりました。

これは、こういう問題を解決するためにつくりました。

  • 運用をよりやりやすくする
  • 開発をよりやりやすくする

運用をよりやりやすくする

logging

本番で例えばどういうジョブが動いたのか、それはエラーとか吐いてないか?、時間は意図してるよりかかりすぎてないか?といったことをdeployしたあとやトラブル時に確認したかったのでログれるようにしました。

Log::Minimalを使いつつ、Log::Minimal::PRINTをDainamo内だと書きかえているので、Workerプログラム内でwarnfやらすればそのままlogに出せます。また$SIG{__WARN__}はwarnfしてるのでwarningsはかってにログに出ます。

deploy

workerはプロジェクト専用で用意してみたが、意外と台数がいらなかったりとか、1台未満で共用させても大丈夫、という状態になりがちで、複数のプロジェクトを集約して置いたりすることが多いです。

色々なプロジェクトがあり、あんまり開発の人の数もなく、どのプロジェクトの開発もしつつ運用もしないといけないので、プロジェクトごとにdeploy方法が違ったりすると困ったりします。

なのでdeploy方法は役割に応じて決めているのですが、このプロジェクトはこのジョブとこのジョブの特性が大きく違うので、完全にqudoの設定を変えた状態で2種類のworkerを立ちあげたりしたい、とかなったときに、わりとがんばってカスタマイズしたりする必要があったので、そういうのを簡単にしたかったのでした。

全体の設定を記述し(メモリ量/スペック等によりチューニング)、プロジェクト固有の設定をincludeできるようにしてやることで、そういうのがすっきり書けるようになりました。設定ファイルはperlなのでPlackの*.psgiとかのように最後に評価させるオブジェクトが決まっているだけで、あとはわりと自由に書けます。

ほかには、共通のライブラリをupdateしたので、全部のworkerに再起動をかけたい、といったときもそのサーバーでつかってるプロジェクトを調べて...とかもめんどうだったのでした。

監視

監視もまた、基本的にはプロジェクトごとに作成するのではなく、サーバーの役割ごとに作成/設定していたのでした。

ただ、複数のプロジェクトを同居させたときに監視が多少甘かったりして問題になったりしたので、このあたりを改善したかったのでした。

dainamoは管理用のポートをlisten(デフォルトでは127.0.0.1:5176)していて、HTTP経由でアクセスできます。/rpc/以下にいくつかコマンドが実装されていて、Content-Typeはtsvになってるので、簡単に確認できます。(KyotoTycoonをパクってみました)。基本的にはDainamo::Client経由で簡単に操作できます。

/rpc/missing_managerとかをみると、本来いないといけないはずのプロセスがいないよ、というのを表示してくれるので、これを監視しておけば、

  • HTTPがつながらない -> とりあえず再起動
  • なにか表示がある -> とりあえず再起動

というようにできます。

/rpc/scoreboardとかをみると、どのプロセスがどのプロジェクトのどういう役割(Qudo/Gearmanとか)で、今ジョブを実行しているのか、といったことが確認できるので、Cloudforecastでグラフ化したりとか、top風に定期的にみるコマンドをつくったりする予定です。

開発をやりやすくする

自動再起動

開発時はファイルが書きかわったら、自動で再起動させるオプションがあると、開発が楽にできるなぁということで作りたかったのでした。

logging

開発時にもログは役にたちます。

まとめ

ということで、dainamoはQudoやらGearmanを使っているところだと、モバイルファクトリーの事情に特化しているところも多少ありますが、わりと便利につかえるのではないかなぁと思います。