我们有两台机器的 keepalived 设置,其中两台机器的配置方式相同。
vrrp_instance RP_VI_1 {
interface eth3
state BACKUP
virtual_router_id 61
priority 150
advert_int 1
garp_master_delay 5
virtual_ipaddress {
x.x.x.x dev eth2
}
}
两台机器都以这种配置运行了大约半年,没有任何问题,但今晚出现了看似错误的状态转换。
host1: in BACKUP state
host2: in MASTER state
03:44:44: host1: Transition to MASTER state
03:44:45: host1: Entering MASTER STATE
03:44:46: host1: Received higher prio advert 150
03:44:46: host1: Entering BACKUP state
在此期间,host2 没有在任何状态之间转换,也没有记录任何信息。因此,host1 向网络发送了免费 ARP,其 mac 地址被缓存了几个小时,同时丢弃了所有流量。
我们这里最大的问题是,host1 恢复到 BACKUP 状态,说收到了“更高优先级广告”,而两个主机的优先级都是 150。如何触发此转换而系统没有进行后续通信来决定谁应该保持主控,从而发送新的免费 ARP 以确保数据包传输到正确的主机?
答案1
阅读完 VRRPv2 (RFC3768) 定义后,显而易见:
1) 使用主 IP 地址作为两个优先级相同的主机之间的决胜局。具有较高 IP 地址的主机获胜,具有较低 IP 地址的主机将转换为 MASTER
2) keepalived 选项garp_master_refresh
可用于在 x 秒后重新发送免费 ARP。由于默认值为 0,因此现在默认重新发送请求,指定该选项应会导致系统在一段时间后恢复。