我们有一个两台机器的 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。如果系统没有随后通信来决定谁应该留下,怎么可能触发了这个转换master 并因此发送一个新的免费 ARP 以确保数据包被传输到正确的主机?
通读 VRRPv2 (RFC3768) 定义后,以下是明显的:
1) 使用两个具有相同优先级主 IP 地址的主机之间的平局断路器。IP地址高的主机获胜,IP地址低的主机转为MASTER
2)
garp_master_refresh
keepalived 选项可用于在 x 秒后重新发送免费 ARP。由于此默认值为 0,现在默认情况下重新发送请求,指定它应该会导致系统在一段时间后恢复。