Keepalived
一、keepalived工作原理
实现高可用的基本原理是
1. 两台LB机器均部署好keepalived工具,并且启动服务;
2. 角色是master的机器获得IP资源且为用户提供访问(nginx)
3. 角色是backup的机器作为master的热备机器(master挂了,立即接替)
当master出现故障时,backup机器自动接管master的所有工作,接管VIP以及其他资源。
master修复后,自动接管它本身的资源,如VIP,backup自动释放接管的资源。
此时两台机器恢复启动时的角色,以及工作状态。
二、VRRP协议
keepalived主要是通过VRRP这个协议实现的高可用功能,实现的虚拟IP在两台机器上漂移。
VRRP将多台设备组成一个虚拟设备,通过配置虚拟设备的IP地址为缺省网关,实现缺省网关的备份。
当网关设备发生故障时,VRRP机制能够选举新的网关设备承担数据流量,从而保障网络的可靠通信。
VRRP工作原理
VRRP协议中定义了三种状态机:初始状态(Initialize)、活动状态(Master)、备份状态(Backup)。
其中,只有处于Master状态的设备才可以转发那些发送到虚拟IP地址的报文。
下表详细描述了三种状态。
状态 | 说明 |
---|---|
Initialize | 该状态为VRRP不可用状态,在此状态时设备不会对VRRP通告报文做任何处理。通常设备启动时或设备检测到故障时会进入Initialize状态。 |
Master | 当VRRP设备处于Master状态时,它将会承担虚拟路由设备的所有转发工作,并定期向整个虚拟内发送VRRP通告报文。 |
Backup | 当VRRP设备处于Backup状态时,它不会承担虚拟路由设备的转发工作,并定期接受Master设备的VRRP通告报文,判断Master的工作状态是否正常。 |
VRRP配置前提条件
1. 虚拟IP不得重复
2. 虚拟IP得和相同网段的网卡绑定
三、安装keepalived
1.安装keepalived
yum install keepalived -y
2.创建keepalived配置文件
master节点
vim /etc/keepalived/keepalived.conf
global_defs {
router_id lb-5 # 路由器ID,每个机器不一样
}
vrrp_instance VIP_1 { # 设置VRRP路由器组组名,属于同一组的名字一样
state MASTER # 角色,master、backup两种
interface eth0 # VIP绑定的网卡
virtual_router_id 50 # 虚拟路由IP,同一组的一样
priority 150 # 优先级,优先级越高,权重越高
advert_int 1 # 发送组播间隔1s
authentication { # 认证形式
auth_type PASS # 密码认证,明文密码 1111
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24 # 指定虚拟VIP地址,必须没人使用
}
}
backup节点
vim /etc/keepalived/keepalived.conf
global_defs {
router_id lb-6
}
vrrp_instance VIP_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24
}
}
router_id 在这个虚拟路由器组中的都不一样
state 只有一个master,可以有多个backup
interface 指定当前负载均衡机器的 通信的网卡即可,。
virtual_router_id 注意,每个机器,都一样,表示是一组内的设备
priority 优先级,master需要高于backup
authentication 一组设备中的master和backup的通信认证,是明文形式的 1111
这个信息,可以通过抓包看到。
virtual_ipaddress 指定VIP的ip地址,需要在局域网内,无人使用。
3.启动两台机器的keepalived
systemctl start keepalived
4.绑定客户端的VIP
10.0.0.3 keepalive.com
去检测lb机器的日志即可。
5.模拟keepalived出现故障
当前VIP在lb-5机器上
[root@lb-5 ~]#ip a show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e2:9a:ea brd ff:ff:ff:ff:ff:ff
inet 10.0.0.5/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 10.0.0.3/24 scope global secondary eth0
valid_lft forever preferred_lft forever
lb-6的IP情况
[root@lb-6 ~]#ip a show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:17:e7:79 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.6/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
停止lb5机器的keepalived
1.查看VIP漂移情况
2.查看客户端访问是否受影响
3.注意日志的检测
[root@lb-5 /etc/nginx]#systemctl stop keepalived
lb-5的IP情况
[root@lb-5 ~]#ip a show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:e2:9a:ea brd ff:ff:ff:ff:ff:ff
inet 10.0.0.5/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
当前VIP在lb-6机器上
[root@lb-6 ~]#ip a show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:17:e7:79 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.6/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet 10.0.0.3/24 scope global secondary eth0
valid_lft forever preferred_lft forever
6.恢复lb-5的keepalived服务
[root@lb-5 ~]#systemctl start keepalived
查看此时VIP又漂移到了lb-5机器。
四、Keepalived脑裂问题
简单说就是如果master还在正常工作,但是backup没有正确接收到master的心跳数据包,就会以为master挂掉了,抢夺VIP资源。
这个时候就会导致两个服务器都有了VIP,导致冲突故障,这就是脑裂问题。
1.导致脑裂的原因
要实现心跳检测,需要让至少两台服务器实现互相通信,数据包收发,主要通过如下方式实现
(生产环境下做法)直接网线让两台服务器直连
也可以通过局域网通信,确保两台机器可以连接。
高可用软件基于这个心跳线来判断对端机器是否存活,决定是否要实现故障迁移,VIP迁移,保证业务的连续性。
一般来说,导致脑裂的原因有这些,也是排错思路
心跳线老化,线路破损,导致无法通信
网卡驱动损坏,master、backup IP地址冲突。
防火墙配置错误,导致心跳消息收不到
配置文写错了,两台机器的虚拟路由ID不一致。
2.抓包工具查看脑裂
lb-5安装tcpdump
[root@lb-5 ~]#yum install tcpdump -y
# 参数
# -nn: 指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示
# -i 指定监听的网络接口;
# any 抓取所有网络接口
# host 指定抓取的主机地址,这里是组播地址。
tcpdump -nn -i any host 224.0.0.18
3.解决脑裂
使用双心跳线路,防止单线路损坏,只要确保master的心跳数据包能发给backup。
通过脚本程序检测脑裂情况
判断是否两边都有VIP,如果心跳重复,强制关闭一个心跳节点(直接发送关机命令,强制断掉主节点的电源)
做好脑裂监控,如果发现脑裂,人为第一时间干预处理。
如果开启了防火墙,注意要允许心跳IP的访问。
情况1:backup出现问题
确保backup机器定时去判断master的VIP状态,如果发生脑裂,backup自杀即可(kill keepalived)
思路:
1. backup定期检查master的nginx是否运行
2. backup定期检查自己是否有VIP
3. 如果有如下情况,backup却也有VIP,就是脑裂
- master的nginx正常
- master有VIP
- backup有VIP
4. 如果backup有脑裂,就干掉自己的keepalived
5. 告知管理员。
1.backup脚本开发
cat > /etc/keepalived/check_vip.sh << 'EOF'
#!/bin/bash
MASTER_VIP=$(ssh 10.0.0.5 ip a|grep 10.0.0.3|wc -l)
MY_VIP=$(ip a|grep 10.0.0.3|wc -l)
# 如果远程有VIP并且自己本地也存在了VIP,就干掉自己
if [ ${MASTER_VIP} == 1 -a ${MY_VIP} == 1 ]
then
systemctl stop keepalived
fi
EOF
2. backup服务调用自杀脚本
这里是利用了keepalived自身提供的vrrp_script脚本功能,实现监控,自动干掉自己。
前提条件是
脚本添加执行权限
lb-6和lb-5免密登录
cat > /etc/keepalived/keepalived.conf << 'EOF'
global_defs {
router_id lb-6
}
# 定义脚本
vrrp_script check_vip {
script "/etc/keepalived/check_vip.sh"
interval 5 # 脚本执行的时间间隔
}
vrrp_instance VIP_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24
}
# 调动脚本
track_script {
check_vip
}
}
EOF
3.测试backup的监控脚本
1. 确保master、backup正常
systemctl restart keepalived
2. 主动导致脑裂,查看情况
[root@lb-6 /etc/keepalived]#systemctl restart firewalld
情况2:master出现问题
刚才的脚本解决了backup抢夺VIP的问题;
但是如果master出了问题呢?比如master的nginx挂了,那keepalived没啥用了,服务还是挂了。
思路:
master机器
1. 如果自己的nginx已经不存在了,keepalived还活着,尝试重启nginx
2. 如果重启nginx失败,干掉自己的keepalived,放弃master资源,让backup继续干活
1.master脚本
cat > /etc/keepalived/check_web.sh << 'EOF'
#!/bin/bash
NGINX_STATUS=$(ps -ef|grep nginx|wc -l)
# 如果nginx挂了
if [ ${NGINX_STATUS} == 0 ]
then
systemctl restart nginx
# 如果重启失败
if [ $? == 1 ]
then
# keepalived没必要活着了
systemctl stop keepalived
fi
fi
EOF
2.master的keepalived调用脚本
cat > /etc/keepalived/keepalived.conf << 'EOF'
global_defs {
router_id lb-5
}
vrrp_script check_web {
script "/etc/keepalived/check_web.sh"
interval 5
}
vrrp_instance VIP_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3/24
}
track_script {
check_web
}
}
EOF
3.模拟master故障
1.确保master和backup正常
2.停止master的nginx
[root@lb-5 ~]#chmod +x /etc/keepalived/check_web.sh
3.发现你此时就已经没法停了,keepalived帮你自动重启nginx
4.你可以试试让nginx起不来
[root@lb-5 ~]#echo 'yuchaoit.cn' >> /etc/nginx/nginx.conf
[root@lb-5 ~]#systemctl stop nginx
5.此时已经正确切换到backup了。
4.修复master
[root@lb-5 ~]#systemctl restart nginx
[root@lb-5 ~]#systemctl restart keepalived
查看backup是否归还VIP资源。