で、ラウンドロビンのみはやめて、複数サーバに振り分け&ロードバランシングという設定をしてみた。
参考はまたもやYAPCでのnaoyaさんのプレゼン資料。すんばらし。
確かに簡単。
<Proxy balancer://application>
BalancerMember http://app0.example.local loadfactor=10
BalancerMember http://app1.example.local loadfactor=10
BalancerMember http://app2.example.local loadfactor=10
BalancerMember http://app3.example.local loadfactor=10
</Proxy>
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteRule ^/(.*)$ balancer://application/$1 [P]
という具合。全部フロントサーバに設定する。
これで動作を確認すると、確かにローテーションしてるし、どれかのサーバが返答がない場合は飛ばして次のサーバにアクセスしてくれる。
RewriteCondの部分はフロントサーバにファイルがない場合にRewriteRuleを適用するという事。cssやjsファイルはフロントサーバが返せばいいので(フロントサーバ以外が返した方が良い事もあるだろうけど、少なくともアプリケーションサーバが返す意味はない)。画像やfeed(特にfeed)になるとまたアクセスが極端な場合が多いので、これはまた専用のサーバを用意した方が良いらしい。たしかにそうだろう。
あと、最近DNS ラウンドロビンと高可用性 (High Availability)で知ったんだけど、最近のUAはラウンドロビンで返されたIP郡に、アクセスが成功するまで接続を試みるらしい。コメント欄にあるようにそういう振る舞いをしないUA用に助長構成を用意しないと行けませんが、実際そういう設備を用意できない状態でもフロントサーバを増やすだけで、ある程度は担保されるというのは頼もしいです。(なによりDNSに任せられるのは簡単で楽だ)
全てのUAが、複数IPが返された場合は、初めのIPにアクセス出来なくても可能な限り後続のIPにも接続を試みる様になってほしいですね。