我正在尝试将 keepalived + HAProxy 设置为 EC2 VPC 上的冗余负载均衡器(是的,我知道 ELB 是一种选择)。我相信我们已正确配置,但关闭主服务器似乎无法进行故障转移。
服务器A配置:
vrrp_script chk_haproxy {
script "pidof haproxy"
interval 2
}
vrrp_instance VI_1 {
interface eth0
state BACKUP
priority 100
nopreempt
virtual_router_id 33
unicast_src_ip 172.30.1.100
unicast_peer {
172.30.1.101
}
authentication {
auth_type PASS
auth_pass PASSWORD
}
track_script {
chk_haproxy
}
notify_master /etc/keepalived/master.sh
}
服务器B配置:
vrrp_script chk_haproxy {
script "pidof haproxy"
interval 2
}
vrrp_instance VI_1 {
interface eth0
state BACKUP
priority 100
nopreempt
virtual_router_id 33
unicast_src_ip 172.30.1.101
unicast_peer {
172.30.1.100
}
authentication {
auth_type PASS
auth_pass PASSWORD
}
track_script {
chk_haproxy
}
notify_master /etc/keepalived/master.sh
}
我已经设置了安全组规则来:
HTTP TCP 80 0.0.0.0/0
Custom ICMP Rule Echo Reply N/A 0.0.0.0/0
SSH TCP 22 0.0.0.0/0
Custom Protocol VRRP (112) All 0.0.0.0/0
Custom ICMP Rule Echo Request N/A 0.0.0.0/0
但是,以下命令在备份中总是超时(主服务器上的反向命令也是如此):
nc -vz 172.30.1.100 112
此外,以下命令永远不会返回任何内容,这让我认为由于某种原因这些命令仍然没有通过:
sudo tshark -f "vrrp"
答案1
您的 netcat 命令尝试使用端口 112,而不是协议 112。这就是它不起作用的原因。此外,在这种情况下使用 netcat 测试通信并不是正确的方法。使用以下任一命令查看您的流量是否存在于任一实例上:
tcpdump "ip proto 112"
tshark -f "vrrp"
您的配置应将其中一个服务器定义为 MASTER,另一个定义为 BACKUP。BACKUP 的优先级应为 100,MASTER 的优先级应为 101。
将它们都设置为 BACKUP 可能是您的问题。
答案2
当我睡了一觉并再次查看时,这个问题变得非常明显(他们不是一直都是这样吗)。这很简单,就像在 中输入了拼写错误一样unicast_src_ip
。由于 IP 不正确,因此两个服务器上都没有消息通过。我本以为会有一些错误消息,但一旦修复了这个问题,一切都开始 100% 正常工作。