我目前在 amazon ELB 前面使用 Haproxy-1.6-dev2,遇到了 DNS 解析问题。由于新功能,我正在使用 haproxy 的开发版本resolvers
,但无法让 Haproxy 触发服务器内部 IP 地址列表的更改,而无需重新启动 haproxy 进程。Amazon 更新其 ELB 的 IP,而 Haproxy 继续使用旧 IP 地址而不进行更新。简化的配置文件如下。
global
log 127.0.0.1 local0
stats socket /var/run/haproxy.sock
defaults
log global
mode http
option httpchk GET /
option log-health-checks
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
resolvers dns
nameserver public-0 xx.xx.xx.xx:53
hold valid 1s
frontend http
bind *:8000
default_backend site-backend
backend site-backend
balance leastconn
server site sub.example.com:80 resolvers dns check inter 1000
我在 AWS Route53 中创建了一个临时 A 记录,由于 A 记录指向无效位置,因此健康检查失败。
然后我更新 A 记录以指向有效位置,但健康检查仍然失败。只需重新启动 haproxy 即可开始通过健康检查。
我还 ping 了统计套接字以获取更多信息:
nameserver public-0:
sent: 153
valid: 0
update: 0
cname: 0
cname_error: 0
any_err: 0
nx: 0
timeout: 0
refused: 0
other: 0
invalid: 0
too_big: 0
outdated: 51
haproxy 文档没有提供太多关于“过时”含义的帮助。
答案1
请在调试模式下运行 HAProxy(全局部分中的“debug”语句或运行 haproxy deamon 时为“-d”)并在此处报告 stdout 和 stderr 的输出。
同时,请对盒子的 DNS 流量进行 tcpdump,并将其发送给在 HAProxy 中执行 DNS 工作的开发人员:[电子邮件保护]。
巴蒂斯特
答案2
这似乎是 1ms 默认超时而不是 1s 默认超时的问题。设置timeout retry 1s
应该可以解决在 Haproxy-1.6-dev2 上遇到此问题的其他任何人的问题。我想这个问题将在官方 1.6 版本中得到解决。