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.