You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 09:42:01