haproxy приостанавливает проверки работоспособности, если не удается разрешить DNS

Мы используем haproxy переключаться между локальным брокером MQTT и облачным брокером в зависимости от доступности (с предпочтением локального сервера). haproxy.cfg выглядит примерно так:

global
  log 127.0.0.1   local1
  maxconn 1000
  daemon
  debug
  #quiet
  tune.bufsize 1024576
  stats socket /var/run/haproxy.sock mode 600 level admin

defaults
  log     global
  mode    tcp
  option  tcplog
  retries 3
  option redispatch

  timeout connect 5000
  timeout client 50000
  timeout server 50000

# Listen to all MQTT requests (port 1883)
listen mqtt
  bind *:1883

  mode tcp

  balance first  # Connect to first available

  timeout client  3h
  timeout server  3h
  option clitcpka
  option srvtcpka


  # MQTT server 1 - local wifi
  server wifi_broker localserver.local:1883 init-addr libc,last,none check inter 3s rise 5 fall 2 maxconn 1000 on-marked-up shutdown-backup-sessions on-marked-down shutdown-sessions

  # MQTT server 2 - cloud
  server aws_iot xxxxx.amazonaws.com:8883 backup check backup ssl verify none ca-file ./root-CA.crt crt ./cert.pem inter 5s rise 3 fall 2

listen stats
  bind :9000
  mode http
  stats enable  # Enable stats page
  stats hide-version  # Hide HAProxy version
  stats realm Haproxy\ Statistics  # Title text for popup window
  stats uri /haproxy_stats  # Stats URI

Все работает нормально, если местный брокер доступен, когда haproxy запускает. Тем не менее, если Wi-Fi соединение с локальной машиной не работает при запуске haproxy, init-addr none все еще позволяет ему начать использовать сервер резервного копирования (aws_iot). Локальный сервер помечен как "Не работает", и проверки работоспособности больше не выполняются. Даже после того, как сеть запущена и работает, haproxy не знает об этом и не переключается обратно с облачного сервера.

Есть ли способ заставить его считать неразрешенное доменное имя таким же, как и в обычном "отключенном" состоянии?

Одна альтернатива, которую я вижу сейчас, - это сценарий, опрашивающий доменное имя в фоновом режиме и отправляющий команду "enable server" на haproxy управляйте сокетом, как только это будет. Это кажется слишком окольным для чего-то, что должно быть действительно простым!

Обновление: запуск команды echo "enable server mqtt/wifi_server" | socat /var/run/haproxy.sock stdio не переключает серверы после того, как локальное соединение установлено и работает. haproxy просто никогда не переключается обратно на локальный сервер, за исключением перезапуска.

Обновление 2: изменено init-addr none в init-addr libc,last,none

1 ответ

Вы используете "init-addr none", поэтому сервер будет запущен без действительного IP-адреса, когда он находится в нерабочем состоянии. Кроме того, ваша текущая конфигурация позволяет HAProxy разрешать имена хостов только при запуске, как упомянуто здесь.
Таким образом, чтобы HAProxy разрешал localserver.local после запуска, чтобы получить правильный IP-адрес и отправлять проверки работоспособности, вам необходимо настроить раздел распознавателей в HAProxy.

Другие вопросы по тегам