mod_proxy_balancerで中〜大規模サーバー運用するときの勘所 – (3) BalancerMemberに渡すパラメーター編

Apache2.2から、ロードバランシングをしてくれるmod_proxy_balancer というモジュールが標準添付になりました。

このモジュール、その名前の通り、ApacheレベルでHTTPリクエストをバックエンドのサーバーに振り分けることでロードバランシングをしてくれるモジュールです。

Apacheの公式ドキュメントや試しに入れてみた人のBlogなどは散見されますが、実際の現場で運用している事例というのはまだ無いようです。

そこで、実際にピーク時にover 500 request/secでmod_proxy_balancerなサーバーを運用している経験をふまえ、つまずいた点などを公開していきたいと思います。

今回は、BalancerMemberディレクティブに渡すパラメーターのチューニングについてです。前回までの設定ではhttpd.confに以下のように書いていたかと思います。

ProxyRequests Off
ProxyPass / balancer://cluster/ timeout=2

<Proxy balancer://cluster/>
BalancerMember http://192.168.1.1/ loadfactor=10
BalancerMember http://192.168.1.2/ loadfactor=10
</Proxy>

さて、mod_proxy_balancerはバックエンドのサーバーが生きているかどうかを試すために、常に一定数のリクエストをBalancerMemberディレクティブで設定されたバックエンドのサーバーに投げているようです。SetHandler server-statusで見られるページには以下のようなアクセスとして見えます。(ExtendedStatus Onにしておかないと見られません)

Srv PID Acc M CPU SS Req Conn Child Slot Client VHost Request
13-0 - 0/0/117397 . 0.85 3 1 0.0 0.00 299.21 ::1 example.com GET /

さて、このリクエストを逆手にとって、HTTP/1.1のKeepAliveさせることで、新たにバックエンドとHTTPコネクション張るをコストを押さえようと考えました。

まず、バックエンドのサーバーのhttpd.confを編集することで、HTTP/1.1のKeepAliveを有効にします。

KeepAlive On
MaxKeepAliveRequests 300
KeepAliveTimeout 30

これで、HTTPレベルでのKeepAliveはOKになりました。

その後、mod_proxy_balancerの入っているサーバーからバックエンドとのコネクションがTCP/IPレベルで切断されないように、TCP/IPレベルでKeepAliveするようにBalancerMemberにkeepaliveパラメーターを渡しました。

ProxyRequests Off
ProxyPass / balancer://cluster/ timeout=2

<Proxy balancer://cluster/>
BalancerMember http://192.168.1.1/ loadfactor=10 keepalive=On
BalancerMember http://192.168.1.2/ loadfactor=10 keepalive=On
</Proxy>

残念ながら、この設定をする前とした後でのベンチマークを取っていないので、確実にスピードアップが図れたかどうかは不明ですが、おそらくレスポンスタイムは向上していると思います。

次回はmod_deflateと組み合わせる際の注意点を解説します。

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>