Keepalived丢失VIP一例

Keepalived丢失VIP一例

问题描述

测试环境发现有个业务访问不了,发现是Master丢失了VIP。

环境描述

这里先描述一下环境:

操作系统:ubuntu18.04

Keepavlied版本:Keepalived v1.3.9

采用apt-get安装的 2台Nginx+Keepalived 架构。采用Master-Backup部署。

问题排查

初步排查

  1. 检查发现Nginx正常,Master的VIP丢失,但是没有发生切换,Master和Backup节点都没有关于Keepalived交互的日志(比如切换等)。

  2. 在Master上使用systemctl restart keepalived可以恢复正常,或者systemctl stop keepalived可正常进行切换。

问题猜测

根据初步排查,怀疑可能的原因有:

  • 操作系统原因(比如BUG)

  • 网络问题(网络变更等)

  • keepalived 版本有bug

进一步排查

首先网络这块,这两台机器在同一个网段,在同一个交换机上,网络上变更影响的概率较小,况且这个要找网络同事去配合,还是从自己可以排查的角度出发,先检查操作系统和keepalived。

  1. 检查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。 看来大概率是这个了。

  2. 怎么验证自己的猜想呢?

    这里我也不知道操作系统是重启了哪个网络服务,不过我知道跟网络有关的服务大概有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 #1815101 “[master] Restarting systemd-networkd breaks keepal...” : Bugs : systemd package : Ubuntu

并且,好像这个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上目前我没碰到这个问题。

posted @ 2023-05-09 15:28  xuege  阅读(523)  评论(0)    收藏  举报