mutao.net

いわゆる雑記。

Apacheでロードバランシング

mod_proxy_balancerとは?

Apache2.2系から使えるようになったらL7のロードバランシング機能を持つmodule。

触れる機会があったのでちょっと調べてみる。

実際にはApacheでロードバランシングしているところを、AWSで言うELBに置き換えたいので調べてみたというところ。

httpd.apache.org

ロードするmoduleは以下。

LoadModule status_module modules/mod_status.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
LoadModule proxy_http_module modules/mod_proxy_http.so

ロードバランシングの設定は以下。

<Proxy balancer://mycluster>
BalancerMember http://127.0.0.1:81 retry=10 loadfactor=10
BalancerMember http://127.0.0.1:82 retry=10 loadfactor=50
</Proxy>
ProxyPass /test balancer://mycluster

このように設定すると http://127.0.0.1:8080/test でLB機にアクセスした場合にBalancerMemberで指定した2つのバックエンドサーバへとアクセスを振り分けられる。

BalancerMemberのパラメータについて

パラメータ 説明
retry コネクションを保持するためのリトライのタイムアウト値を秒単位で指定する。デフォルトで60秒。
loadfactor 1~100までの値で負荷係数を重み付けできる。デフォルトで1。

詳細は以下

httpd.apache.org

ロードバランサの管理画面

以下のように設定すると管理画面を表示することができる。

バランサマネージャと呼ぶらしい。この管理画面ではメンバを変更したり、特定のメンバをオフラインにするといった動的な管理ができる。

なので、Deny from all を指定して接続できる端末を制御する必要がある。ドメイン指定でも可能。

<Location /balancer-manager>
SetHandler balancer-manager

Order Deny,Allow
Deny from all
Allow from 127.0.0.1
</Location>

TODO

dockerで試したけど、キャプチャを取り忘れたのであとで貼ります。。。

LB用Apacheコンテナ * 1

バックエンドサーバ用Apacheコンテナ * 2

な最小構成を試してみました。

Apendix

github.com