VRRP 协议
虚拟路由冗余协议(Virtual Router Redundancy Protocol)是解决局域网中配置静态网关出现单点失效现象的路由协议,通过将多台设备虚拟化成一台设备,如果其中一台设备出现故障,那么另一台设备可以迅速接替其工作,已保证通讯的可靠性和连续性,属于网络层协议 。
公司的网络是通过网关进行上网的,那么如果该路由器故障了,网关无法转发报文了,此时所有人都无法上网了,怎么办?通常的做法是给路由器增加一个 BACKUP,假设 MASTER 发生了故障,每一个用户需要手动指向 BACKUP,如果用户过多修改起来非常麻烦 ;那从主节点 MASTER 下手,我们将 BACKUP 网关修改为 MASTER 的 IP 是否可以?
答案是不行的,PC 第一次通过 ARP 广播找到 MASTER 网关的 IP + Mac 地址后,会写入 ARP 缓存表,那么 PC 在之后的连接都是通过缓存表进行数据报转发的,即使我们修改了 IP,但是 Mac 地址是唯一的, PC 的数据包仍然会发送给 Master(除非 ARP 缓存表过期,再次发 ARP 广播时,会记录新的 IP + Mac 地址映射)
如何才能做到出现故障自动转移,此时 VRRP 就出现了,我们的VRRP其实是通过软件或者硬件的形式在 Master 和 Backup 外面增加一个虚拟的MAC地址(VMAC)与虚拟IP地址(VIP),那么在这种情况下,PC请求VIP的时候,无论是Master处理还是Backup处理,PC仅会在 ARP 缓存表中记录 VMAC 与 VIP 的信息 。
nginx + Keepalived 高可用
Keepalived 软件是基于 VRRP 协议实现的,用来解决服务器的单点故障问题,实现高可用的服务器架构
用虚拟机模拟上图情况获取缓存表如下,
实现 Nginx + Keepalived 高可用,就是将 Nginx 与 Keepalived 服务的守护进程存活捆绑在一起,Keepalived 服务决定了 VIP 的地址绑定在哪一台机器的哪一块网卡上 。
如果绑定了 VIP 的机器的 Nginx 突然挂掉了,那就要将这台机器的 Keepalived 服务停掉,VIP 的地址就会漂移到备份服务器的网卡上 。
抢占式 Keepalived 配置
Master 节点配置
# 安装 keepalived
[root@lb01 ~]# yum -y install keepalived
# 编辑配置文件
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs { #全局配置
router_id lb01 #标识身份->名称
}
vrrp_script isalive {
script "/script/nginx_keep.sh"
interval 5
}
vrrp_instance VI_1 {
state MASTER #标识角色状态
interface eth0 #网卡绑定接口
virtual_router_id 50 #虚拟路由id
priority 150 #优先级
advert_int 1 #监测间隔时间
authentication { #认证
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress {
10.0.0.3 #虚拟的VIP地址
}
track_script {
isalive
}
}
# 编辑定时执行脚本
[root@lb01 ~]# cat /script/nginx_keep.sh
#!/bin/sh
nginx_status=$(ps -C nginx --no-header|wc -l)
#1.判断Nginx是否存活,如果不存活则尝试启动Nginx
if [ $nginx_status -eq 0 ];then
systemctl start nginx
sleep 3
#2.等待3秒后再次获取一次Nginx状态
nginx_status=$(ps -C nginx --no-header|wc -l)
#3.再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本
if [ $nginx_status -eq 0 ];then
systemctl stop keepalived
fi
fi
# 切记要将脚本文件授权成 可执行文件
[root@lb01 ~]# chmod +x /script/nginx_keep.sh
[root@lb01 ~]# systemctl start keepalived
[root@lb01 ~]# systemctl enable keepalived
Backup 节点配置
# 安装 keepalived
[root@lb02 ~]# yum -y install keepalived
# 编辑配置文件
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb02
}
vrrp_instance VI_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
}
}
[root@lb02 ~]# systemctl start keepalived
[root@lb02 ~]# systemctl enable keepalived
非抢占式 Keepalived 配置
1、两个节点的state都必须配置为 BACKUP
2、两个节点都必须加上配置 nopreempt
3、其中一个节点的优先级必须要高于另外一个节点的优先级
两台服务器都角色状态启用 nopreempt 后,必须修改角色状态统一为 BACKUP,唯一的区分就是 优先级!!
原 Master 配置
vrrp_instance VI_1 {
state BACKUP
priority 150
nopreempt
}
Backup 配置
vrrp_instance VI_1 {
state BACKUP
priority 100
nopreempt
}
Keepalived 脑裂
由于某些原因,导致两台 Keepalived 高可用服务器在指定时间内,无法检测到对方的心跳,各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着,都绑定了 VIP
脑裂故障原因:
①.服务器网线松动等网络故障
②.服务器硬件故障发生损坏现象而崩溃
③.主备都开启firewalld防火墙
# 执行脚本,如果 lb01,lb02 都绑定了 VIP,停掉 lb02 的Keepalived
[root@lb02 ~]# vim brainsplitting.sh
#!/bin/bash
vip=10.0.0.3
lb01_ip=10.0.0.5
while true;do
ping -c 3 $lb01_ip &>/dev/null
if [ $? -eq 0 ];then
lb01_vip_status=$(ssh $lb01_ip "ip add|grep $vip|wc -l")
lb02_vip_status=$(ip add|grep $vip|wc -l)
if [ $lb01_vip_status -eq 1 -a $lb02_vip_status -eq 1 ];then
systemctl stop keepalived
fi
fi
sleep 5
done
其他可供学习的Blog:
Nginx + Keepalived 双机热备