keepalived高可用
一、keepalived 脑裂 (增大服务器压力)
# 由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方的心跳,各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着。
备用节点如何知道主节点是否down机?
备用节点一直在PING挂载在主节点的VIP.主节点的VIP会给备用节点会回复PONG,证明主节点并没有宕机。如果主节点没有回复,则备用节点则会启动自己的VIP。
1.脑裂的故障
1.网线松动,网络故障
2.服务器硬件故障
3.服务器之间开启了防火墙
#脑裂的产生,对于用户端的浏览器,并没有任何影响,影响的是我们后端的服务器,假如keepalived,开启了日志,我们的后端的服务器会产生双倍的日志,占用我们服务器的硬盘空间。
2.脑裂模拟-------(傻子才模拟)
1、开启防火墙
`开启了防火墙,lb01和lb02之间的 keepalived 大家都互相PING不通。所以主节点以及备用节点。都开启了VIP以及VMAC
[root@lb01 ~]# systemctl start firewalld.service
[root@lb01 ~]# ip addr | grep 10.10.0.102
inet 10.10.0.102/32 scope global eth0
[root@lb02 ~]# systemctl start firewalld
[root@lb02 ~]# ip addr | grep 10.10.0.102
inet 10.10.0.102/32 scope global eth0
2、开启防火墙,单独添加端口开启
`因为开启了firewalld防火墙,默认拒绝所有连接,要开启80端口
[root@lb01 ~]# firewall-cmd --add-service=http
success
[root@lb02 ~]# firewall-cmd --add-service=http
success
`因为开启了firewalld防火墙,默认拒绝所有连接,我们用的是HTTPS,还要开启443端口,要开启80端口
[root@lb01 ~]# firewall-cmd --add-service=https
success
[root@lb02 ~]# firewall-cmd --add-service=https
success
#访问页面没有任何问题
10.10.0.102
3、关闭防火墙
[root@lb02 ~]# systemctl stop firewalld.service
[root@lb02 ~]# ip addr | grep 10.10.0.102.0.0.3
[root@lb01 ~]# systemctl stop firewalld.service
[root@lb01 ~]# ip addr | grep 10.10.0.102.0.0.3
inet 10.10.0.102/32 scope global eth0 #lb01优先级高
3.脑裂解决的办法
#如果发生脑裂,则随机kill杀掉一台即可
#在备上编写检测脚本, 测试如果能ping通主并且备节点还有VIP的话则认为产生了脑裂,
` 因为是大家互PING,所以主节点以及备用节点,都需要编写并执行此脚本。
[root@lb01 ~]# cat check_keepalive.sh
#!/bin/sh
vip=10.10.0.102
lb02_ip=172.16.1.6
while true;do
ssh $lb01_ip 'ip addr | grep 10.10.0.102' &>/dev/null
if [ $? -eq 0 -a `ip add|grep "$vip"|wc -l` -eq 1 ];then
echo "ha is split brain.warning."
else
echo "ha is ok"
fi
sleep 3
done
[root@lb02 ~]# vim check_keepalive.sh
#!/bin/sh
vip=10.10.0.102
lb01_ip=172.16.1.5
while true;do
# ping -c 2 $1b01—ip & /dev/null
ssh $lb01_ip 'ip addr | grep 10.10.0.102' &>/dev/null
if [ $? -eq 0 -a `ip add|grep "$vip"|wc -l` -eq 1 ];then
echo "ha is split brain.warning."
else
echo "ha is ok"
fi
sleep 3
done
## 免密
[root@lb01 ~]# ssh-keygen #一路回车
[root@lb01 ~]# ssh-copy-id 172.16.1.6
[root@lb01 ~]# ssh 172.16.1.6 'ip addr | grep 10.10.0.102'
[root@lb02 ~]# ssh-keygen #一路回车
[root@lb01 ~]# ssh-copy-id 172.16.1.5
[root@lb02 ~]# ssh 172.16.1.5 'ip addr | grep 10.10.0.102'
inet 10.10.0.102/32 scope global eth0