web-dev-qa-db-ja.com

チェックに失敗した後、HAProxyが回復しない

すべて、

バックエンドサーバーを再起動した後、HAProxyが回復しないという問題があります。負荷分散にプロキシを使用していませんが、クロスドメインの問題を回避するために、異なるURLを異なるサーバー(WebおよびWebサービス)に送信しています。プロキシは最初のチェックが失敗するまで正常に機能しますが、その後、HAProxyはバックアップされると転送を再開しません。プロキシはDockerコンテナ内で実行されており( https://registry.hub.docker.com/u/dockerfile/haproxy/dockerfile/ )、HAProxy1.5.3を実行している必要があります。

haproxy.cfg

global
    log         127.0.0.1 local0
    log         127.0.0.1 local1 notice
    user        haproxy
    group       haproxy

defaults
    mode        http
    log         global
    option      dontlognull
    option      httpclose
    option      httplog
    option      forwardfor
    option      persist
    option      redispatch
    option      http-server-close
    contimeout 5000
    clitimeout 50000
    srvtimeout 50000
    maxconn     60000
    retries     3
    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 403 /etc/haproxy/errors/403.http
    errorfile 408 /etc/haproxy/errors/408.http
    errorfile 500 /etc/haproxy/errors/500.http
    errorfile 502 /etc/haproxy/errors/502.http
    errorfile 503 /etc/haproxy/errors/503.http
    errorfile 504 /etc/haproxy/errors/504.http
    stats enable
    stats uri /haproxy-stats

frontend http-in
    bind *:80

    default_backend       server1
    acl url_server1       path_beg -i     /server1
    acl url_server2       path_beg -i     /services/server2
    use_backend server1   if url_server1
    use_backend server2   if url_server2

backend server1
    balance roundrobin
    option httpchk GET /server1/content/
    server server1 server1:8080 check inter 10s rise 1 fall 5

backend server2
    balance roundrobin
    option httpchk GET /services
    server server2 server2:8181 check inter 5s rise 1

HAProxyのログに、次のエラーメッセージが表示されます。

[WARNING] 040/210248 (1) : Server server1/server1 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
[ALERT] 040/210248 (1) : backend 'server1' has no server available!

ブラウザに表示されるもの:

503 Service Unavailable
No server is available to handle this request.

サーバーを再起動すると、HAProxyがサーバーが復旧したと判断したことを示すログメッセージが表示されず、server1:8080を押してサイトが復旧したことを確認できたとしても、ブラウザーに503エラーが表示されます。

2
Michael Wooten

私は同じ問題に遭遇しました、そして私の理解は、バックエンドのすべてのサーバーがダウンしている場合、HaProxyはバックエンド全体をダウンしていると見なすということです。そして、バックエンドがダウンとしてマークされると、それは元に戻りません(これは文書化されていません、私は私の経験に基づいてこの結論に達しました)。

サーバーは1つしかないため、再起動時にサーバーがダウンとしてマークされる可能性が非常に高くなります。複数のサーバーがある場合、これはロードバランサーの正しい動作になります。

私の解決策は、チェックと落下パラメータの間隔を増やすことでした。

  • riseパラメーターは、サーバーが操作可能であると宣言するために通過する必要のあるチェックの数を設定します。デフォルトは2です。
  • fallパラメーターは、サーバーがデッドと宣言されないようにする必要があるチェックの数を設定します。デフォルトは3です。
  • interパラメータは、これらのチェックの間隔を設定します。デフォルトは2000ミリ秒です。

例えば:

server foo 1.2.3.4:80 check inter 5000 fall 5 rise 1
2
Pedro

同様の行動をしました。 1か月ほど実行した後、サーバーはダウンとしてマークされ、復旧しませんでした。

デフォルトでは、HAProxyは起動時にホスト名をIPに解決します。サーバーがIPアドレスを変更した場合、HAProxyは再起動するまでDNSを再解決しません。特に私たちにとって、私たちはAWSであり、ALB/ELBを指しています。 1か月後、ALB/ELBはIPを変更します(おそらく何らかのメンテナンス)。その時点でIPは不良であり、失敗し続けます。

私たちの解決策は、HAProxy.cfgにリゾルバーを追加することでした。

resolvers myresolver
  nameserver dns1 10.110.0.2:53
  resolve_retries       30
  timeout retry         1s
  hold valid           30s

server myserver <server_name>:443 maxconn 32 check ssl verify none resolvers myresolver

HApRoxyドキュメント

0

私も同じ問題に遭遇しました。 RabbitMQの負荷分散時に、1つのRabbitMQインスタンスが閉じられると、DOWNとしてマークされますが、閉じられたインスタンスを開始した後は、upとしてマークされません。 Pedroの post に従って初期構成を作成し、いくつかの追加を行いました。

  • ヘルスチェックを有効にするためのoption httpchkまたはoption tcp-checkを追加しました。
  • どのportヘルスチェックが使用するかを正確に指定します。 (ポートがサービスと同じポートであっても)

server rabbitmq-1 rabbitmq-1:5672 check port 5672 inter 5s rise 2 fall 3

0
Dogukan