1.场景描述
在实际生产环境中负载均衡是一个至关重要的位置,负载均衡关乎着整个网站访问的命脉,所以运维人员对于它的处理机制和高可用的重视非常高,负载均衡存在单点故障无疑是对整个网站埋下了定时炸弹,nginx +keeplive实现负载高可用,保障业务持续提供服务避免负载均衡的单点故障。
2. 资源说明
角色 IP地址 主机名
负载01 10.0.0.2 LB01
负载02 10.0.0.3 LB02
虚拟服务 10.0.0.4
两台nginx负载均衡+keepalive实现负载高可用两台LB的IP地址分别为:10.0.0.2、10.0.0.3 keepalive的vip为:10.0.0.4,当10.0.0.2正常在vip工作在10.0.0.2,10.0.0.3服务出现宕机则vip自动跳转到10.0.0.3的LB
3.nginx负载配置
LB01的配置
[root@wencqlb-01 ~]# cat /etc/nginx/conf.d/lb01.conf
upstream node {
server 10.0.0.5:80;
server 10.0.0.6:80;
}
server { listen 80;
server_name 10.0.0.4;
location / {
proxy_pass http://node;
include proxy_params;
}
}
LB02的配置
[root@wencqlb02 ~]# cat /etc/nginx/conf.d/lb02.conf
upstream node {
server 10.0.0.5:80;
server 10.0.0.6:80;
}
server {
listen 80;
server_name 10.0.0.4;
location / {proxy_pass http://node;
include proxy_params;
}
}
4.keepalive配置
lb01
[root@wencqlb-01 conf.d]# yum install keepalived -y ##安装keepalive
[root@wencqlb-01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}
vrrp_instance VI_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.4
}
}
[root@wencqlb-01 conf.d]# systemctl start keepalived.service ##启动keepalive
[root@wencqlb-01 conf.d]# systemctl enable keepalived.service ##开机自启
我们可以看见两台LB中的负载配置相同,server name为vip,当请求到达vip所在的LB服务器则会代理到对应的node池进行负载均衡,通过keepalive的vip漂移为我们的服务提供高可用,保障网站7*24提供服务
lb02
[root@wencqlb-01 conf.d]# yum install keepalived -y
[root@wencqlb02 ~]# cat /etc/keepalived/keepalived.conf
bal_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.4
}
}
[root@wencqlb02 conf.d]# systemctl start keepalived.service
[root@wencqlb02 conf.d]# systemctl enable keepalived.servicekeeplive
5.演示
通过演示视频我们模拟LB01宕机,发现vip漂移至第二台LB并且这个切换对于用户是无感知的,今天nginx+keepalive的测试就到这里谢谢!
6.keepalive防止脑裂
主备服务器因为硬件或者软件问题(网线松动或者nginx进程)造成keepalived服务无法检测到心跳信息,nginx服务down掉keepalive还在正常运行没有进行主备切换等等都会造成高可用没有达到理想的效果我们可以通过主备机脚本来规避这些因素造成keepalive无法正常主备切换
备机检测原理
主机能不通,VIP在备机则认为非正常主备切换可能主机状态正常vip在主备机都存在
#!/bin/bash
LB01_vip=10.0.0.3
LB01_ip=10.0.0.5
while true;do
ping -c 2 -W 3 $LB01_ip &>/dev/null
#1.主机存活检测
if [ $? -ne 0 -a `ip add|grep "$LB01_vip"|wc -l` -eq 1 ];then
#2.判断主机down并且vip在备机发送邮件告知管理员
echo "HA is split brain" | mail -s LB-HA wen799923@163.com
else
echo "HA is ok"
fi
sleep 5
done
主机检测原理
判断主机nginx服务是否正常,如果nginx服务down掉尝试启动,如果nginx尝试启动未成功则停掉主机keepalive服务切换至备机保证业务正常运行
#!/bin/bash
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
总结
通过以上两个脚本检测,我们能够做到规避主备之间心跳检测不正常,但是主备机服务正常会存在主备之间都会有VIP导致负载脑裂的问题以及负载服务down掉,keepalive服务正常导致业务中断问题。