测试环境

  • 2台 vmware虚拟centos 7,一主一备
  • keepalived - 2.0.10
  • nginx - 1.15.7

 

网络和配置环境

1、自带防火墙和iptables均已关闭

2、selinux已关闭

3、vmware虚拟机网络连接方式:NAT

4、virtual_router_id主备都确保一致

5、检查nginx状态的track_script中用到的killall命令已安装,且权限是755

6、内核ipv4转发已开启 net.ipv4.ip_forward = 1

 

Nginx主机信息

主机名

IP地址

server1

192.168.1.11(主)

server2

192.168.1.12(备)

VIP = 192.168.1.99

 

keepalived master节点配置

global_defs {
    router_id server1
}

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 100
    mcast_src_ip 192.168.1.11
    priority 100
    nopreempt
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.1.99
    }

}

keepalived backup节点配置

global_defs {
    router_id server2
}

vrrp_script chk_nginx {
    script "/etc/keepalived/nginx_check.sh"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 100
    mcast_src_ip 192.168.1.12
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.1.99
    }
}

chk_nginx脚本

#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
        killall keepalived
    fi
fi

 

问题分析

启动MASTER节点的时候,VRRP组播只发送了几次,advert_int设置的是1,明明是1s一次发送,但发送大概7次之后就不再发送了

MASTER节点抓包分析: 

keepalived中的vip能ping通吗 keepalive多个vip_组播

在发送了7次间隔为1s的VRRP组播之后就不再发送了,MASTER节点按理说应该是不间断发送的

 

接着启动BACKUP节点,查看日志:

keepalived中的vip能ping通吗 keepalive多个vip_keepalived_02

发现由于在大概3秒的时间之内没有收到MASTER的VRRP组播,BACKUP自动升级为MASTER,由于BACKUP已经变成了MASTER,于是开始发VRRP组播,通过BACKUP抓包可以看到,发了十几次之后又不发了,和上面MASTER启动时候是一个情况

keepalived中的vip能ping通吗 keepalive多个vip_组播_03

这个时候keepalived已经脑裂了,有两个MASTER,再看下原来MASTER上的抓包,发现MASTER可以收到BACKUP节点的VRRP包:

keepalived中的vip能ping通吗 keepalive多个vip_nginx_04

MASTER节点的VIP

 

keepalived中的vip能ping通吗 keepalive多个vip_vrrp_05

BACKUP上面也产生了VIP:

keepalived中的vip能ping通吗 keepalive多个vip_高可用_06

查看BACKUP日志发现根本没有receive advertisement之类的收到VRRP的日志,启动之后的日志产生了之后就再也没有收发VRRP的日志了,由于BACKUP已经变成了MASTER,BACKUP也会向MASTER发送组播,但看了下MASTER的日志也没有任何消息

keepalived中的vip能ping通吗 keepalive多个vip_keepalived_07

分析:BACKUP启动时收不到MASTER的VRRP组播,自动升级成MASTER,产生两个MASTER,查看BACKUP日志也没有任何收到VRRP组播的日志,由于两台机的网卡是可以收到VRRP包的,但不知道是不是CentOS系统没放行VRRP,但自带防火墙和iptables都已经关闭了,MASTER也不是持续发送VRRP,而是发送几次不发了,不知道是keepalived的bug还是我的centos有问题,期待大神帮忙解决下!

 

问题已解决(2018-12-09):

keepalived中的vip能ping通吗 keepalive多个vip_组播_08

现在日志终于正常了,当192.168.1.11挂了之后可以看到192.168.1.12新增VIP的日志,192.168.1.11上的VIP也没有了

问题原因:蛋疼的版本问题,keepalived-2.0.10换成keepalived-1.2.18就好了,折腾了好几天,哎,不知道keepalived-2.0.10和keepalived-1.2.18有什么具体的差别,还是对centos 7的支持不太好或者是需要额外配置什么,以后有空再研究了...