Keepalived丢失VIP一例
Keepalived丢失VIP一例
问题描述
测试环境发现有个业务访问不了,发现是Master丢失了VIP。
环境描述
这里先描述一下环境:
操作系统:ubuntu18.04
Keepavlied版本:Keepalived v1.3.9
采用apt-get安装的 2台Nginx+Keepalived 架构。采用Master-Backup部署。
问题排查
初步排查
-
检查发现Nginx正常,Master的VIP丢失,但是没有发生切换,Master和Backup节点都没有关于Keepalived交互的日志(比如切换等)。
-
在Master上使用
systemctl restart keepalived可以恢复正常,或者systemctl stop keepalived可正常进行切换。
问题猜测
根据初步排查,怀疑可能的原因有:
-
操作系统原因(比如BUG)
-
网络问题(网络变更等)
-
keepalived 版本有bug
进一步排查
首先网络这块,这两台机器在同一个网段,在同一个交换机上,网络上变更影响的概率较小,况且这个要找网络同事去配合,还是从自己可以排查的角度出发,先检查操作系统和keepalived。
-
检查Master操作系统日志
/var/log/syslog,发现有如下可疑的地方May 9 06:51:39 szvxl14022 systemd[1]: Stopped Wait for Network to be Configured. May 9 06:51:39 szvxl14022 systemd[1]: Stopping Wait for Network to be Configured... May 9 06:51:39 szvxl14022 systemd[1]: Stopping Network Service... May 9 06:51:39 szvxl14022 systemd[1]: Starting resolvconf-pull-resolved.service... May 9 06:51:40 szvxl14022 systemd[1]: Started resolvconf-pull-resolved.service. May 9 06:51:40 szvxl14022 systemd-timesyncd[9897]: Network configuration changed, trying to establish connection. May 9 06:51:40 szvxl14022 systemd[1]: Stopped Network Service. May 9 06:51:40 szvxl14022 systemd[1]: Starting Network Service... May 9 06:51:40 szvxl14022 systemd-networkd[4993]: ens160: Gained IPv6LL May 9 06:51:40 szvxl14022 systemd-networkd[4993]: Enumeration completed May 9 06:51:40 szvxl14022 systemd-networkd[4993]: ens160: IPv6 successfully enabled May 9 06:51:40 szvxl14022 systemd-networkd[4993]: lo: Link is not managed by us May 9 06:51:40 szvxl14022 systemd[1]: Started Network Service. May 9 06:51:40 szvxl14022 systemd-networkd[4993]: ens160: Configured May 9 06:51:40 szvxl14022 systemd[1]: Starting Wait for Network to be Configured... May 9 06:51:40 szvxl14022 systemd[1]: Starting resolvconf-pull-resolved.service... May 9 06:51:40 szvxl14022 systemd[1]: Stopping Network Name Resolution... May 9 06:51:40 szvxl14022 systemd-networkd-wait-online[5015]: ignoring: lo May 9 06:51:40 szvxl14022 systemd-networkd-wait-online[5015]: managing: ens160 May 9 06:51:40 szvxl14022 systemd[1]: Started Wait for Network to be Configured. May 9 06:51:40 szvxl14022 systemd[1]: Started resolvconf-pull-resolved.service. May 9 06:51:40 szvxl14022 systemd[1]: Stopped Network Name Resolution. May 9 06:51:40 szvxl14022 systemd[1]: Starting Network Name Resolution...先不论为何会有系统会执行这个,从这个日志上看,操作系统的网络是重启过,那是不是就是重启的时候,keepalived没有捕捉到,然后导致丢失了vip,并且Backup也没办法抢占到VIP。 看来大概率是这个了。
-
怎么验证自己的猜想呢?
这里我也不知道操作系统是重启了哪个网络服务,不过我知道跟网络有关的服务大概有
networking.service,network-manager.service,systemd-networkd。于是使用systemctl逐步将以上几个服务重启,发现与上述操作系统日志一样的是systemd-networkd,并且问题也复现,至此,确认就是由于重启了systemd-networkd导致Master VIP丢失。
为什么会出现这个问题?
经过谷歌查询,发现网上也有如此的案例,应该是一个BUG,比如
# Loss of VIP's when systemd-networkd is restarted,
[# Keepalived virtual ip addresses gone lost after systemd update
并且,好像这个BUG还没有解决。
那另一个问题,为什么操作系统会重启systemd-networkd ?
这个涉及到ubuntu系统自动更新软件问题。 这里还是以ubuntu18.04,先看下/etc/apt/apt.conf.d/20auto-upgrades文件内容
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
这里指的就是自动更新频率,/etc/apt/apt.conf.d/50unattended-upgrades 这个文件记录了哪些软件包需要更新。/var/log/unattended-upgrades/unattended-upgrades.log是更新的日志。
参考[# How can I check if automatic updates are enabled and disable them if they're enabled?](server - How can I check if automatic updates are enabled and disable them if they're enabled? - Ask Ubuntu)
解决问题
方法1 关闭自动更新
# vim /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";
但这个如果还是有哪里执行了systemctl restart systemd-networkd的话,依旧会出现vip丢失的情况。
方法2 挂一个脚本去处理这种情况
比如写一个脚本,监测Master的VIP情况,一旦发现没有VIP,就重启keepavlied服务。
方法3 换操作系统
更换为Centos7操作系统,在Centos7上目前我没碰到这个问题。

浙公网安备 33010602011771号