背景
上篇我们介绍了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要自己设置一下,避免使用默认的,以免和其他的节点混淆。