keepalived高可用
目录
内容概述
1.什么是高可用?
2.高可用常用的工具
3.keeplived是怎样实现高可用的?
-3.1 名词解释
-3.2 举例说明
4.高可用keepalived核心概念
5.keepalived搭建
6.keepalived的抢占式和非抢占式
7.keepalived常见问题以及解决方式
-7.1 什么是keepalived脑裂?
-7.2 脑裂的解决办法
8.nginx与高可用keepalived
-8.1 nginx故障切换脚本
-8.2 使用keepalived配置文件调用nginx切换脚本
内容详细
1.什么是高可用?
高可用一般指两台部署并运行着完全一样服务的服务器,如果其中一台发生故障宕机,另外一台将快速接管业务。这个过程对于用户来说是感知不到的。
2.高可用常用的工具
硬件上我们使用 F5
软件我们通常使用 keepalived # 一些云服务器不支持keepalived,这些服务器一般本身就是高可用负载均衡。
3.keeplived是怎样实现高可用的?
3.1 名词解释
首先,keepalived软件基于VRRP协议实现,VRRP协议又叫虚拟路由冗余协议,一般用来解决单点故障。
它的工作方式是在局域网中不间断的广播,不间断探测,当探测到对方发生故障时,则立即使VIP漂移到指定的节点。
keepalived 的优点是实现了IP的漂移
缺点:
1.云主机不支持
2.容易脑裂(即多个节点上同时产生了相同的VIP)
3.一般只在公司内部使用
3.2 举例说明
比如公司的网络是通过网关进行上网的,那么如果该路由器故障了,网关无法转发报文了,此时所有人都无法上网了,怎么办?
通常做法是给路由器增加一台备节点,但是问题是,如果我们的主网关master故障了,用户是需要手动指向backup的,如果用户过多修改起来会非常麻烦。
问题 1:假设用户将指向都修改为backup路由器,那么master路由器修好了怎么办?
问题 2:假设Master网关故障,我们将backup网关配置为master网关的ip是否可以?
这其实是不行的,因为PC第一次通过ARP广播寻找到Master网关的MAC地址与IP地址后,会将信息写到ARP的缓存表中,那么PC之后连接都是通过那个缓存表的信息去连接,然后进行数据包的转发,即使我们修改了IP但是Mac地址是唯一的,pc的数据包依然会发送给master。(除非是PC的ARP缓存表过期,再次发起ARP广播的时候才能获取新的backup对应的Mac地址与IP地址)
那么如何才能做到出现故障自动转移,此时VRRP就出现了。我们的VRRP其实是通过软件或者硬件的形式在Master和Backup外面增加一个虚拟的MAC地址(VMAC)与虚拟IP地址(VIP),那么在这种情况下,PC请求VIP的时候,无论是Master处理还是Backup处理,PC仅会在ARP缓存表中记录VMAC与VIP的信息。
4.高可用keepalived核心概念
1.该怎样确定谁是主节点,,谁是备用节点?(涉及到优先级的问题)
2.如果Master出现故障,Backup自动接管,那么Master恢复后会将业务接管回来吗?(抢占式和非抢占式)
3.如果两台服务器都认为自己是Master会出现什么问题?(脑裂)
5.keepalived搭建
环境:准备两台完全一样的七层负载均衡服务器(lb01和lb02)
VIP:192.168.174.110
1.安装高可用软件
两台机器都装:yum install keepalived -y
2.修改配置文件
配置主节点的配置文件(lb01)
vim /etc/keepalived/keepalived.conf
# 全局配置
global_defs {
# 身份识别 (router_id在集群中不能重复)
router_id lb01
}
# 配置VRRP协议
vrrp_instance VI_1 {
# 状态/身份 MASTER和BACKUP 指定是否是MASTER节点
# 即使指定了MASTER,也不能够将其设置为MASTER节点
state BACKUP
# 绑定网卡(指定代理的网卡)
nopreempt
# 开启非抢占式
interface eth0
# 虚拟路由标识,可以理解为分组
virtual_router_id 50
# 权重,权重越高,VIP分配的权重就越高(0 ~ 100) 优先级
priority 100
# 检测心跳的间隔时间
advert_int 1
# 为集群设置认证
authentication {
# 认证的类型
auth_type PASS
# 认证的密码
auth_pass 123456
}
# 配置VIP
virtual_ipaddress {
# 虚拟的IP地址
192.168.174.110
}
}
配置备用节点的配置文件(lb02)
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
nopreempt
interface eth0
virtual_router_id 50
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.174.110
}
}
两台服务器都启动keepalived
systemctl start keepalived.service
# keepalived 开启日志
# 配置keepalived
vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -d -S 0"
# 配置rsyslog抓取日志
vim /etc/rsyslog.conf
local0.* /var/log/keepalived.log
# 重启服务即可
systemctl restart keepalived rsyslog
6.keepalived的抢占式和非抢占式
默认情况下,keepalived是抢占式的,抢占式会导致访问故障,所以一般情况下我们用非抢占式。
1.两个节点都启动的情况
# 因为节点一优先级比节点二高,所以只有节点一上有VIP
ip addr | grep 192.168.174.110
inet 192.168.174.110/32 scope global eth0
2.停止主节点后,由于节点一keepalived挂掉,节点一会自动接管节点二的工作,即VIP。
这时lb02:ip addr | grep 192.168.174.110
inet 192.168.174.110/32 scope global eth0
3.重新启动主节点,因为节点一优先级高于节点二,所以当节点一恢复时,会把VIP抢占回来。
ip addr | grep 192.168.174.110
inet 192.168.174.110/32 scope global eth0
4.我们需要配置非抢占式
# 主节点配置
vim /etc/keepalived/keepalived.conf
... ...
vrrp_instance VI_1 {
state BACKUP
#开启非抢占式
nopreempt
priority 100
... ...
}
重启keepalived
systemctl restart keepalived。service
# 备用节点配置
vim /etc/keepalived/keepalived.conf
... ...
vrrp_instance VI_1 {
state BACKUP
#开启非抢占式
nopreempt
priority 90
... ...
}
重启keepalived
systemctl restart keepalived.service
# 总结
1.两个节点的state都必须配置为BACKUP
2.两个节点都必须加上配置 nopreempt
3.其中一个节点的优先级必须要高于另外一个节点的优先级
4.两台服务器都角色状态启用nopreempt后,必须修改角色状态统一为BACKUP,它们唯一的区分就是优先级不同
7.keepalived常见问题以及解决方式
7.1 什么是keepalived脑裂?
因为某些原因,导致两台keepalived高可用服务器在指定的时间内,无法检测到对方的"心跳",各自取得了资源以及服务的所有权,原来被一个节点访问的资源就会出现被多个节点同时访问的情况,,这种情况就是脑裂。
可能导致脑裂的情况:
1.网线松动,网络故障
2.服务器硬件出现问题
3.服务器之间开启了防火墙
7.2 脑裂的解决办法
我们从原理来解决问题,如果发生脑裂,那么则随机kill掉一台即可。
# 我么可以尝试编写测试脚本,测试如果能ping通主节点,并且备用节点还有VIP的话,我们就认为产生了脑裂。
编写检测脚本:
lb01:
#!/bin/sh
vip=192.168.174.110
lb01_ip=192.168.174.5
while true ;
do
ping -c 2 $lb01_ip &>/dev/null
if [ $? -eq 0 -a `ip a | grep "$vip"|wc -l` -eq 1 ] ; then
echo "脑裂发生......"
else
echo "一切正常"
fi
sleep 5
done
lb02:
#!/bin/bash
vip=192.168.174.110
lb01_ip=172.16.1.5
while true ;
do
ssh $lb01_ip 'ip a | grep 192.168.174.5' & > /dev/null
if [ $? -eq 0 -a `ip a | grep "$vip"|wc -l` -eq 1 ] ; then
echo "脑裂发生......"
else
echo "一切正常"
fi
sleep 5
done
8.nginx与高可用keepalived
8.1 nginx故障切换脚本
nginx默认监听在所有的ip地址上,VIP会随机漂移到一台节点上,相当于那台nginx主机多了VIP这块网卡,所以我么可以通过该ip访问到这台nginx主机。
问题是,如果nginx主机宕机了,用户访问失败,而keepalived没有挂掉不会就不会切换。
所以我们需要一个脚本来检测nginx存活状态,如果不存活我们就kiil掉keepalived。
#!/bin/sh
# 判断Nginx是否存活,如果不存活则尝试启动Nginx
netstat -nutlp | grep -E '\<80\>'
if [ $? -ne 0 ];then
systemctl restart nginx
# 等待3秒后再次获取一次Nginx状态
sleep 3
# 再次进行判断, 如Nginx还不存活,则停止Keepalived,让地址进行漂移,并退出脚本
netstat -nutlp | grep -E '\<80\>'
if [ $nginxpid -eq 0 ];then
systemctl stop keepalived
fi
fi
# 给脚本增加执行权限
chmod +x /root chick_nginx.sh
8.2 使用keepalived配置文件调用nginx切换脚本
1.配置抢占式
# 只需要在备用节点配置
vim /etc/keepalived/keepalived.conf
global_defs {
router_id lb02
}
# 每5秒执行一次脚本,脚本执行内容不能超过5秒,否则会中断再次重新执行脚本
vrrp_script check_nginx {
script "/root/check_nginx.sh"
interval 5
}
...
# 调用计划的脚本
track_script {
check_nginx
}
}
2.配置非抢占式
# 配置非抢占式时,两边都要配置脚本
3.进行测试
1)将VIP所在的机器nginx的配置文件修改错误
2)停止nginx
3)查看VIP是否切换