我们使用haproxy
到本地MQTT代理和基于可用性云服务中介(含优先于本地服务器)之间进行切换。 haproxy.cfg
看起来是这样的:HAProxy的暂停健康检查,如果DNS解析失败
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
启动。但是,如果haproxy启动时到本地计算机的wifi连接断开,init-addr none
仍允许它开始使用备份服务器(aws_iot)。本地服务器被标记为“停机维护”,不再执行健康检查。即使在网络启动并运行后,haproxy
也不知道它,并且不会从云服务器切换回来。
有没有什么办法让它审议未决域名一样正常“下”的条件?
我现在看到的另一种方法是让脚本在后台轮询域名,并在haproxy
控制套接字启动后发送“启用服务器”命令。这看起来过于迂回,应该很简单!
更新: 在本地连接启动并运行后,运行命令echo "enable server mqtt/wifi_server" | socat /var/run/haproxy.sock stdio
不会切换后端。 haproxy
只是从来没有切换回到本地服务器与任何短重新启动它。
更新2: 改变init-addr none
到init-addr libc,last,none
我想我应该更新这个问题。我没有改变'init-addr libc,最后一个,没有'。如果我在wifi连接启动后重新启动它,'haproxy'连接到正确的一个。 至于解析器,我有硬编码的本地IP地址的WiFi路由器的本地主机名来解决? –
是的DNS IP应该被硬编码以避免“鸡或蛋”问题。 如果* localserver *无法在无线网络连接断开时解析,'init-addr libc,last,none'也不能解决您的问题。但是,如果你把它放在你的*/etc/hosts中,它应该可以工作。 关于[init-addr]的更多信息(http://cbonte.github.io/haproxy-dconv/1.7/configuration.html#init-addr) – MoEmEn