介绍
什么是负载均衡高可用
Nginx 作为负载均衡器,所有请求都到了 Nginx(对外服务的唯一入口,唯一公网 IP),可见 Nginx 处于非常重点的位置,如果 Nginx 服务器宕机后端 web 服务将无法提供服务,影响严重。
为了屏蔽负载均衡服务器的宕机,需要建立一个备份机。主服务器和备份机上都运行高可用(High Availability)监控程序,通过传送诸如“I am alive”这样的信息来监控对方的运行状况。当备份机不能在一定的时间内收到这样的信息时,它就接管主服务器的服务 IP 并继续提供负载均衡服务;当备份管理器又从主管理器收到“I am alive”这样的信息时,它就释放服务IP地址,这样的主服务器就开始再次提供负载均衡服务。
什么是Keepalived
Keepalived 是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。Keepalived 的作用是检测 web 服务器的状态(健康监测),如果有一台 web 服务器死机,或工作出现故障,Keepalived 将检测到,并将有故障的 web 服务器从系统中剔除,当 web 服务器工作正常后 Keepalived 自动将 web 服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
Keepalived+Nginx实现主备
通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务。当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短。
该方案实际上就是暴露同一个虚拟 IP(上图的 VIP) 绑定到主备多台 Nginx 服务器上,默认情况下访问虚拟 IP 则直接访问到主服务器,如果主服务器出现故障,虚拟 IP 则绑定到从服务器,由于用户实际访问的是虚拟 IP,所以切换的过程对用户透明。
实例
准备工作
- 准备两台服务器;
- 在这两台服务器上安装上 Nginx;
- 在这两台服务器上安装上 Keepalived;
Keepalived的安装
这里我们直接使用 yum 来安装 Keepalived,执行下面命令即可:
yum -y install keepalived
使用 rpm
查看是否安装成功:
rpm -q -a keepalived
安装完成后,会生成 Keepalived 的配置文件 /etc/keepalived/keepalived.conf
。
配置
修改主、备机上的 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_script chk_http_port {
# 检测脚本路径
script "/usr/local/src/nginx_check.sh"
# 检测脚本的执行间隔
interval 2
weight 2
}
vrrp_instance VI_1 {
# 备份服务器上时将 MASTER 改为 BACKUP
state MASTER
# 网卡
interface eth0
# 主、备机的 virtual_router_id 必须相同
virtual_router_id 51
# 主、备机取不同的优先级,主机值较大,备份机值较小
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
# VRRP 虚拟 IP 地址,暴露给客户端的 IP
192.168.202.16
}
编写脚本 /usr/local/src/nginx_check.sh
(即上一步配置中的检测脚本路径)存放到主备服务器:
#!/bin/bash
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
killall keepalived
fi
fi
脚本内容很简单,每 2 秒检测一次 Nginx,当 Nginx 挂掉时,开启一个 Nginx 进程,如果开启失败,则干掉 Keepalived 进程。
启动测试
在主备机上分别执行下面命令启动 Nginx 和 Keepalived:
/usr/local/nginx/sbin/nginx
service keepalived start
CentOS 7 启动 Keepalived 时使用
systemctl start keepalived.service
。
接下来访问 Keepalived 中配置的虚拟 IP 192.168.202.16
:
可以看到,成功访问到 Nginx,为测试主备功能,现在我们停止主机上的 Nginx 和 Keepalived 服务后再次访问,会发现依旧访问成功,此时访问的就是备份主机了。
之所以要停止 Keepalived 服务是因为在 Keepalived 中配置了每两秒执行检测脚本,检测脚本如果发现 Nginx 挂掉了又会把该主机上的 Nginx 重新启动起来。
评论区