これが私のシナリオです(私の前任者によって設計されました):
多数の混合バックエンド Web サーバー (Apache、IIS、Tomcat など) のリバース プロキシを提供する 2 つの Apache サーバー。複数のバックエンド Web サーバーがあるサイトがいくつかあります。そのような場合、次のようなことを行います。
<Proxy balancer://www.example.com>
BalancerMember http://192.168.1.40:80
BalancerMember http://192.168.1.41:80
</Proxy>
<VirtualHost *:80>
ServerName www.example.com:80
CustomLog /var/log/apache2/www.example.com.log combined
<Location />
Order allow,deny
Allow from all
ProxyPass balancer://www.example.com/
ProxyPassReverse balancer://www.example.com/
</Location>
</VirtualHost>
したがって、この例では、プロキシ サーバーの構成に 1 つのサイト (www.example.com) があり、そのサイトは 2 つのバックエンド サーバー (192.168.1.40 および .41) のいずれかにプロキシされます。
これを評価して、すべての Web サービスでフォールト トレラントであることを確認しています (この理由で、2 つのリバース プロキシ サーバーを共有 IP クラスターに既に配置しています)。バランスの取れたバックエンド サーバーはフォールト トレラントでもあります。しかし、バックエンドの障害検出 (および障害のあるバックエンド サーバーを回避するためのロジック) が mod_proxy_balancer モジュールに組み込まれているかどうかを判断するのに苦労しています...
では、192.168.202.40 がダウンした場合、Apache はこれを検出し (失敗したリクエストを最初に受け取るかどうかはわかります)、すべてのリクエストを他のバックエンド 192.168.202.41 に自動的にルーティングしますか? それとも、障害が発生したバックエンドと運用中のバックエンドの間でリクエストのバランスを取り続けますか?
mod_proxyおよびmod_proxy_balancerの Apache ドキュメントで、失敗を検出できることを示しているように見えるいくつかの手がかりを見つけました (「maxattempts = あきらめる前のフェイルオーバー試行の最大回数」、「failonstatus = HTTP の単一またはコンマ区切りのリストステータス コード。これを設定すると、バックエンドがリスト内のステータス コードを返したときにワーカーが強制的にエラー状態になります。」少なくとも「すべき」) バックエンドの障害と回復を検出します。
検索結果のほとんどは、AJP プロトコルを使用してトラフィックをバックエンド サーバーに渡すことを参照していると言えます。これは明らかに障害検出をサポートしていますが、私のバックエンドは Apache、IIS、Tomcat などの混合物であり、私はそれらの多くが AJP をサポートしていないことは確かです。それらは、さまざまな要件を持つさまざまなアプリケーションを実行する Windows 2k3/2k8 と Linux (ほとんどが Ubuntu Lucid) ボックスの混合物でもあるため、Backhand や LVS などのアドオン モジュールは私にとってオプションではありません。
また、次のような新しいテスト サイトを作成して、この機能を経験的にテストしようとしました。
<Proxy balancer://test.example.com>
BalancerMember http://192.168.1.40:80
BalancerMember http://192.168.1.200:80
</Proxy>
<VirtualHost *:80>
ServerName test.example.com:80
CustomLog /var/log/apache2/test.example.com.log combined
LogLevel debug
<Location />
Order allow,deny
Allow from all
ProxyPass balancer://test.example.com/
ProxyPassReverse balancer://test.example.com/
</Location>
</VirtualHost>
192.168.1.200 は、バックエンドの障害をシミュレートするために、Web サーバーを実行していない偽のアドレスです。テスト サイトは、多数の異なるクライアント マシンに対して問題なく提供されましたが、LogLevel をデバッグに設定しても、バックエンド サーバーの 1 つがダウンしていることを検出したことを示すログは何も記録されませんでした...そして運用サイトに影響を与えることなく、負荷分散されたバックエンドをメンテナンスのために (もちろん一度に 1 つずつ) 停止できることを 100% 確認したいと思います。