Top > MyPage
 

Apache mod_proxy_balancerをさわってみた

mod_proxy_balancerとは

mod_proxy_balancerは、Apache2.2で実装された負荷分散のためのmod_proxy拡張モジュールである。

負荷分散講習会 Apache編を参考にためしてみた。

Apacheのセットアップ

Apacheを入手する

Apacheは公式サイトのダウンロードページより、入手することが出来る。これを書いている時点の最新版は2.2.11である。Windows版はmsiファイルか、ソースファイルをダウンロードすることができる。今回は、OpenSSLも組み込まれている方のmsiファイルをダウンロードした。

ダウンロードしたらmsiファイルをダブルクリックしてインストーラを起動して、表示にしたがってインストールする。今回はC:\Apache2.2.11にインストールした。

httpd.conf編集

正直なところ、以降の設定全てが必要なのかどうかは、わかっていない。とりあえず、今回行った編集について書く。

#どれが必須なのかわからないのでmod_proxy系を全部アンコメント
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so

#バランサマネージャを使うために、これもアンコメント
LoadModule status_module modules/mod_status.so



#これをhttpd.confに書き足した
<VirtualHost *:80>
  ProxyRequests Off
  
  #除外ディレクティブを先にする必要あり
  ProxyPass /balancer-manager !
  #リバースプロキシの設定?
  ProxyPass / balancer://cluster/
  #こっちも設定しておかないと、urlがかわってしまう。
  ProxyPassReverse / balancer://cluster/
  
  #ロードバランス管理画面の設定
  <Location /balancer-manager>
    SetHandler balancer-manager
    Order Deny,Allow
    Deny from all
    #管理画面を使用するクライアントやネットワークを指定
    Allow from 192.168.0.0/24
  </Location>
  
  #バックエンドの構成
  #loadfactorは1から100の間で設定。値が大きいほど、使用頻度が大きくなる。
  <Proxy balancer://cluster/>
    BalancerMember http://127.0.0.1:8080/ loadfactor=10
    BalancerMember http://192.168.0.44:8400/ loadfactor=10
  </Proxy>
</VirtualHost>

こうして、apacheを再起動して、http://localhost/をたたくと、http://127.0.0.1:8080/かhttp://192.168.0.44:8400/にわたされる。

sticky session

クッキーのセッションIDについている識別情報を見て、接続先を決定する機能がある。

上の例の設定に書き加えて、次のようにする。(要点だけ抜き出しているので注意)

  
  #sticky sessionの変数名を設定
  ProxyPass / balancer://cluster/ stickysession=JSESSIONID

  
  <Proxy balancer://cluster/>
    #ひとつめにrouteとredirect、ふたつめにrouteを追加
    BalancerMember http://127.0.0.1:8080/ loadfactor=10  route=node1 redirect=node2
    BalancerMember http://192.168.0.44:8400/ loadfactor=10 route=node2
  </Proxy>
</VirtualHost>

stickysessionは必要であるのは確かなのだが、どういう変数名にするのが正しいのかわからない。

routeはトムキャットのserver.xmlのEngineタグの属性にjvmRouteを追加して、その値と同じものを設定する。

redirectは、このノードがダウンしたときの代替となるノードを設定する。互いを設定するということが出来ないので、一つ目にしかない。

2台のPCで動作しているTomcatに対してロードバランシング

実は、上の設定ではフェイルオーバーがうまくいかなかった。

次のようにしたところ、問題なくフェイルオーバーが機能した。(要点だけ抜き出しているので注意)

  
  # nofailover=Offの記述を追加
  ProxyPass / balancer://cluster/ stickysession=JSESSIONID  nofailover=Off

  
  <Proxy balancer://cluster/>
    #redirectは不要 プロトコルをhttpではなくajpにして、ポートをtomcatの設定どおりのものに変更
    BalancerMember ajp://127.0.0.1:8009/ loadfactor=10  route=node1
    BalancerMember ajp://192.168.0.44:8009/ loadfactor=10 route=node2
  </Proxy>
</VirtualHost>

このように設定して最初にアクセスしたとき、node1に接続されたとする。

そこで、ログインした後、node1をシャットダウンすると、node2に接続先が変更され、作業を継続することが出来る。(トムキャットのセッションレプリケーションは効いていることが前提)

node1を復旧させると、再びnode1の方に接続されるようになる。