背景
上篇我们介绍了keepalived的配置,但是有一个问题,keepalived
默认是抢占模式
,
当主宕机之后再重启,虚拟ip会切回主,此时会有波动,影响业务。是否有什么办法可以避免这种情况?
我们可以配置成非抢占模式
,当主宕机之后,虚拟ip不会切回主,而是保持在从节点上,
直到从节点宕机,才会切换到主节点。
配置示例
|
|
只需要nopreempt
添加到vrrp_instance
中,另外主备节点的状态都为BACKUP
, 就可以实现非抢占模式
。
当两个节点都是BACKUP
状态,哪个节点先启动(一般会选择priority
高的节点),虚拟ip就会分配给哪个节点。它就是主节点
,另外一个是备节点
。
当主节点状态配置成MASTER
,那么nopreempt
参数就不会生效。日志中会有如下警告:
|
|
测试
还是使用上一章节的测试环境,先启动172.16.4.111
节点,然后再启动172.16.4.113
节点,
可以看到虚拟ip172.16.4.96
分配给了172.16.4.111
节点。
- 172.16.4.111节点的网卡
|
|
- 172.16.4.113节点的网卡
|
|
172.16.4.111
节点停止keepalived
容器之后,虚拟ip172.16.4.96
切到了172.16.4.113
节点。
- 172.16.4.113节点的网卡
|
|
- 172.16.4.111节点的网卡
|
|
然后再启动172.16.4.111
节点的keepalived
,虚拟ip172.16.4.96
还是在172.16.4.113
节点。
- 172.16.4.111节点的网卡
|
|
- 172.16.4.113节点的网卡
|
|
可以看到,结果和预期一致。
其他
当我们想看两个节点的交互情况时,可以抓包查看tcpdump -n -i ens160 vrrp
。
|
|
可以看到在整个局域网内,有很多其他的节点也在发送VRRP广播包。想要不和其他的节点混淆,设置virtual_router_id
要不一样。
总结
- 两个节点都为
BACKUP
状态,并且添加nopreempt
参数,可以实现非抢占
模式。 virtual_router_id
要自己设置一下,避免使用默认的,以免和其他的节点混淆。