すべて、
バックエンドサーバーを再起動した後、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エラーが表示されます。
私は同じ問題に遭遇しました、そして私の理解は、バックエンドのすべてのサーバーがダウンしている場合、HaProxyはバックエンド全体をダウンしていると見なすということです。そして、バックエンドがダウンとしてマークされると、それは元に戻りません(これは文書化されていません、私は私の経験に基づいてこの結論に達しました)。
サーバーは1つしかないため、再起動時にサーバーがダウンとしてマークされる可能性が非常に高くなります。複数のサーバーがある場合、これはロードバランサーの正しい動作になります。
私の解決策は、チェックと落下パラメータの間隔を増やすことでした。
例えば:
server foo 1.2.3.4:80 check inter 5000 fall 5 rise 1
同様の行動をしました。 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
私も同じ問題に遭遇しました。 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