我正在尝试在 CentOS 8 上使用 keepalived 为 HAProxy 创建 HA,这是我所拥有的:
Virtual IP: 10.10.10.14
HAProxy Server 1: 10.10.10.15
HAProxy Server 2: 10.10.10.18
和我的 keepalived 配置掌握:
vrrp_script chk_haproxy {
script "killall -0 haproxy" # check the haproxy process
interval 2 # every 2 seconds
weight 2 # add 2 points if OK
}
vrrp_instance VI_1 {
interface ens190
state MASTER
virtual_router_id 51
priority 101
virtual_ipaddress {
10.10.10.14
}
track_script {
chk_haproxy
}
}
Keepalived 配置开启备份:
vrrp_script chk_haproxy {
script "killall -0 haproxy" # check the haproxy process
interval 2 # every 2 seconds
weight 2 # add 2 points if OK
}
vrrp_instance VI_1 {
interface ens165
state BACKUP
virtual_router_id 51
priority 100
virtual_ipaddress {
10.10.10.14
}
track_script {
chk_haproxy
}
}
但每次我尝试停止 HAProxy 进程时,它都不会连接到备份服务器。相反,它仅适用于最近启动 keepalived 的服务器。
我的ip -a
命令会像这样返回掌握:
inet 10.10.10.15/24 brd 10.10.10.255 scope global noprefixroute ens190
inet 10.10.10.14/32 scope global ens190
为了备份:
inet 10.10.10.18/24 brd 10.10.10.255 scope global noprefixroute ens165
inet 10.10.10.14/32 scope global ens165
哪里不对了?我还设置了net.ipv4.ip_nonlocal_bind = 1
sysctl 配置。我的日志只显示服务的启动和停止?
答案1
我的配置有效,但指南没有提及任何有关防火墙规则的内容。所以我做了一些研究并使sudo firewall-cmd --zone=public --permanent --add-rich-rule='rule protocol value="vrrp" accept'
这个设置发挥作用。
答案2
HAProxy 完成加载配置后会绑定到套接字。然后它侦听 10.10.10.14,该 IP 地址稍后可能会被 Keepalived 从网络接口中删除。
但是,当 Keepalived 的另一个实例添加 IP 地址时,主机上的 HAProxy 不会自动侦听该地址。 Keepalived切换时需要重新加载HAProxy。
为此,您可能需要在以下部分添加通知脚本vrrp_instance VI_1
:
notify "/usr/local/bin/toggle_keepalived"
该文件/usr/local/bin/toggle_keepalived
是一个 shell 脚本,仅重新加载 HAProxy,例如在 systemd 系统上:
#!/bin/bash
systemctl reload haproxy
使其可执行,就可以了。