我们在 Centos 7 上使用 HAProxy 1.8.13,并动态分配后端(通过统计套接字分配后端 IP 和端口)。这工作正常。
我们需要一种方法来使动态分配的内容在重新启动后继续保留,并希望使用“从文件加载服务器状态“指令。遗憾的是,我们遇到了一个错误(或者可能是设计使然?),状态文件没有恢复配置的 IP 地址:
我们的测试配置:
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
nbproc 2
stats socket /run/haproxy/1.sock mode 0744 level admin process 1
stats socket /run/haproxy/2.sock mode 0744 level admin process 2
server-state-file /run/haproxy/server_state
defaults
load-server-state-from-file global
timeout server 10s
timeout client 15s
timeout queue 6s
timeout connect 10s
frontend main
bind *:5000
default_backend app
backend app
balance roundrobin
server app1 127.0.0.1:5001 check
server app2 127.0.0.1:5002 check
server app3 127.0.0.1:5003 check
server app4 127.0.0.1:5004 check
我们通过脚本配置 IP,然后使用以下命令保存状态:
echo "show servers state" | socat /run/haproxy/1.sock - > /run/haproxy/server_state
例如,其产生:
1
# be_id be_name srv_id srv_name srv_addr srv_op_state srv_admin_state srv_uweight srv_iweight srv_time_since_last_change srv_check_status srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_forced_id srv_f_forced_id srv_fqdn srv_port
7 app 1 app1 127.0.0.1 0 1 1 1 60 8 2 0 14 0 0 0 - 5001
7 app 2 app2 10.10.10.115 2 0 1 1 23 6 3 4 6 0 0 0 - 31501
7 app 3 app3 10.10.10.113 2 0 1 1 22 6 3 4 6 0 0 0 - 31375
7 app 4 app4 10.10.10.114 2 0 1 1 22 6 3 4 6 0 0 0 - 31400
当 haproxy 重新启动时,它会恢复启动/关闭状态信息和端口,但会将 IP 重置为 127.0.0.1:
1
# be_id be_name srv_id srv_name srv_addr srv_op_state srv_admin_state srv_uweight srv_iweight srv_time_since_last_change srv_check_status srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_forced_id srv_f_forced_id srv_fqdn srv_port
7 app 1 app1 127.0.0.1 0 1 1 1 7 8 2 0 14 0 0 0 - 5001
7 app 2 app2 127.0.0.1 0 0 1 1 2 8 2 0 6 0 0 0 - 31501
7 app 3 app3 127.0.0.1 0 0 1 1 2 8 2 0 6 0 0 0 - 31375
7 app 4 app4 127.0.0.1 0 0 1 1 1 8 2 0 6 0 0 0 - 31400
我们玩弄了“初始化地址“但这只会影响基于 DNS 的后端地址。我们做错了什么吗?这是预期的行为吗?或者这是一种错误?
答案1
我们发现,当我们用“localhost”替换“127.0.0.1”时,它可以起作用。
HAProxy 似乎会忽略状态文件中的后端 IP,至少在我们测试的版本(1.8.7、1.8.13、1.9-dev)中是如此。默认配置了 DNS 名称的后端服务器会从应用的状态文件中获取 IP。
我们深入研究了代码,并在 HAProxy ML 上发现了一个 bug,并打了补丁这里。