« redMine&OpenLDAP | Main | Apache2.2とTomcatでロードバランサー »

2007.05.21

Apache&Tomcatでロードバランサー

 Apache2.0.59+mod_jk 1.2.23+Tomcat5.5.23+JDK 5.0 Update 11の組み合わせで、ロードバランサー環境構築のテスト。

 前提として、Apache/Tomcatはそれぞれ2系列目も含めて全て同一のマシン上で動作させることとします。

 Apache/Tomcatのインストール等に関してはざっくりと省略。
 まずはApacheとTomcatを1系統ずつ起動してmod_jkで連携する場合の基本的な設定はこんな感じ(Test.warというWebアプリケーションをTomcatにデプロイします)。別途、Tomcat側のserver.xmlでAJP用のポート(デフォルトでは8009番)の設定を行っておきます。

【httpd.conf】

LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkMount /Test/* worker1

【workers.properties】

worker.list=worker1
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13

 Apacheのhttpのポート番号が80だったとして、http://localhost/Test/~とhttp://localhost:8080/Test/~とで同じページが表示できるはずです(AJPのポートに加えて、Tomcat側のhttpコネクタを8080で開いているという前提)。

httpd.confの設定内容に関してはこちら
workers.propertiesの設定内容に関してはこちら
ロードバランサーの設定のHowToに関してはこちら

Tomcatの2系列目を作成する

 Tomcatの1系列目のフォルダ内容をそのまま別フォルダにコピー。
 今回は同一のマシンで2系列のTomcatを動作させるため、server.xmlにおいて、シャットダウン用(8005)・httpコネクタ(8080)・AJPコネクタ(8009)のポート番号を+10000する(重ならないようにする)。

 まずは、セッションアフィニティを考えずに負荷分散を行うのであれば、以下のような感じ。sticky_session_forceは、負荷分散を行ってかつセッション情報の共有(フェールオーバー対策)を行っているときのみTrueとすべきだと思われます(methodは、負荷分散の際のルール付けをどうするかの設定です)。

【workers.properties】

worker.list=worker1
worker.worker1.type=lb
worker.worker1.balance_workers=A,B
worker.worker1.sticky_session=False

worker.list=A
worker.A.port=8009
worker.A.host=localhost
worker.A.type=ajp13

worker.list=B
worker.B.port=18009
worker.B.host=localhost
worker.B.type=ajp13

 なお、Tomcatを稼働させるマシンが別々になる場合は、同一のポート番号・別ホストという設定になります。

 この状態だと、リクエスト毎に2つのTomcatに対して交互にアクセスすることとなります・・・が、Tomcat側でセッション共有化を行っていないと、セッションの維持に影響が出るため、このような設定で使用することはほとんどないと思われます(全ての処理が1リクエストで完結するのであればOKですが)。

セッションアフィニティを行う

 スティッキー・セッションともいいますが、セッションの維持を行う場合はもう少し設定が必要です。

【server.xml】
それぞれのTomcatにおいて、要素に対して、jvmRoute属性を付加します(Tomcatの再起動が必要)。
★1台目(AJPポート:8009)

<Engine name="Catalina" defaultHost="localhost" jvmRoute="Tomcat1">

★2台目(AJPポート:18009)
<Engine name="Catalina" defaultHost="localhost" jvmRoute="Tomcat2">

【workers.properties】(変更点および追加点のみ)

worker.worker1.sticky_session=True
worker.A.route=Tomcat1
worker.B.route=Tomcat2

 ホスト・ポートおよびRouteの組み合わせに注意。

 jvmRouteが設定されていると、606EC40AB927F12F656D0C4EDF86CFD5.Tomcat1のような感じで、セッションIDの後ろにjvmRouteの値がセットされ、この値を手がかりにmod_jkが処理の振り分け先を判断することとなります。この状態でリクエストを行うと、同じセッションは同じTomcatに処理が振り分けられることとなります。

 なお、この設定は基本部分しか設定していないので、実際に運用を行うとなると、Tomcatがダウンしていた場合の対応などもっと細かな設定が必要になると思います。

Apacheを1系列追加

 1つ目のApacheの構成をそのままコピーして雛型を作成し、httpd.confでポート番号を81に変更。htdocs等のフォルダをコピー先のものに書き換えるだけでOK。まぁ、Apacheを複数系列準備するとなると、その前段にさらにリクエストを振り分けるロードバランサが必要になりますが。
 基本的に、ハードウェア方式の負荷分散装置でリクエストを複数のApacheに振り分け、そのApacheが適切なTomcatにリクエストを振り分けるような感じなるかと思います。

セッション維持のテスト

 セッション維持ができているかのテストとしては、例えばカウンタをセッションに保管し、リクエストがある度にそのカウンタを+1して画面に表示するようにすればわかりやすいかと思います。その際に、セッションID・どちらのTomcatで動作しているかのメッセージも出力するようにしておけば、さらにわかりやすくなるかと。

|

« redMine&OpenLDAP | Main | Apache2.2とTomcatでロードバランサー »

Java」カテゴリの記事

Subversion・Trac・etc.」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack


Listed below are links to weblogs that reference Apache&Tomcatでロードバランサー:

» Apache2.2とTomcatでロードバランサー [気の向くままに・・・]
 Apache2.0.59とTomcat5.5.23の代わりに、Apache2. [Read More]

Tracked on 2007.05.22 14:00

« redMine&OpenLDAP | Main | Apache2.2とTomcatでロードバランサー »