16

これが私のシナリオです(私の前任者によって設計されました):

多数の混合バックエンド 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% 確認したいと思います。

4

2 に答える 2

12

http://httpd.apache.org/docs/2.4/mod/mod_proxy.htmlセクション「BalancerMemberparameters」、property = try:

バックエンドサーバーへの接続プールワーカーがエラー状態の場合、Apache httpdは、タイムアウトが経過するまで、そのサーバーにリクエストを転送しません。これにより、[one]はメンテナンスのためにバックエンドサーバーをシャットダウンし、後でオンラインに戻すことができます。値0は、タイムアウトなしでエラー状態のワーカーを常に再試行することを意味します。

ただし、mod_whateverを使用しても検出されない他の障害状態があります。たとえば、ダウンしているアプリケーションを実行しているIISバックエンドなどです。IISが起動しているため、接続を確立してページを読み取ることができます。ページは常に500内部サーバーエラーになります。ここでは、failonerrorを使用してそれをキャッチし、ワーカーを強制的にエラー状態にする必要があります。

すべての場合において、ワーカーがエラー状態になると、トラフィックはワーカーに転送されません。私はその最初の失敗を消費して再試行するさまざまな方法を試してきましたが、エラーページがクライアントに戻る場合が常にあるようです。

于 2012-08-30T15:49:46.970 に答える
0

「BalancerMember parameters」にプロパティ「ping」があります

ドキュメントを読むと、「ping」を 500 ミリ秒に設定すると、mod_proxy が BalancerMember に誘導する前にリクエストが送信されるようです。mod_proxy は BalancerMember からの応答を 500 ミリ秒待ちます。mod_proxy が応答を取得しない場合、BalancerMember はエラー状態になります。

私はこれを実装するのに疲れましたが、ライブ BalancerMember への誘導には役立たないようです。

<Proxy balancer://APICluster>
    BalancerMember https://api01 route=qa-api1 ttl=5 ping=500ms
    BalancerMember https://api02 route=qa-api2 ttl=5 ping=500ms
    ProxySet lbmethod=bybusyness stickysession=ROUTEID
</Proxy>

http://httpd.apache.org/docs/2.4/mod/mod_proxy.html

Ping プロパティは、リクエストを転送する前にバックエンドへの接続を「テスト」するよう Web サーバーに指示します。AJP の場合、mod_proxy_ajp が ajp13 接続で CPING 要求を送信するようにします (Tomcat 3.3.2+、4.1.28+、および 5.0.13+ で実装)。HTTP の場合、mod_proxy_http は 100-Continue をバックエンドに送信します (HTTP/1.1 でのみ有効 - HTTP/1.1 以外のバックエンドでは、このプロパティは効果がありません)。どちらの場合も、パラメーターは応答を待機する秒単位の遅延です。この機能は、ハングしたりビジー状態のバックエンドの問題を回避するために追加されました。これにより、通常の操作中にネットワーク トラフィックが増加し、問題になる可能性がありますが、クラスター ノードの一部がダウンまたはビジー状態の場合はトラフィックが低下します。ms の接尾辞を追加することで、遅延をミリ秒単位で設定することもできます。

于 2015-11-25T20:18:04.930 に答える