HAProxy域名解析返回多IP时流量未负载均衡的解决方案问询
HAProxy域名后端多IP负载均衡配置方案
问题根源
你原先的配置无法实现多IP负载均衡的原因是:HAProxy默认对单条server指令中配置的域名,仅在进程启动时执行一次DNS解析,且仅使用解析返回的首个IP作为固定转发目标,既不会自动更新解析结果,也不会利用DNS返回的其余IP地址,因此所有流量都会被路由到同一个后端IP上。
可行配置方案
推荐使用resolvers+server-template的动态配置方案,无需硬编码后端IP,可自动同步DNS解析结果实现多IP负载均衡,配置步骤如下:
1. 新增DNS解析器配置
在HAProxy全局配置或者defaults配置段外,新增独立的resolvers配置块,指定你环境使用的DNS服务器(你当前场景是Docker内置DNS 127.0.0.11):
resolvers docker_internal_dns # 指定DNS服务器地址 nameserver dns0 127.0.0.11:53 # 解析成功结果的缓存时长,到期自动重新解析,可根据需求调整 hold valid 10s # 解析重试次数 resolve_retries 3 # 单次解析超时时间 timeout retry 1s
2. 修改backend配置,替换固定server为server-template
将原有backend中的单条server配置替换为server-template,自动根据DNS解析结果生成后端服务器节点:
backend lb_webapp_backend http-send-name-header Host # 参数说明: # webapp:生成的server名称前缀 # 10:最多生成的server节点数,可根据你预期的最大后端IP数调整,填大于等于实际解析IP数的值即可 # webapp:80:后端域名和端口 # check:开启健康检查 # resolvers docker_internal_dns:使用刚才配置的DNS解析器 # init-addr libc,none:启动时优先用系统libc解析域名,解析失败也不阻止HAProxy启动,后续自动重试 server-template webapp 10 webapp:80 check resolvers docker_internal_dns init-addr libc,none # 可选:指定负载均衡算法,默认是roundrobin轮询,可根据需求改为leastconn/source等 # balance roundrobin
备选方案(静态配置,适用于不支持server-template的老版本HAProxy)
如果你的HAProxy版本过低不支持server-template,也可以手动将DNS解析出来的IP直接配置为独立的server节点:
backend lb_webapp_backend http-send-name-header Host server webapp1 172.23.0.5:80 check server webapp2 172.23.0.3:80 check server webapp3 172.23.0.4:80 check
该方案的缺点是后端IP发生变化时需要手动修改配置重启HAProxy,无法自动同步DNS变更。
配置验证
修改配置重启HAProxy后,你可以通过HAProxy的stats监控页面看到自动生成的多个webapp开头的后端节点,分别对应DNS返回的3个IP,所有请求会按照配置的负载均衡策略分发到不同IP上。如果后续DNS解析的IP有增减,HAProxy会在缓存到期后自动更新后端节点,无需重启进程。
内容的提问来源于stack exchange,提问作者mahyard
相关产品推荐
相关产品推荐

