4

私は、Docker、registrator、consul、および HAProxy に基づくマイクロサービス アーキテクチャに取り組んでいます。

また、Consul-template を使用して、HAProxy 構成ファイルを動的に生成しています。すべて正常に動作します: 同じマイクロサービスの複数のインスタンスを追加すると、HAProxy 構成がすぐに更新され、ラウンド ロビン戦略を使用してリクエストが正しくディスパッチされます。

一部のインスタンスを削除 (スケールダウン) すると問題が発生します。リクエストの実行中にコンテナがシャットダウンされると、エラーが発生します。

私は HAProxy を初めて使用するので、コンテナーが消失した場合に別のエンドポイントへの失敗した要求を再試行するように HAProxy を構成する方法はありますか?

精度: フロントエンドとバックエンドにレイヤー 7 ルーティング モード (モード http) を使用しています。これが私の consul-template ファイルの小さなサンプルです:

backend hello-backend
    balance roundrobin
    mode http
    {{range service "HelloWorld" }}server {{.Node}} {{.Address}}:{{.Port}} check
    {{end}}

    # Path stripping
    reqrep ^([^\ ]*)\ /hello/(.*) \1\ /\2

frontend http
    bind *:8080
    mode http

    acl url_hello path_beg /hello
    use_backend hello-backend if url_hello

ご協力ありがとうございました。

4

1 に答える 1

4

すでにバックエンドに送信されたリクエストを HAProxy が再送信することはできません。

これは、作成者であるウィリーからのフォーラム投稿です。

再ディスパッチは、リクエストがまだ haproxy にある場合にのみ発生します。一度送信すると実行できません。サーバーが終了して RST を返す前に、サーバーで何らかの処理が開始されたかどうかを知る方法がないため、非べき等の要求に対しても実行してはなりません。

http://haproxy.formilux.narkive.com/nGKXq6WU/problems-with-haproxy-down-servers-and-503-errors

投稿はかなり古いですが、最近の議論に基づいてまだ適用できます。リクエストがより大きい場合tune.bufsize (デフォルトは約 16KB iirc)、HAProxy はエラーが発生した時点でリクエスト全体をメモリに保持していません。

幸いなことに (技術的に)、残念なことに (現実世界の実用性のために)、Willy は常に HAProxy による正しい動作を主張してきました。これは、処理が重複する場合があるためです。

GET定義上、べき等である必要があるリクエスト (リクエストはGET結果を伴わずに繰り返し可能でなければなりません。そうでない場合は、使用するように設計されているべきではありません。または別の動詞GETである必要がありますPOST) には、別のバックエンドに再送信するという実行可能な議論があります。は正当な行動方針ですが、これも現在サポートされていません。

対照的に、Varnish は、が (HAProxy の背後で) 使用した do-over をサポートしておりGET、同じオブジェクト名前空間のオンライン ストレージとニアライン ストレージがある要求で成功しています。古い「人気のない」ファイルはニアライン (より低速で安価な) ストレージに移行されますが、すべての要求はオンライン ストレージに送信され、オンラインで 404 が返された場合は再試行先がニアラインになります。以外のリクエストでこれを試したことはありませんGET

理想的には、バックエンドが異常であると宣言されるソリューションが理想的です。おそらく、シャットダウンする前に、排水時間の HTTP ヘルス チェックを意図的に失敗させることによります。かなり単純なアプローチの 1 つは、シャットダウン前にバックエンドから削除される静的ファイルの存在をヘルス チェックに要求することです。または、統計/管理 UI またはソケットを介して HAProxy にバックエンドがメンテナンス モードであると見なすように要求し、実行中の要求をドレインしながら、それ以上の要求が開始されないようにすることができます。

于 2016-08-26T12:19:31.730 に答える