我正在运行 2 个共享公共 IP 的 keepalived 服务器(Server1 和 Server2)。Server1 是主服务器,每当 haproxy 死机时,Server2 应该接管。如果 Server1 恢复,Server2 应该释放 vIP 并让 Server1 再次接管。
我已经设法使用下面两个配置来运行它,但是,我最近注意到它停止工作了。
服务器运行的是 CentOS 7,并且已完全更新。如果我手动终止 Server1 上的 keepalived,它会故障转移到 Server2,当 keepalived 重新启动时,Server1 会再次接管。但是,如果我终止 haproxy,keepalived 会记录 check_haproxy 检查失败,但不会进行故障转移。
为了确保它不是 FW 或 SELinux,我删除了所有 IPtables 规则并禁用了 SELinux。
配置如下:
服务器1
global_defs {
# Keepalived process identifier
# Probably should be unique: http://www.keepalived.org/LVS-NAT-Keepalived-HOWTO.html
lvs_id haproxy_DH
}
# Script used to check if HAProxy is running
vrrp_script check_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}
# Virtual interface
# The priority specifies the order in which the assigned interface to take over in a failover
vrrp_instance VI_01 {
state EQUAL
interface eno16777984
virtual_router_id 51
notify /etc/keepalived/notify.sh
priority 100
# The virtual ip address shared between the two loadbalancers
virtual_ipaddress {
10.9.17.20
10.9.17.19
}
track_script {
check_haproxy
}
}
服务器2
global_defs {
# Keepalived process identifier
# Probably should be unique: http://www.keepalived.org/LVS-NAT-Keepalived-HOWTO.html
lvs_id haps2a
# Script used to check if HAProxy is running
vrrp_script check_haproxy {
script "killall -0 haproxy"
interval 2
weight 2
}
# Virtual interface
# The priority specifies the order in which the assigned interface to take over in a failover
vrrp_instance VI_01 {
state EQUAL
interface eno16777984
virtual_router_id 51
notify /etc/keepalived/notify.sh
priority 100
# The virtual ip address shared between the two loadbalancers
virtual_ipaddress {
10.9.17.20
10.9.17.19
}
track_script {
check_haproxy
}
}
答案1
我找不到任何文档来解释 的含义state EQUAL
。我通常将初始状态定义为 ,BACKUP
并让选举过程选择主实例。
我将您的配置文件复制到实验室环境,发现global_defs
Server2 的 keepalived.conf 中缺少右括号 。但是,尽管缺少该字符,故障转移似乎仍能正常工作。
请检查tcpdump -i eno16777984 vrrp
是否存在不相关的 VRRP 数据包VRID=51
。或者尝试将 更改virtual_router_id
为其他数字。由于 VRRP 数据包被发送到多播地址224.0.0.18
,因此网络中的每个虚拟 IP 都必须使用唯一的VRID
。
另外,如果您打算让 Server1 接管虚拟 IP,我建议您priority 101
在其 中设置vrrp_instance
。RFC5798部分6.4.3. 主人表示如果 Server1 的 IP 地址大于 Server2 的 IP 地址,并且两个服务器具有相同的优先级,则 Server1 赢得选举并获得虚拟 IP。但是,keepalived
似乎只比较优先级。
编辑:实际上,我在第二次测试中忘记删除右括号。实际上,keepalived 启动过程会忽略缺失的括号,但运行时故障转移不起作用。
答案2
除了配置文件中的正确语法外,还请注意,killall
现在 CentOS 7 上默认未安装。您需要安装psmisc
此包,或者可以使用script "pidof haproxy"
。