Nginx高可用Keepalived(十六)

本文介绍了通过keepalived实现Nginx服务的高可用性,包括VRRP协议原理、keepalived的安装配置、抢占式与非抢占式模式,以及处理脑裂故障的方法。重点讲解了如何通过keepalived的配置确保在主服务故障时,VIP能够漂移到备份服务,保证服务不间断。
摘要由CSDN通过智能技术生成

1. https知识点回顾


四层负载均衡
动静分离
rewrite    rewrite 正则 替换的字符串  flag标记    跳转
https   单台https  多台  SLB

2. 高可用VRRP原理

高可用:通常情况下,都是启动2台相同的业务系统,一台故障,另外一台自动接管。

高可用实现的工具:服务高可用,keepalived软件实现

keepalived实现高可用:keepalived基于VRRP协议,虚拟路由冗余协议。

VRRP解决问题:

3. 高可用keepalived安装

为什么能通过10.0.0.3这个虚拟ip能访问服务?

keepalived虚拟地址漂移与Nginx服务进行关联
	1.Nginx默认监听在所有的IP地址上。
	2.用户将域名解析到VIP上面即可。

(1)提供环境

状态	IP	角色
节点1	10.0.0.5	Master
节点2	10.0.0.6	Backup
VIP	    10.0.0.3

(2)安装keepalived

yum install keepalived -y

(3)两台web配置keeplived配置文件

web01(配置Master的Keepalived)中配置/etc/keepalived/keepalived.conf :

global_defs {     				#全局配置
    router_id lb01				#表示身份->名称
}

vrrp_instance VI_1 {
    state MASTER				#标识角色状态
    interface eth0				#网卡绑定接口
    virtual_router_id 50		#虚拟路由id
    priority 150				#优先级
    advert_int 1				#监测间隔时间
    authentication {			#认证
        auth_type PASS			#明文认证 
# 虚拟的ip地址,会流转到能够使用的一个网关上明文密码和明文认证是一样的,这样才能监控
        auth_pass 1111			#明文密码
}
    virtual_ipaddress {			
        10.0.0.3				#虚拟的VIP地址
    }
}

配置Backup的Keepalived(web02)

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
    }
}

(4)启动keepalived

[root@lb01 ~]# systemctl enable  keepalived
[root@lb01 ~]# systemctl start  keepalived

(5)进行测试

停止一台keeplived服务,同时查看10.0.0.3的虚拟ip,如何切换

在这里插入图片描述

对比keepalived的master与backup配置的区别

Keepalived配置区别		Master配置		Backup节配置
route_id(唯一标识)		 lb01			 lb02
state(角色状态)			 Master			 Backup
priority(竞选优先级)      150			 100

4. 高可用keepalived抢占式与非抢占式

要设置非抢占的原因:
因为在业务高峰期,频繁的切换不好,
主备的硬件设施一样
在这里插入图片描述

web01配置:

Master
	vrrp_instance VI_1 {
		state BACKUP
		priority 150
		nopreempt
	}

web02配置:

Backup
	vrrp_instance VI_1 {
		state BACKUP
		priority 100
		nopreempt
	}

小总结:

(1)两个节点的state都必须配置为BACKUP

(2)两个节点都必须加上配置 nopreempt

(3)其中一个节点的优先级必须要高于另外一个节点的优先级。

(4)两台服务器都角色状态启用nopreempt后,必须修改角色状态统一为BACKUP,唯一的区分就是优先级。

操作技巧:

(1)通过windows的arp去验证,是否会切换MAC地址

(2)ctrl + r 搜索历史命令

(3):set paste 这样复制没有格式错误

(4)ping 10.0.0.3 -t 在windows中可以一直的ping下去

(5)重启keeplived服务的时候,如果使用restart,相当于先关闭,后启动,如果是强占式的,会通过这个间隙会把虚拟ip抢走

(6)如果切换了虚拟ip,通过arp广播告诉windows,mac地址改变了,arp -a,可以看Windows的arp缓存

5. 高可用keepalived脑裂故障产生原因

由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着。(如果发生闹裂,则随机kill掉一台即可。)

(1)服务器网线松动等网络故障
(2)服务器硬件故障发生损坏现象而崩溃
(3)主备都开启firewalld防火墙(为什么开了防火墙会出现脑裂)
  (4) Nginx服务死掉(nginx死掉,keeplived不死,相当于还会接收用户的请求,但是接收到请求后
不提供服务)

	1.会导致用户无法正常的访问到网站。
	2.该服务器的VIp也不会进行漂移(因为keepalived与nginx是两个不同的软件)    
	
	解决手段:
	1.写个监控脚本,如果nginx停止运行,则尝试启动,如果尝试失败,则停止keepalived

