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と組み合わせる際の注意点を解説します。