Назад | Перейти на главную страницу

HAProxy не восстанавливается после неудачной проверки

Все,

У меня проблема с тем, что HAProxy не восстанавливается после перезапуска внутреннего сервера. Я использую прокси-сервер не для балансировки нагрузки, а для направления разных URL-адресов на разные серверы (веб-службы и веб-службы), чтобы избежать проблем с несколькими доменами. Прокси-сервер работает нормально до тех пор, пока первая проверка не завершится неудачно, но затем HAProxy никогда не возобновит пересылку на него после резервного копирования. Прокси-сервер работает внутри контейнера докеров (https://registry.hub.docker.com/u/dockerfile/haproxy/dockerfile/), и он должен работать под управлением HAProxy 1.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 определил, что он вернулся, и я все еще получаю ошибку 503 в браузере, хотя я могу нажать server1: 8080 и увидеть, что сайт восстановлен.

Я столкнулся с той же проблемой, и я понимаю, что HaProxy считает, что весь бэкэнд не работает, если все серверы в бэкэнде не работают. И как только серверная часть помечена как неработающая, она больше не возвращается (это не задокументировано, я пришел к такому выводу на основе своего опыта).

Поскольку у вас только один сервер, очень вероятно, что ваш сервер будет помечен как неработающий во время перезапуска. Это было бы правильным поведением балансировщика нагрузки, если бы у вас было несколько серверов.

Мое решение заключалось в увеличении интервала между проверками и параметрами падения:

  • В подъем Параметр устанавливает количество проверок, которое сервер должен пройти, чтобы быть объявленным работоспособным. По умолчанию 2.
  • В падение Параметр устанавливает количество проверок, по которым сервер не может быть объявлен мертвым. По умолчанию 3.
  • В меж Параметр устанавливает интервал между этими проверками. По умолчанию 2000 миллисекунд.

Например:

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

У нас было похожее поведение. Через месяц или около того сервер будет отмечен как неработающий и больше не будет работать.

По умолчанию HAProxy преобразует любые имена хостов в IP-адреса при запуске. Если сервер меняет IP-адрес, HAProxy не разрешает DNS снова до перезапуска. Специально для нас мы AWS и указываем на ALB / ELB. Через месяц 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

Я столкнулся с той же проблемой. При балансировке нагрузки RabbitMQ, когда один экземпляр RabbitMQ закрыт, он помечается как DOWN, но после запуска закрытого экземпляра он не помечается как активный. Выполнение начальной настройки по Педро Почта, Я сделал некоторые дополнения.

  • Добавлено option httpchk или option tcp-check для включения проверки работоспособности.
  • Уточнено, какие именно port проверка работоспособности использует. (Даже если порт совпадает с портом службы)

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

Я наткнулся на ту же проблему, и я думаю, что это сделано намеренно. HAProxy имеет свойство fall несет ответственность за это поведение:

fall <count>  
   The "fall" parameter states that a server will be considered as dead after
   <count> consecutive unsuccessful health checks. This value defaults to 3 if
   unspecified. See also the "check", "inter" and "rise" parameters.

Понятия не имею, как вернуть мертвый экземпляр. Я пробовал даже интерактивная консоль, упомянутая в этом вопросе