keepalived实现nginx的高可用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了keepalived实现nginx的高可用相关的知识,希望对你有一定的参考价值。

前言:
优化nginx_proxy代理可能出现单点故障的情况,通过keepalived得方式来完成nginx_proxy服务器之间的高可用,因为keepalived的工作机制是通过心跳线来检测服务器之间是否出现故障,但是并不能检测nginx_proxy代理服务是否正常工作,所以需要采用编写脚本判断的方式来检测nginx_proxy代理服务器,当Nginx_proxy 代理服务器出现故障时。立马切换到vip

名词解释:
VIP:用户通过访问VIP虚拟IP地址,从而访问对应的主节点
选举:两台业务系统,由选举的方式确认谁是主节点,谁是备节点
心跳线:选举之后主要用来检测对方的状态
列脑:主备权重一致,造成列脑

keepalived的高可用列脑
由于某些原因,导致两台keepalived高可用服务器在指定时间内,无法检测到对方的心跳消息,各自取得资源及服务的所有权,而此时的两台高可用服务器又都还活着。

原因:
服务器网线松动等网络故障
硬件故障发生损坏现象而崩溃
都开启firewalld防火墙
nginx服务死掉等等

实验环境:

服务器系统 角色 外网IP 内网IP
centos7 master 10.0.0.5 172.16.1.5
centos7 backup 10.0.0.6 172.16.1.6

环境准备:
两台nginx_proxy服务器都需安装
[[email protected] ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
[[email protected] ~]# yum install keepalived -y
[[email protected] ~]# yum install nginx -y

实验步骤:
1.两台nginx_proxy都执行以下步骤
[[email protected] ~]# mkdir -p /server/scripts/
[[email protected] scripts]# vim keepalived.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

2.master keepalibed 的配置文件
[[email protected] ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_01
}
#1.每5秒执行一次脚本, 脚本执行内容不能超过5秒,否则会被中断再次重新运行脚本
vrrp_script keepalived {
script "/server/scripts/keepalived.sh"
interval 5
weight 50
}

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

#2.调用并运行该脚本
track_script {
    keepalived
}

}

3.backup keepalived的配置文件
[[email protected] scripts]# vim /etc/keepalived/keepalived.conf
lobal_defs {
router_id lb02

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

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

3.2 在备上编写测试脚本,如果能ping 通主,并且还有vip的话则认为产生列脑
[[email protected] ~]# 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."
else
echo "ha is ok"
fi
sleep 5
done

测试:
随意在[[email protected] ~]# vim /etc/nginx/nginx.conf 的配置文件里面写入字符,让nginx启动失效
[[email protected] ~]# systemctl restart nginx
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.

检查会发现它自已通过脚本切换到backup keepalived
[[email protected] ~]# hostname -I
10.0.0.5 172.16.1.5
[[email protected] scripts]# hostname -I
10.0.0.6 10.0.0.3 172.16.1.6
则成功!!!!!!

以上是关于keepalived实现nginx的高可用的主要内容,如果未能解决你的问题,请参考以下文章

Centos7+Nginx+Keepalived实现Apache服务的高可用&负载均衡

Keepalived+Nginx+tomcat实现系统的高可用

02-keepalived实现对nginx服务的高可用(主备)

nginx实现请求的负载均衡 + keepalived实现nginx的高可用

如何实现Nginx+Keepalived中Nginx进程的高可用

Nginx+keepalived 实现Nginx的高可用