尝试通过 HAProxy 前面的 Keepalived 实现 L4 负载平衡,HAProxy 将充当 L7 负载平衡器。Keepalived 和 HAProxy 位于不同的机器上。我设法使下图中的所有内容正常工作,但当我尝试向公共虚拟 IP(即 115.101.1.17)发送请求时,连接总是超时。
根据我对文档的理解,文档指出:
为了让真实服务器能够直接响应公共用户的请求,每个真实服务器在发送回复时必须使用VIP作为其源地址。
我尝试使用 HAProxy 机器上的 SNAT 重置源 IP,但仍然发生同样的事情。
真实服务器(HAProxy 机器)上 iptables 使用的规则
iptables \
-A POSTROUTING \
-t nat \
-p tcp \
--dport 80 \
-j SNAT \
--to-source 115.101.1.17
keepalived配置文件
vrrp_instance VI_1 {
state MASTER # [1]
interface eth0 # [2]
advert_int 1 # [3]
priority 100 # [4]
virtual_router_id 92 # [5]
# Authentication for VRRP messages
authentication {
auth_type PASS
auth_pass pass123
}
virtual_ipaddress {
115.101.1.17 dev eth0 # [6]
}
}
virtual_server 115.101.1.17 80 {
lb_algo rr # [1]
lb_kind DR # [2]
protocol TCP
delay_loop 10 # [3]
persistence_timeout 60 # [4]
# Backend Server (HAProxy LB-01)
real_server 10.0.1.2 80 {
weight 100
TCP_CHECK {
connect_timeout 5
nb_get_retry 3
delay_before_retry 2
}
}
# Backend Server (HAProxy LB-02)
real_server 10.0.1.3 80 {
weight 100
TCP_CHECK {
connect_timeout 5
nb_get_retry 3
delay_before_retry 2
}
}
}
系统配置参数
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
任何帮助将不胜感激。
答案1
您使用的是 DR 模式,因此当数据包到达 HAProxy 服务器时,它会说“嗨,我正在寻找 VIP 115.101.1.17...”,而 HAProxy 必须回答“是的,那就是我”。因此它必须绑定到该地址。并且它所运行的 Linux 机器也必须配置为接受到该地址的流量。因此您需要解决 arp 问题。尝试谷歌搜索 Dr 模式 arp 问题 Linux。
https://docs.oracle.com/en/operating-systems/oracle-linux/6/admin/section_vmd_ys2_4r.html
或者将 lbkind 更改为 NAT 模式,然后仅使用保持活动节点作为默认网关。这应该很容易,因为您已经有两个子网了。
不过我个人还是比较同意安德鲁斯博客关于DR模式的说法的:https://www.loadbalancer.org/blog/15-years-later-we-still-love-dsr/