2017-07-17 222 views
0

我們使用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 noneinit-addr libc,last,none

回答

0

您正在使用「INIT-地址沒有」,所以當它處於下跌狀態,服務器將啓動不帶任何有效的IP地址。此外,您當前的配置使HAProxy能夠在啓動時僅解析主機名,如here所述。
因此,爲了使HAProxy在啓動後解析localserver.local以正確獲取IP併發送運行狀況檢查,您需要在HAProxy中配置resolvers section

+0

我想我應該更新這個問題。我沒有改變'init-addr libc,最後一個,沒有'。如果我在wifi連接啓動後重新啓動它,'haproxy'連接到正確的一個。 至於解析器,我有硬編碼的本地IP地址的WiFi路由器的本地主機名來解決? –

+1

是的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