HAProxyインスタンスの背後でTomcatsを使用したローリングデプロイ

HAProxyインスタンスの背後でTomcatsを使用したローリングデプロイ

HAProxy の背後で 3 つの Tomcat インスタンスを実行しています。Web アプリケーションに変更を展開するときに、ユーザーにダウンタイムが発生しないように、ローリング デプロイ (つまり、一度に 1 つの Tomcat をバウンスする) を実行したいと思います。

どうすればいいですか? 実行中の haproxy インスタンスはホット再構成できることがわかりました (これは新しいプール サーバーの追加や削除に適しています)。しかし、ターゲット サーバーの 1 つが一時的にダウンした場合、HAProxy はどのように反応しますか?

HAProxy よりも優れたソリューションがあれば、それも検討したいと思います。

ありがとう!

答え1

Willy Tarreau に電子メールを送信したところ、次のオプションが返ってきました。

  1. 統計サーバーにホット再構成または socat コマンドを使用して、ターゲット サーバーの重みを 0 に設定できます。これにより、新しいセッションがそのサーバーに分散されなくなりますが、既存の接続には影響しません。

  2. http-checkdisable-on-404 オプションを「option httpcheck /myurl」と組み合わせて設定し、対象サーバーが /myurl に応答して、すべてが正常であれば 200 ステータスを送信し、サーバーが新しいリクエストの受信を停止する場合は 404 を送信し、サーバーが何も受信しない場合は (つまり、サーバーをバウンスする準備ができたとき) 500 を送信するようにすることができます。haproxy は、サーバー行で指定された間隔でサーバーを再チェックします。

答え2

HAProxyは@に従って再構成なしでの削除をサポートしていないためアーネスト・ミュラー彼の答え他のシナリオもご要望がありましたので、代替案をご提案させていただきます。

私が使うLVS のこれは、HTTP 以外にも使用できるため、負荷分散のための私のお気に入りのソリューションの 1 つです。

LVS を使用すると、手動でサーバーを追加および削除できますipvsadm。削除の例は次のコマンドです。

/sbin/ipvsadm -e -t VIP:443 -r SERVERIP:443 -g -w WEIGHT

LVSと対話して手動で追加したり削除したりする代わりに、私は多くの場合requestldirectord. ldirector は、ipvs 構成をポーリングして管理するデーモンです。このパラメータを使用して、URI パスでファイルを指定できます。ロールアウト中は、ファイルを削除し、サーバーへのアクセスが停止するまで待機します。その時点で、実稼働クライアントに影響を与えることなくコードを展開できます。

答え3

これの多くは、Tomcat でセッション/状態管理を行っているかどうかによって異なります。再起動によってユーザーのセッションが破棄された場合、ローリングではユーザーへの影響を防ぐことはできません (500 が表示されることは防げますが、セッションを最初からやり直す必要は防げません)。スティッキー セッションを使用していない場合は、おそらくそのことを心配する必要はありません。

HAproxy やその他のロード バランサには、背後のサーバが稼働しているか停止しているかを迅速に判断し、それに基づいてトラフィックを再ルーティングする方法があります (HAProxy の「ヘルス チェック」)。ただし、これを完璧に実行することは不可能です。Tomcat では、「稼働中」と「停止中」だけではありません。「稼働中 (ポートで応答しているという意味) ですが、まだ準備ができていません」という状態もあります。したがって、ユーザーへの影響を完全に防ぐために LB に頼るべきではありません。ヘルス チェックが適切であっても、トラフィックが不良ノードに送信される間隔が存在します。

ローリング デプロイで行うこととは、サーバーをロード バランサーからアクティブに取り出し、ノードをいじったり再起動したりして、自動テストやモニターに合格するまで待機し、その後サーバーを戻して、次のサーバーに移動することです。これは、サーバーを無効にするためにリモートで (スクリプトなどから) 呼び出すことができる API を備えたロード バランサーを使用すると簡単になります。以前の Netscaler ではこれができましたが、HAProxy ではできません。HAProxy では、構成を編集して再起動するか (残念)、ヘルス チェックを操作できる場所に変更する必要があります。たとえば、そのノードを除外したいときに名前を変更するマジック ファイルをチェックするなどです。ヘルス チェックが実行されてノードがクラスターから出るまで待つ必要がありますが、その後は問題ないはずです。

私は出会ったこの郵便受けこの問題に対する iptables 関連の解決策があります...

関連情報