测试环境:
- 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节点抓包分析:
在发送了7次间隔为1s的VRRP组播之后就不再发送了,MASTER节点按理说应该是不间断发送的
接着启动BACKUP节点,查看日志:
发现由于在大概3秒的时间之内没有收到MASTER的VRRP组播,BACKUP自动升级为MASTER,由于BACKUP已经变成了MASTER,于是开始发VRRP组播,通过BACKUP抓包可以看到,发了十几次之后又不发了,和上面MASTER启动时候是一个情况
这个时候keepalived已经脑裂了,有两个MASTER,再看下原来MASTER上的抓包,发现MASTER可以收到BACKUP节点的VRRP包:
MASTER节点的VIP
BACKUP上面也产生了VIP:
查看BACKUP日志发现根本没有receive advertisement之类的收到VRRP的日志,启动之后的日志产生了之后就再也没有收发VRRP的日志了,由于BACKUP已经变成了MASTER,BACKUP也会向MASTER发送组播,但看了下MASTER的日志也没有任何消息
分析:BACKUP启动时收不到MASTER的VRRP组播,自动升级成MASTER,产生两个MASTER,查看BACKUP日志也没有任何收到VRRP组播的日志,由于两台机的网卡是可以收到VRRP包的,但不知道是不是CentOS系统没放行VRRP,但自带防火墙和iptables都已经关闭了,MASTER也不是持续发送VRRP,而是发送几次不发了,不知道是keepalived的bug还是我的centos有问题,期待大神帮忙解决下!
问题已解决(2018-12-09):
现在日志终于正常了,当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的支持不太好或者是需要额外配置什么,以后有空再研究了...