とりあえず実現したい内容は、APサーバーへの負荷分散とフェールオーバー。
それと、APサーバー同士でのセッションレプリケーション。
構築環境は相変わらす、Apache2.2.8とTomcat6.0.16。
まずApache側の設定。http.conf内の
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
の2行をコメント解除する。
もし、上記2行がない場合は、Apacheを再インストール(./configure時に上記2つの追加を忘れないように。)、もしくは、apxsにてモジュールを追加しよう。
前回、
<Location />
ProxyPass ajp://localhost:8009/
</Location>
としていた部分を、
<Location />
ProxyPass balancer://tomcat/ stickysession=JSESSIONID nofailover=Off
</Location>
<Proxy balancer://tomcat/>
BalancerMember ajp://localhost:8009/ route=jvm1 loadfactor=100
BalancerMember ajp://localhost2:8009/ route=jvm2 loadfactor=1
</Proxy>
という風にする。
ちょっと、解説。まず、ProxyPassの項目。
・balancer://tomcat/
バランサー名称。どのbalancerを使うかを決定している。
・stickysession=JSESSIONID
この設定をしないで、動作させると毎回アクセスするAPサーバーが変わってしまう。
最初に使用したサーバを使用し続け、障害時にのみ別のサーバに切り替わるようにしたい場合もあると思います。その場合はstickysessionを指定します。
今回はTomcatを利用しているため、JSESSIONIDを基にリクエストを流すAPサーバーを決めようということです。
・nofailover=Off
アプリケーションサーバがフェールオーバーに対応していれば、nofailover=Offとする。
今回はTomcatでセッションレプリケーションを実現させるから、フェールオーバーに対応しているつもり。
次にBalancerMemberの項目
・ajp://localhost:8009/
APサーバーのパス。
・route=jvm1
これが上記のstickysession=JSESSIONIDの関連している。
これはURLやcookie内のJSESSIONIDの後にピリオドを付加して、その後ろにrouteの文字列を付加することでサーバを割り振るための設定。
要は、JSESSIONIDに".jvm"があれば、その定義しているAPサーバーへ割り振ると解釈している。
これで、同じセッション間は同じAPサーバーが処理するようになっているつもり。
・loadfactor=100
処理する割合を1〜100の範囲で指定できる。
今回は、localhost2はバッチ系の処理をメインにしてもらう予定なので、localhostの1/100のリクエスト量だけを処理して貰うつもり。
Apache側の設定はこんなもんかな。
次はTomcatの設定。まずは、JSESSIONIDにrouteの文字列を付加する設定。
mod_proxy_balancerは文字列を読み取ってサーバを割り振ることだけで、
実際のJSESSIONIDはTomcatでやんないとダメ。
では早速、server.xml内の
<!-- You should set jvmRoute to support load-balancing via AJP ie :-->
<Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
上記のようにjvmRoute="jvm1"を追加するだけ。
もちろん、もう一台のAPサーバーには、jvmRoute="jvm2"とする。
実に簡単。これで、APサーバー毎にセッションIDに特定の文字を付加するようになり、Apacheはそれを判断してバランシングできるようになった。
また、一方のAPサーバーがダウンした場合はそれを検知し、正常なAPサーバーにリクエストを渡してくれる。俗に言うフェールオーバー機能も完成。便利だ。
次は、Tomcat間のセッションレプリケーションだけど、疲れたんで次回にしよう。。。