mod_cluster概要
JBoss Advent Calendar 2011の9日目のエントリです。Apache HTTPDとJBoss ASを連携するのには通常mod_jkかmod_proxy_ajpを使うのですが、mod_clusterというのもあります。今回はこのmod_clusterの概要を紹介しようと思います。
まずmod_jkとmod_proxy_ajpのおさらい。どちらを使ってもそれほど変わりは無いので、好きなほう使ってください。
mod_proxy_ajp
Apache HTTPD 2.2から標準バイナリに含まれているので、手軽に使えます。AJP関連のコードはmod_jkから適宜バックポートされる形になっているので、mod_jkより多少古いバージョンのコードを使うことになります。また、Apache HTTPDに含まれているが故に、利用するバージョンがApache HTTPDのバージョンに引きずられることになります。mod_proxy_ajpに関連するバグがあった場合にはmod_proxy_ajpだけバージョンアップ、というのは難しいのでApache HTTPD全体をバージョンアップすることになるでしょう。
エンタープライズ系Linuxを使っている場合は修正のバックポートリクエストすればよろしくやってくれるでしょうからこの点は問題にはならないと思います。
mod_cluster
さて、mod_clusterです。mod_jkとmod_proxy_ajpとの大きな違いは以下です。
- バックエンド設定
- 自動ディスカバリ
- 動的ロード計算
それぞれを見ていきましょう。
バックエンド設定
mod_jkやmod_proxy_ajpは、バックエンドサーバであるJBoss ASへの接続設定をフロントエンドであるApache HTTPD側に設定していました。これはmod_clusterでは異なります。
Apache HTTPD側ではクラスタマネージャという設定を受け付けるサーバモジュールがあり、接続情報はバックエンドサーバであるJBoss ASからApache HTTPD側のクラスタマネージャに伝えられて設定されます。つまり、JBoss ASを追加するときはJBoss ASを設定して起動すればOKで、Apache HTTPD側はまったく触らなくて良いことになります。削除(停止)するときも一緒です。バックエンドサーバの設定はバックエンドサーバで行う、という構成です。
自動ディスカバリ
JBoss ASは自身の設定情報をApache HTTPDへ伝えなければならないのですが、これもUDPマルチキャストを利用して設定無しで動作させることができます。JBoss ASとApache HTTPDの両方がUDPマルチキャストで通信できるネットワーク上に存在する必要があります。通常同一ネットワークセグメントであれば動作します。
動的ロード計算
mod_jkとmod_proxy_ajpではロードバランスは例えば「ノード1に20の負荷」、「ノード2に30の負荷」というように静的に設定するしかありませんでした。加えて、ロードバランスに利用される情報は「リクエストの数」や「新規セッションの数」というような「実際の負荷」を表すには間接的すぎる情報しか設定することができません。Webリクエストだけではなく、リモートEJBコールを受け付けたりJMSのメッセージを処理しているようなアプリケーションサーバに対して、Webリクエストの断片的な情報だけでロードバランスするというのはあまり良い選択肢ではありません。
mod_clusterではバックエンドサーバであるJBoss ASがCPU利用率などから負荷を計算してApache HTTPDに伝え、ロードバランスをすることができます。