2005年12月02日

Apache 2.2がでました。
mod_dbdとか、mod_proxy_balancerとか気になる新機能てんこ盛りです。
ひげぽんさんの所に

誰か入れてみた人いますか?

と有ったのでmod_proxy_balancerを試してみました。

超簡単でした
mod_proxymod_proxy_balancerを参考にしました。
既に日本語ドキュメント完備!

以下から駆け足で、またセキュリティ的によろしくない設定例が多々あります

とりあえずこんな設定を仕込んでみました

ProxyPass /lb balancer://TEST stickysession=sesid
<Proxy balancer://TEST>
#1
BalancerMember http://i.yappo.jp loadfactor=10
#2
BalancerMember http://www.google.co.jp loadfactor=5 route=2
#3
BalancerMember http://www.yahoo.co.jp loadfactor=5 route=3 redirect=2
#4
BalancerMember http://127.0.0.1:8081 loadfactor=1
#5
BalancerMember http://127.0.0.1:8082 loadfactor=1 route=4 redirect=2
</Proxy>
基本的には、リバースプロクシを仕込むのと大差ありません。
balancer://hogehogeは、複数扱うことも可能です。
バランシング方法は、転送サイズとリクエスト数のどちらかが選べますが、分かりやすくするためにリクエスト数にしておきました。
loadfactorというパラメータは、優先順位みたいなもので、今回の設定だと1 1 2 3 1 1 2 3 1 1 2 3 1 1 2 3 4 1 1 2 3 5という感じでバランシングされました。
細かいパラメータはProxyPass ディレクティブを参考してください。

mod_proxy_balancerで嬉しい機能は、バックエンドのWebサーバが停止した事を自動的に検知して、止まってるサーバにリクエストを投げないですむ事です。
また、専用の管理画面も提供しているので、どのクラスタのどのサーバが落ちてるかが一目瞭然です。

<Location /LBMAN>
SetHandler balancer-manager
</Location>
という設定を仕込むと
http://localhost/LBMAN 経由から管理画面にアクセスできます。
また、管理画面にてhttpd.confで設定した内容を動的に変更することも可能です。
また、指定したバックエンドサーバを利用しないようにする設定も簡単です。
後ろのサーバ一台だけメンテしたい!って時にも最適です。


極めつけはstickysessionです。
これは、CookieもしくはURLの文字列の中に指定したパラメータ名があると、そのパラメータを見てどのサーバを振り向けるかを明示的に指定可能になります。
今回の例だとsesidというパラメータ名です。
route=3っていう設定に意味があります。

具体的にはApacheが

GET /lb/ HTTP/1.0
Cookie: sesid=hogegege.3;
というリクエストを受け取ったらYahooに強制的に振り向けます。
で、redirect=2についてですが、stickysessionに適合したサーバが落ちていた/管理画面で利用停止した場合に代替的に振り向けるサーバになります。
Yahooが落ちていたらGoogleに振り向けられるわけです。
で、代わりのサーバも利用不可能だったらランダムにバランシングされます。

で、携帯電話とかはCookieが使えないものが有るのでどうしようって、感じですがバッチリ対応しています。
こんなリクエストがくればおkです。
GET /lb/?sesid=iofhwehg.3 HTTP/1.0
POST /lb/?sesid=iofhwehg.3 HTTP/1.0
GET /lb/hogege/sesid=iofhwehg.3 HTTP/1.0
GET /lb/hogege/sesid=iofhwehg.3?id=hogaga HTTP/1.0
GET /lb/dyfoeifYGfiussesid=iofhwehg.3 HTTP/1.0

ただし、下記の例は動きません。
GET /lb/?sesid=iofhwehg.3&id=hoge HTTP/1.0
GET /lb/?sesid=3 HTTP/1.0
GET /lb/sesid=sddas.3/hoge HTTP/1.0

これには理由があって、以下の条件を満たすURL文字列でないといけないのです。
1.stickysessionに指定された文字列がある
2.stickysessionに指定された文字列の直後が=である
3.そのパラメータの値には.が入っている必要がある
4..以降から、URLの末尾もしくは?が出てくるまでの文字列がrouteで設定されてなければならない。

こんな感じです。
だからPOSTでも何でも条件さえ満たしてれば携帯でも使えます。
要はURLの末尾に必ずおけばいいです。

なんてのは大嘘で、おそらくバグがあって上の例じゃどうやっても動きません。
GET /lb/?sesid==iofhwehg.3 HTTP/1.0
のように=を2個つなげればいけると思います。(Cookie使うのだったら問題ない)
たぶん、なんらかの間違いだと思いPatchを付けたバグレポート出してみました


Webアプリ側ではstickysessionに配慮した構築を行わないとstickysessionを使いこなせなさそうですが、stickysession使わなければとてもお手軽にバランシング出来るので、あとは安定稼動すればおkなだけ!


オマケ:管理画面にxmlというパラメータを渡すと…(例: http://localhost/LBMAN?xml=1 )設定がxmlで取り出せます。多分作成中の画面かと。

Posted by Yappo at 2005年12月02日 21:48 | TrackBack | tech
Comments

ロードバランサ機能を有効にした場合
メンバーサーバでのCGI変数はどのようになりますでしょうか?
リバースプロキシを使用したときみたいに
中継サーバからアクセスされたようなCGI変数になるのでしょうか??

Posted by: ぺぺ at 2006年04月14日 18:49
Post a comment









Remember personal info?






コメントを投稿する前に↓の場所にnospamと入力してください。