在上次文章中对于Nginx进行负载均衡操作,有效保障了客户端请求的合理分发到不同的应用层服务器进行处理。文章nginx反向代理实现应用层的高可用 有讲解。
但是,Nginx负载均衡器一旦宕机,这就玩不转了。一般应对这种情况,有冗余和自动故障转移。也即数据冗余或其他主机冗余和failover机制。
要做到这方面,需要另外一台相同配置的主机,这里相同配置是Nginx负载均衡配置相同,其他主机参数也可以相似。用什么实现failover呢,就是下面讲的keepalived。
keepalived实现原理是使用一个虚拟ip转发数据包给主机,master主机对外服务,一旦检测到master主机keepalived进程挂掉,backup服务器顶上。
网上有许多针对keepalived和nginx打造高可用集群的方法,讲解的很详细,这里呢不作介绍,主要我们用的基本是云主机了,阿里云、腾讯云等等,这章基本围绕云主机的配置。
在云主机配置高可用虚拟IP需要单独配置,每个云平台各不相同,文档都有介绍。这里以腾讯云为例。
在腾讯云申请使用高可用虚拟IP,如图:
操作步骤(复制官方操作文档)
- 登录 私有网络控制台,在左侧导航栏中,选择IP 与网卡 > 高可用虚拟 IP。
- 在 HAVIP 管理页面,选择所在地域,单击申请。
- 在弹出的申请高可用虚拟 IP 对话框中,配置 HAVIP 的参数。
- 单击确定,创建成功的 HAVIP 展示在列表中,状态为未绑定云服务器。
创建完成后会进入一个列表,里面有虚拟IP,注意这里申请的是内网虚拟IP。
这时候的状态是”没有绑定到云服务器“,此时需准备两台云主机,分别在每台主机上安装Nginx和keepalived应用。
keepalived配置如下:
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict #单播模式下需要关闭
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_nginx {
#检测Nginx是否存活脚本,需要自己编写
script "/etc/keepalived/check_nginx.sh"
interval 2
weight -5
}
vrrp_instance VI_1 {
state BACKUP #这里为备份服务器,主服务器写MASTER
interface eth0
virtual_router_id 51
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
#本机IP
unicast_src_ip 172.16.0.2
unicast_peer {
#填写对端内网IP
172.16.0.10
}
virtual_ipaddress {
#高可用虚拟IP,通过申请获得
172.16.0.13
}
#检测nginx是否运行脚本,对应上面的chk_nginx模块
track_script {
chk_nginx
}
}
在master主机上配置index.html访问内容为:
<!DOCTYPE>
<html>
<head>
<title>Welcome to CentOS</title>
</head>
<body>
<h1>master</h1>
</body>
</html>
备份主机nginx默认访问内容为:
<!DOCTYPE>
<html>
<head>
<title>Welcome to CentOS</title>
</head>
<body>
<h1>slave</h1>
</body>
</html>
启动Nginx和keepalived,通过虚拟IP访问,默认访问的到的是master主机,这时候将Nginx和keepalived停止,再次访问虚拟IP,访问内容为slave内容。
要让keepalived自动检测Nginx是否停止运行,需要配合检测脚本,也即chk_nginx模块内容,如下:
#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
/usr/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
killall keepalived
fi
fi
跟网上大多数内容一致,先检测Nginx进程是否存在,进程数为0时,尝试重启Nginx,再次检测判断是否有效,无效则停止keepalived进程,这个时候虚拟IP会转发请求到备份服务器了。
注意上面的虚拟的IP是内网虚拟IP,如果要保证外网能够使用,需要申请EIP的使用权限。可以查看官方文档申请。