読者です 読者をやめる 読者になる 読者になる

nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

mod_cluster概要

jboss

JBoss Advent Calendar 2011の9日目のエントリです。Apache HTTPDJBoss ASを連携するのには通常mod_jkmod_proxy_ajpを使うのですが、mod_clusterというのもあります。今回はこのmod_clusterの概要を紹介しようと思います。

まずmod_jkとmod_proxy_ajpのおさらい。どちらを使ってもそれほど変わりは無いので、好きなほう使ってください。

mod_jk

一番古い実装で、AJPをハンドルするコードは今でもここがほぼ開発の先端となっています。Web上にも情報が豊富で、設定は特に苦労しません。

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マルチキャストで通信できるネットワーク上に存在する必要があります。通常同一ネットワークセグメントであれば動作します。

もちろんJBoss AS側にApache HTTPDへの接続情報を明示的に指定して利用することもできます。

動的ロード計算

mod_jkとmod_proxy_ajpではロードバランスは例えば「ノード1に20の負荷」、「ノード2に30の負荷」というように静的に設定するしかありませんでした。加えて、ロードバランスに利用される情報は「リクエストの数」や「新規セッションの数」というような「実際の負荷」を表すには間接的すぎる情報しか設定することができません。Webリクエストだけではなく、リモートEJBコールを受け付けたりJMSのメッセージを処理しているようなアプリケーションサーバに対して、Webリクエストの断片的な情報だけでロードバランスするというのはあまり良い選択肢ではありません。

mod_clusterではバックエンドサーバであるJBoss ASがCPU利用率などから負荷を計算してApache HTTPDに伝え、ロードバランスをすることができます。

mod_clusterの使いどころ

最初に結論だけ言うと、フロントエンド追加設定なし、自動ディスカバリ、動的ロード計算という3つの特徴が一番適合するのはクラウド環境です。もしクラウド環境で利用する場合はmod_cluster使ってください。

他の場合は、この3つの特徴がどれだけ有用なのか、という部分を判断して適用すれば良いと思います。例えば動的ロード計算が必要、というケースはあるでしょう。

それ以外の場合は趣味で使いたい、勉強したい、という場合を除けば、無理してmod_clusterを使う理由はないはずです。