注意事项:

(1)在测试的时候要注意两台负载均衡上的环境一样

在这里插入图片描述
(2)防火墙默认拒绝arrp协议,所以开启防火墙,两台机子不能通过arrp协议通信,会产生脑裂

6. 高可用keepalived保证Nginx服务可用

(1)在备上编写检测脚本, 测试如果能ping通主并且备节点还有VIP的话则认为产生了脑裂 (如果发生闹裂,则随机kill掉一台即可。)
(2)224.0.0.18是一个组播,10.0.0.5和10.0.0.6在一个组里面(虚拟路由id 50),如果vip在谁那里,谁发送组播,告诉另一台机子。如果自己挂了,会把虚拟ip漂移到另一台机子上。

[root@lb02 ~]# cat check_split_brain.sh
#!/bin/sh
lb01_vip=10.0.0.3
lb01_ip=10.0.0.5
while true;do
    ping -c 2 -W 3 $lb01_ip &>/dev/null
    if [ $? -eq 0 -a `ip add|grep "$lb01_vip"|wc -l` -eq 1 ];then
        echo "ha is split brain.warning."
# 可以使用mail邮箱的方式来告知管理员服务挂掉了
    else
        echo "ha is ok"
    fi
sleep 5
done
#!/bin/sh
#用远程的方式统计ssh远程任务统计10.0.0.5的03是否存在
lb01=$(ssh 10.0.0.5 'ip add|grep 10.0.0.3'|wc -l)
#测试己方的03是否存在
lb02=`ip add|grep 10.0.0.3|wc -l`
#判断 如果lb01是1 并且 lb02也是1 就执行输出有问题,并且关闭keepalived。
[ $lb01 -eq 1 -a $lb02 -eq 1 ] && echo "have bad" && \
systemctl stop keepalived

(2)Nginx服务死掉

产生问题:

1.会导致用户无法正常的访问到网站。  
	
2.该服务器的VIp也不会进行漂移(因为keepalived与nginx是两个不同的软件)  

解决手段:

1.写个监控脚本,如果nginx停止运行,则尝试启动,如果尝试失败,则停止keepalived

编写脚本:

编写脚本
	[root@lb01 ~]# mkdir /server/scripts
	[root@lb01 ~]# vim /server/scripts/check_web.sh
	#!/bin/sh
	nginxpid=$(ps -C nginx --no-header|wc -l)

	#1.判断Nginx是否存活,如果不存活则尝试启动Nginx
	if [ $nginxpid -eq 0 ];then
		systemctl start nginx
		sleep 3
		#2.等待3秒后再次获取一次Nginx状态
		nginxpid=$(ps -C nginx --no-header|wc -l) 
		#3.再次进行判断, 如Nginx还不存活则停止Keepalived,让地址进行漂移,并退出脚本  
		if [ $nginxpid -eq 0 ];then
			systemctl stop keepalived
	   fi
	fi

	#给脚本增加执行权限
	[root@lb01 ~]# chmod +x /server/scripts/check_web.sh


在Master的keepalived中调用脚本,抢占式,仅需在master配置即可。(注意,如果配置为非抢占式,那么需要两台服务器都使用该脚本)

	
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
         router_id LVS_01
}

#1.每5秒执行一次脚本, 脚本执行内容不能超过5秒,否则会被中断再次重新运行脚本
vrrp_script check_web {
   script "/server/scripts/check_web.sh"
   interval 5
}

vrrp_instance VI_1 {
    nopreempt
    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
    }
    
    #2.调用并运行该脚本
    track_script {
        check_web
    }
}

7. 高可用keepalived总结

(1)keeplived必须是在硬件服务器上的,公有云不支持keepalived,公有云不支持组播,提供自己的高可用服务(底层lvs+keep live组成的),在公有云上配置不了keeplived

(2)银行、金融、证券、国企用的是硬件服务器,用keeplived这个服务。互联网公司用公有云

(3)如果两台硬件节点是一样的话,那么就用非抢占式的。
如果两台硬件节点不是一样的话,那么就用抢占式的

(4)nginx和keeplived两者是分开的,不是捆绑的关系。nginx需要借助keeplived的vip来组成高可用

(5)配合文件中几个重要的地方

在这里插入图片描述

(6)防火墙默认拒绝arrp,所以开启防火墙,两台机子不能通过arrp协议通信,会产生脑裂

(7)@java_page 代表内部跳转,能匹配到下面的location

(8)就是用户请求要给文件,如果没有这个文件的话,会返回给要给错误页面,这个错误页面error_page是存在于web服务器。【所有的请求,负载帮我们往后抛,error_page放在web上面,这个数据包是web给负载均衡,又由负载均衡重新的传给了
客户端】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值