先森在模拟搭建LVS+Keepalived的环境,LVS是做负载均衡的,Keepalived是做高可用的。在搭建好之后,先森遇到了一个奇怪的问题,两个负载均衡器MASTER和BACKUP都抢占到了VIP。不过还好的是,实际上同一时间内只有一个VIP在起作用。下面就来谈谈先森的解决过程。
解决过程
通过不停的查找问题,我发现,只需要关闭备用负载均衡器的防火墙,那么主备服务器都有VIP的情况就会得以解决。由此可以肯定,问题就是出现在了防火墙这里。
首先用tcpdump查看一下vrrp的组播情况,这个随便在同网络的任意一台服务器抓包即可:
1
|
tcpdump vrrp -n
# -n:不把主机的网络地址转换成名字
|
查看下抓包的结果:
tcpdump抓包
由上图可以看到,192.168.2.79和192.168.2.53两个IP在轮流发送组播信号。而正常的应该是由MASTER服务器发送组播,如果BACKUP收不到MASTER的组播信号了,那么判定MASTER宕机了,BACKUP就会接手VIP。
2016年12月01日更新
SElinux
首先,先确定服务器的SElinux是否设置为关闭。一般都是将其关闭的,在CentOS先森尝试了启用,但是也没有firewall-cmd这个命令,无法添加端口,所以还是将其关闭吧。
查看SElinux的状态:
1
|
getenforce
|
可能的结果有三个:
1
2
3
|
Enforcing
#强制开启
Permissive
#宽容模式
Disabled
#关闭
|
如果是Enforcing强制模式,就需要关闭:
1
|
setenforce 0
#设置为宽容模式
|
但这样只在本次生效,重启服务器后将失效。如果要永久关闭,还需要修改配置文件:
1
|
sed
-i
's/=enforcing/=disabled/g'
/etc/sysconfig/selinux
|
iptables防火墙
如果将SElinux关闭问题依旧存在,则可能是防火墙将MASTER的VRRP组播给挡住了。首先将防火墙关闭,确定防火墙是否为罪魁祸首。
1
|
service iptables stop
|
如果关闭防火墙,keepalived问题解决了,那么问题就简单了,我们只需要让VRRP组播其通过防火墙即可。
我们只需要在防火墙中增加一条规则即可:
1
|
-A INPUT -p vrrp -j ACCEPT
|
但是这里有个坑,默认的防火墙中基本是如下配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
|
添加规则一定不要在
1
|
-A INPUT -j REJECT --reject-with icmp-host-prohibited
|
之后,一定要加在其前面。
防火墙配置
这时候重启防火墙后查看BACKUP的ip,就会发现VIP已经不在了。
再关闭一下MASTER的keepalived,并打开BACKUP的日志,就可以看到正确的内容:
1
|
tail
-f
/var/log/messages
|
Keepalived切换VIP
总结
如果不是防火墙的原因,那么久应该仔细查看配置文件中的vrrp_sync_group中设置的VRRP组等设置是否相同,当然还有其他的可能性,但大多都是VRRP组播信号的问题。
在解决问题的过程中,排除法无疑是最简单粗暴定位问题的方法,要灵活运用。