我們使用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