我想使用 nopreempt 选项和 keepalived vrrp 设置,当主节点发生故障时将备份节点作为主节点运行,然后再次返回网络。
我在两台服务器中都设置了 nopreempt 选项,并将状态设置为备份,但由于优先级高,nopreempt 不起作用。
请指导解决吗?
Master Machine:
! Configuration File for keepalived
vrrp_instance VI_1 {
state BACKUP
nopreempt
interface eth0
virtual_router_id 1
priority 250
advert_int 1
virtual_ipaddress {
192.168.1.2/24
}
}
Backup Machine :
! Configuration File for keepalived
vrrp_instance VI_1 {
state BACKUP
nopreempt
interface eth0
virtual_router_id 1
priority 200
advert_int 1
virtual_ipaddress {
192.168.1.2/24
}
}
问候,本
答案1
将两个服务器的状态都更改为备份。主服务器具有更高的优先级,并且不具有抢占功能,两个服务器都具有相同的路由器 ID。这对我来说很有效。
答案2
我尝试了很多配置来实现这一点,唯一有效的方法是将两个服务器都设置为状态备份,一台服务器优先级 51,另一个50和设置不抢占。以下是示例配置:
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 51
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass XXXXXXXX
}
virtual_ipaddress {
192.168.69.100/28
}
}
只需在第二台服务器上将优先级设置为 50,一切就可以正常工作。
答案3
首先:我使用的是 CentOS 6 和 keepalived 1.2.7 (02/21,2013)
我也尝试了 nopreempt,经过一些测试后,它按预期工作。
使用相同的 vrrp 优先级运行主服务器和备份服务器不是一个好主意,因为有一个错误(AFAICT)会导致两个 keepalived 服务器都启动 VIP。根据https://www.rfc-editor.org/rfc/rfc5798#page-26具有最高 IP 的 keepalived 应保持/成为主服务器。我无法观察到这种行为!
(再次说明 AFAICT)如果您想让 nopreempt 正常工作,则必须从配置文件中删除语句“state”。如果配置文件中带有“state MASTER”的 keepalived 启动时,它会以 master 身份启动并宣传自己 = 不好。如果配置文件中没有“state”语句,keepalived 会以 BACKUP 状态启动并监听 vrrp。由于“nopreempt”,即使它以最高优先级运行,也不会成为 MASTER。这与 man 5 keepalived.conf 页面相反,此时状态并不重要。
优先级为 255 的 keepalived 始终成为主服务器 - 无论 nopreempt 选项是否打开。
如果您测试keepalived,请仔细查看防火墙/ nat规则。运行类似tcpdump的程序来检查vrrp广告是否通过并具有正确的发送方IP(来自其他keepalived的IP,而不是标准gw!)总是一个好主意。如果您使用kvm / qemu客户机,尤其如此,因为存在更改vrrp广告的默认nat规则。
nopreempt 仅适用于处于 BACKUP 状态的 keepalived。(RTFM)如果 keepalived(1.2.7)正在运行并且网络链接断开,keepalived 将更改为 FAULT 状态。当网络链接恢复时,如果 prio 足够高,keepalived 将变为 MASTER。我不知道这是否是一个错误,但它使 nopreempt 变得毫无用处。我会向邮件列表发送一个问题。
答案4
您必须在 vrrp 脚本中设置“fall”和“rise”选项。示例运行配置:
vrrp_script chk_haproxy {
script "killall -0 haproxy"
interval 1
fall 2
rise 2
}
vrrp_instance VI_1 {
interface eth0
track_interface {
eth0
eth1
}
state BACKUP # same as other node
priority 101 # your choice
virtual_router_id 53
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 8CHARPASS
}
unicast_src_ip 172.31.10.11 # other node: 172.31.10.12
unicast_peer {
172.31.10.12 # other node: 172.31.10.11
}
virtual_ipaddress {
172.31.20.20 dev eth1
}
track_script {
chk_haproxy
}
}