web-dev-qa-db-ja.com

サーバーをメンテナンスモードから解除する前に、HAProxyにヘルスチェックが成功するのを待たせる方法

次のコマンドを使用して、メンテナンスのためにWebサーバーを停止する前に、HAProxyソケット通信を使用してバックエンドをメンテナンスモードにします。

echo "disable server cluster-01/app-01-4" | Sudo socat stdio /tmp/haproxy.sock

問題は、socket enableコマンドを使用してバックエンドを再度使用可能としてマークすると、HAProxyは、バックエンドに要求を送信する前に、正常なヘルスチェックを待機しないことです。そのため、HAProxyがサーバーがまだダウンしていることに気づき、サーバーをオフラインに戻す前に、一部のリクエストが失われることになります。

バックエンドが正常になるまで待ってから有効にするようにHAProxyに指示する方法はありますか?または、HaProxyにバックエンドを再度有効にするように指示する前に、起動スクリプトをサーバー自体を監視するのに十分スマートにする必要がありますか?これは明らかに理想的とは言えません。

私は現在これを行っています:
echo "enable server cluster-01/app-01-4" | Sudo socat stdio /tmp/haproxy.sock

代わりに使用できるこれに似たものはありますか? echo "enable server cluster-01/app-01-4 WAIT_FOR_SUCCESSFUL_HEALTH_CHECK" | Sudo socat stdio /tmp/haproxy.sock

編集:私はHAProxyバージョン1.5xを使用しています

2
WickedElephant

サーバーをset server proxy-name/server-name health downでサービスに戻す前にenable server ...を使用すると、必要な処理が実行されるように見えます。

サーバーは、その後のヘルスチェックによって最終的にサービスが停止されますが、サーバーを取り出したときにサーバーが正常であった場合は役に立ちませんが、サーバーを元に戻したときは正常ではありません。HAProxyはサーバーが有効にしたときと無効にしたときと同じヘルス状態になります。

1

Haproxy 1.6.3に移行して、新しい agent-check 機能を使用できます。これにより、ホストをローテーションから外すときにホストを排出することもできます。

0
Zypher

Loadbalancer.orgでは、これを行うのは少し複雑な方法です:-)。

HAProxyを再起動する前に、現在のすべての状態をチェックし、ダウンまたはメインのサーバーをチェックします。

次に、SYNパケットをブロックします(リロードの問題でドロップされたトラフィックを処理します)次に、HAProxyを再起動します

次に、すべての状態を手動でDOWNまたはMAINTに設定します(0.01秒前の状態に基づきます)。

次に、SYNパケットを再度有効にします。

ダウンタイムやパケットの損失がなく、シームレスな再起動に必要な結果が得られます。

上記のすべてに悩まされない場合は、リロード後にすべてをDOWN状態に設定してください..すばやく実行して指を交差させてください:-)。

v1.6にはいくつかの新しい状態完全再起動コードがありますが、私はまだそれを調査していません。

0