次のコマンドを使用して、メンテナンスのために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を使用しています
サーバーをset server proxy-name/server-name health down
でサービスに戻す前にenable server ...
を使用すると、必要な処理が実行されるように見えます。
サーバーは、その後のヘルスチェックによって最終的にサービスが停止されますが、サーバーを取り出したときにサーバーが正常であった場合は役に立ちませんが、サーバーを元に戻したときは正常ではありません。HAProxyはサーバーが有効にしたときと無効にしたときと同じヘルス状態になります。
Haproxy 1.6.3に移行して、新しい agent-check 機能を使用できます。これにより、ホストをローテーションから外すときにホストを排出することもできます。
Loadbalancer.orgでは、これを行うのは少し複雑な方法です:-)。
HAProxyを再起動する前に、現在のすべての状態をチェックし、ダウンまたはメインのサーバーをチェックします。
次に、SYNパケットをブロックします(リロードの問題でドロップされたトラフィックを処理します)次に、HAProxyを再起動します
次に、すべての状態を手動でDOWNまたはMAINTに設定します(0.01秒前の状態に基づきます)。
次に、SYNパケットを再度有効にします。
ダウンタイムやパケットの損失がなく、シームレスな再起動に必要な結果が得られます。
上記のすべてに悩まされない場合は、リロード後にすべてをDOWN状態に設定してください..すばやく実行して指を交差させてください:-)。
v1.6にはいくつかの新しい状態完全再起動コードがありますが、私はまだそれを調査していません。