HAProxy backend单域名对应多DNS IP的配置及域名解析时机咨询
问题解答
1. 域名解析时机说明
默认情况下HAProxy仅在启动/重载配置时对配置中填写的域名做一次性解析,解析结果会持续缓存到下一次重载为止,符合你之前的认知。
2. 无需手动改配置的解决方案
这里根据你使用的HAProxy版本给两个可行方案:
方案1:使用HAProxy 1.6+ 内置的server-template功能(推荐)
该方案可以实现HAProxy运行时自动同步域名解析的IP列表,完全不需要手动修改配置,也不用每次IP变更就触发重载(如果对解析延迟要求不高的话,甚至可以不用主动重载)。
配置步骤如下:
- 先在全局段或者defaults段前面定义DNS解析器:
resolvers public_dns # 替换为你实际使用的DNS服务器地址 nameserver local 192.168.1.1:53 nameserver backup 223.5.5.5:53 # 解析重试次数 resolve_retries 3 # 重试间隔 timeout retry 1s # 解析结果有效时长,可根据IP变更频率调整 hold valid 30s
- 调整你的backend配置,用server-template替代固定的server条目:
backend test_http_back balance roundrobin # 参数说明: # host: 生成的server名前缀 # 2: 最多支持的后端实例数量(匹配你域名解析出来的2个IP,有多的IP可以调大这个数字) # 末尾的resolvers指定使用上面定义的DNS解析器,init-addr none避免启动时DNS解析失败导致HAProxy启动失败 server-template host 2 host.somesite.com:8080 check resolvers public_dns init-addr none
方案2:自动生成配置+主动重载(适合低版本HAProxy)
如果你用的HAProxy版本低于1.6不支持server-template,可以写一个简单的脚本自动生成配置,配合你主动触发的重载流程使用:
脚本核心逻辑示例:
# 1. 获取域名对应的所有IP IPS=$(dig +short host.somesite.com) # 2. 生成backend配置 cat > /etc/haproxy/conf.d/test_http_back.cfg << EOF backend test_http_back balance roundrobin EOF count=1 for ip in $IPS; do echo " server host_${count} ${ip}:8080 check" >> /etc/haproxy/conf.d/test_http_back.cfg count=$((count+1)) done # 3. 校验配置合法性 haproxy -c -f /etc/haproxy/haproxy.cfg if [ $? -eq 0 ]; then # 4. 合法则重载配置 systemctl reload haproxy fi
你可以在IP变更的时间点执行这个脚本即可,全程不需要手动修改配置。
内容的提问来源于stack exchange,提问作者James Vodanovich
相关产品推荐
相关产品推荐

