mod_proxy_balancerにロジックを簡単に追加するモジュール

数日前からプロトタイプ的に作っていたmod_perlによるApacheハンドラですが、
プライグインでロジックを自由に拡張できるようにして先ほどCPANに上げておきました。
モジュール名はこんな風にしてみました↓

Apache2::BalanceLogic - Perl extension for mod_proxy_balancer
http://search.cpan.org/~miki/Apache2-BalanceLogic-0.0.1/lib/Apache2/BalanceLogic.pm

英文を書くのがつらかったのでCPANドキュメント上ではあまり具体的に説明はしてません。
なのでちょっとだけここで説明を書いておきます。

何をするものか?

このApacheハンドラはとても単純な「mod_proxy_balancer」の拡張モジュールです。
独自にプラグインのコードを追加することが可能で、それによりmod_proxy_balancerの振る舞いを自由に制御できるようになります。

例えば

  • ある時間帯はバックエンドの5台のサーバにリクエストを割り振りたいけど、それ以外の時間には3台でさばきたい
  • 同一ユーザのリクエストはいつ何時であれ、セッションが異なっていても、必ず同じサーバに振り分けられるようにしたい
  • imgやjs等のリクエストは画像サーバに処理が流れるようにしたい

などなど、ほかにも色々なアイデアが浮かんできそうですが、それらのことを高価なハードウェアバランサを用意しなくても、Apacheとmod_proxy_balancerと、そしてApache2::BalanceLogicがあれば簡単に、かつ自由に実装できてしまうのです。

どんな仕組みか?

mod_proxy_balancerには「stickysession」というオプションがあり、これはcookie値もしくはuriのどちらかに、「予め設定しておいた文字列」があると、それに従ってバランス先を決めることができる、という機能です。

この機能は一般的にはwebアプリでのセッション管理につかうことが想定されているようですが、Apache2::BalanceLogicではこれをリクエストフェーズの入り口(具体的にはヘッダー解析フェーズ)で「動的にリクエストを制御するため」に使うことにしてみました。

ブラウザから送られてくるCookieではなく、Apacheがリクエストを受けた後に内部的に独自にCookieを発行しています。これはプラグインによって追加しておいた「独自のロジック」による処理結果によって値を決めます。

たとえば「時間帯によって割り振り先を変えたい」ならば、リクエストのタイミングで現在の時間帯を調べ、割り振りたいサーバのid文字列(stickysessionで定義しておく)を決め、それをリクエストヘッダのcookieフィルドにセットしてしまいます。
これによりApache内部では、mod_proxy_balancerの処理フェーズまでリクエストデータがわたってきたタイミングでは、stickysessionとして該当するcookieが存在しているので、mod_proxy_balancerはそのサーバに対してリクエストを流してくれる、ということになります。


まだ荒削りな状態ですが、興味ある方は試してみてください。
ぼちぼちコードのブラッシュアップとドキュメント書きも進めます。