zwmnhao0 2020-06-07
虚拟路由冗余协议(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 的信息 。
Keepalived 软件是基于 VRRP 协议实现的,用来解决服务器的单点故障问题,实现高可用的服务器架构
实现 Nginx + Keepalived 高可用,就是将 Nginx 与 Keepalived 服务的守护进程存活捆绑在一起,Keepalived 服务决定了 VIP 的地址绑定在哪一台机器的哪一块网卡上 。
如果绑定了 VIP 的机器的 Nginx 突然挂掉了,那就要将这台机器的 Keepalived 服务停掉,VIP 的地址就会漂移到备份服务器的网卡上 。
# 安装 keepalived [ ~]# yum -y install keepalived # 编辑配置文件 [ ~]# 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 } } # 编辑定时执行脚本 [ ~]# 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 # 切记要将脚本文件授权成 可执行文件 [ ~]# chmod +x /script/nginx_keep.sh [ ~]# systemctl start keepalived [ ~]# systemctl enable keepalived
# 安装 keepalived [ ~]# yum -y install keepalived # 编辑配置文件 [ ~]# 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 } } [ ~]# systemctl start keepalived [ ~]# systemctl enable 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 高可用服务器在指定时间内,无法检测到对方的心跳,各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着,都绑定了 VIP
脑裂故障原因:
①.服务器网线松动等网络故障
②.服务器硬件故障发生损坏现象而崩溃
③.主备都开启firewalld防火墙
# 执行脚本,如果 lb01,lb02 都绑定了 VIP,停掉 lb02 的Keepalived [ ~]# 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 双机热备
环境说明:本环境由两台mysql 数据库和heartbeat 组成,一台的ip 为192.168.10.197,一台为192.168.10.198,对外提供服务的vip 为192.168.10.200