2017-07-17 85 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