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

haproxy не выполняет проверку работоспособности после восстановления DNS

Мое желаемое поведение haproxy следующее:

  1. не упустите возможность начать, если не удалось разрешить внутренний адрес
  2. использовать libc разрешать адреса во время начала; в конфигурации не должно быть DNS-серверов
  3. использовать libc разрешить адреса в время выполнения
  4. всегда повторять попытку разрешения имени, если предыдущая попытка не удалась
  5. Не спамите мой DNS-сервер каждые 10 секунд. Разрешать имя только при необходимости

_

Не уверен, что делать (3). В resolvers раздел вроде поддерживает только DNS, какого черта? Если я добавлю туда сервер имен и resolvers на мой сервер string, он начинает работать, но каждые 10 секунд отправляет DNS-запрос. Я не хочу этого. Когда я устанавливаю клиентское соединение, я готов дождаться, пока haproxy разрешит серверную часть, используя libc, синхронно.

Я отключаюсь от сети, убеждаюсь, что серверная часть неразрешима, и перезапускаю haproxy. Затем я подключаюсь к сети, убеждаюсь, что серверная часть теперь разрешима, и пытаюсь использовать клиента. Haproxy по-прежнему отказывается повторять попытку подключения к бэкэнду, пока я не перезапущу или не перезагружу его:

Apr 25 11:34:28 il systemd[1]: Starting HAProxy Load Balancer...
Apr 25 11:34:28 il haproxy[3411]: [WARNING] 114/113428 (3411) : parsing [/etc/haproxy/haproxy.cfg:49] : 'server app1' : could not resolve address 'basinasrv', disabling server.
Apr 25 11:34:28 il haproxy[3411]: Proxy main started.
Apr 25 11:34:28 il haproxy[3411]: Proxy app started.
Apr 25 11:34:28 il haproxy[3411]: [NOTICE] 114/113428 (3411) : New worker #1 (3412) forked
Apr 25 11:34:28 il systemd[1]: Started HAProxy Load Balancer.
...
Apr 25 11:46:21 il haproxy[3412]: 127.0.0.1:45302 [25/Apr/2019:11:46:21.946] main app/<NOSRV> 0/-1/-1/-1/0 503 212 - - SC-- 1/1/0/0/0 0/0 "CONNECT serverfault.com:443 HTTP/1.1"

_

defaults
    # never fail on address resolution
    default-server init-addr libc,none
    #default-server init-addr last,libc,none
    option log-health-checks
    option httplog

global
    ca-base /etc/ssl/certs
    maxconn     20000
    log         /dev-log local0 debug
    user        haproxy
    chroot      /usr/share/haproxy
    pidfile     /run/haproxy.pid
    daemon

frontend  main
    bind :3129
    mode                 http
    log                  global
    maxconn              8000
    timeout              client  30s
    default_backend             app

backend app
    log                  global
    mode        http
    reqadd      Proxy-Authorization:\ Basic\ xxxxxx
    timeout     connect 5s
    timeout     server  30s
    timeout     queue   30s
    server  app1 basinsrv:443 check ssl verify required ca-file ca-certificates.crt

используйте libc для разрешения адресов во время выполнения; в конфигурации не должно быть DNS-серверов
всегда повторять разрешение имени

Насколько я знаю, это просто невозможно.

Чтобы использовать имена хостов, а не IP-адреса в конфигурации HAproxy, вы либо разрешаете HAproxy выполнять разрешение при запуске (со всеми проблемами, которые вы уже подразумеваете), либо вам необходимо определить один или несколько resolvers где вы указываете HAproxy, как разрешать эти имена хостов во время работы.

Видеть мой ответ здесь например, с большинством параметров настройки для разрешения DNS.

ОПЦИЯ 1: Вы можете изменить файл hosts для каждого URL-адреса в HAProxy. У меня 2 сервера сбалансированы в HAProxy server1 и server2.

Отредактируйте файл hosts:

# vim /etc/hosts

10.0.0.2    www.server1.com
10.0.0.3    www.server2.com

вы должны добавить в качестве серверов такие же, как и у вас, затем просто перезапустите сервер, и он запустит HAproxy, как шарм, но вам нужно будет изменить свои IP-адреса вручную, если они изменятся.

ВАРИАНТ 2: Используйте crontab для запуска Haproxy после перезагрузки системы.

#crontab -e

@reboot sleep 60 && systemctl start haproxy

ОПЦИЯ 3: Если вы используете кабину Centos / RHEL, установите ее, если нет.

Проверяем, установлен ли он:

rpm -qa | grep cockpit

Включить кабину:

systemctl enable --now cockpit.socket

Перейдите на свой сервер с помощью браузера:

 https://<IP>:9090

Затем перейдите к Сервисы меню> Таймеры > Создать таймер

И в меню установите следующее:

Name     : Start HAPROXY
Command  : systemctl start haproxy 
Timer set: On Reboot
           60 seconds