四层负载均衡
动静分离
rewrite rewrite 正则 替换的字符串 flag标记 跳转
https 单台https 多台 SLB
高可用:通常情况下,都是启动2台相同的业务系统,一台故障,另外一台自动接管。
高可用实现的工具:服务高可用,keepalived软件实现
keepalived实现高可用:keepalived基于VRRP协议,虚拟路由冗余协议。
VRRP解决问题:
为什么能通过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
要设置非抢占的原因:
因为在业务高峰期,频繁的切换不好,
主备的硬件设施一样
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缓存
由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着。(如果发生闹裂,则随机kill掉一台即可。)
(1)服务器网线松动等网络故障
(2)服务器硬件故障发生损坏现象而崩溃
(3)主备都开启firewalld防火墙(为什么开了防火墙会出现脑裂)
(4) Nginx服务死掉(nginx死掉,keeplived不死,相当于还会接收用户的请求,但是接收到请求后
不提供服务)
1.会导致用户无法正常的访问到网站。
2.该服务器的VIp也不会进行漂移(因为keepalived与nginx是两个不同的软件)
解决手段:
1.写个监控脚本,如果nginx停止运行,则尝试启动,如果尝试失败,则停止keepalived
注意事项:
(1)在测试的时候要注意两台负载均衡上的环境一样
(2)防火墙默认拒绝arrp协议,所以开启防火墙,两台机子不能通过arrp协议通信,会产生脑裂
(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
}
}
(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给负载均衡,又由负载均衡重新的传给了
客户端】