1、什么是负载均衡高可用?
nginx作为负载均衡服务器,所有请求都到了nginx,可见nginx处于非常重要的位置,如果nginx服务器宕机将会导致后端web服务将无法提供,后果严重。 为了屏蔽负载均衡服务器的宕机,需要建立一个备份机。主服务器和备份机上都运行高可用(High Availablitity)监控程序,通过传送诸如“I am alive”这样的信息来监控对方的运行状况,当备份机不能再一定时间内收到这样的信息,它就接管主服务器的服务ip并继续提供负载均衡服务;当备份管理器又从主管服务器收到“I am alive”这样的信息时,它就释放服务ip地址,这样的主服务器就开始再次提供负载均衡服务。
2、Nginx+Keepalived实现主备
2.1 什么是keepalived?
(1)keepalived是进群工作管理中保证集群高可用的一个服务软件,用来防止单点故障。 (2)keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
2.2 keepalived的工作原理
keepalived是以vrrp协议为实现基础的,vrrp全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。 虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(VIP=virtual IP Address,即虚拟ip地址,该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。 keepalived主要有三个模块,分别是core、check、VRRP。core模块为keepalived的核心,负载进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。VRRP模块是来实现VRRP协议的。
3、配置Nginx高可用集群

图 nginx高可用架构示意图
我的实验环境:
1).两台nginx,一主一备分别在独立的Linux系统上运行,ip分别是:192.168.92.128和192.168.92.134 2).分别在192.168.92.128 和192.168.92.134两台服务器上安装
nginx
和keepalived
3.1 安装nginx
nginx的安装请参考Nginx快速入门—基本概念以及在Linux上安装Nginx
这里为了体现效果,我把nginx的默认index.html页面修改一下

图 3.1.1 master nginx的修改

图 3.1.2 backup nginx的修改
3.2 安装和配置keepalived
直接输入下面的命令安装keepalived:
#yum安装keepalived
yum -y intsall keepalived
#设置开机自动启动keepalived(可选)
chkconfig keepalived on
安装完成后会在/etc下生成一个配置文件,它的绝对路径是/etc/keepalived/keepalived.conf
,它就是用来配置nginx主备关系的配置文件。
主nginx的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 193.168.92.128
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #检测脚本的绝对路径
interval 2 #每2秒检测一次nginx的运行状态
weight -20 #失败一次,将自己的优先级-20
}
vrrp_instance VI_1 {
state BACKUP # 状态,主节点为MASTER,备份节点为BACKUP
interface ens33 # 绑定网卡,通过ifconfig查看自己的网卡
virtual_router_id 51 # 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,相同的VRID为一个组,他将决定多播的MAC地址
priority 50 # 节点优先级,值范围0~254,MASTER要比BACKUP高
advert_int 1 # 组播信息发送时间间隔,两个节点必须设置一样,默认为1秒
mcast_src_ip 192.168.92.128 #本机的ip,需要修改
# 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP,两个节点设置必须一样。可以设置多个,一行写一个
virtual_ipaddress {
192.168.92.150
}
track_script {
chk_nginx # nginx存活状态检测脚本
}
}
......
备份nginx的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 193.168.92.134
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" #检测脚本的绝对路径
interval 2 #每2秒检测一次nginx的运行状态
weight -20 #失败一次,将自己的优先级-20
}
vrrp_instance VI_1 {
state BACKUP # 状态,主节点为MASTER,备份节点为BACKUP
interface ens33 # 绑定网卡,通过ifconfig查看自己的网卡
virtual_router_id 51 # 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,相同的VRID为一个组,他将决定多播的MAC地址
priority 50 # 节点优先级,值范围0~254,MASTER要比BACKUP高
advert_int 1 # 组播信息发送时间间隔,两个节点必须设置一样,默认为1秒
mcast_src_ip 192.168.92.134 #本机的ip,需要修改
# 设置验证信息,两个节点必须一致
authentication {
auth_type PASS
#密码相同的为一个集群
auth_pass 1111
}
# 虚拟IP,两个节点设置必须一样。可以设置多个,一行写一个
virtual_ipaddress {
192.168.92.150
}
track_script {
chk_nginx # nginx存活状态检测脚本
}
}
......
之后在/etc/keepalived目录下新建检测脚本,内容如下:
#!/bin/bash
COUNT=$(ps -C nginx --no-header |wc -l)
echo $COUNT
#判断Nginx 是否都挂掉了
if [ $COUNT -eq 0 ]
then
#如果挂掉了,就启动nginx
/usr/local/nginx/sbin/nginx
echo "restart nginx"
#等5秒钟后,再次查看是否 启动成功
sleep 5
#如果nginx没有启动起来,就直接干掉keepalived
COUNT=$(ps -C nginx --no-header |wc -l)
if [ $COUNT -eq 0 ]
then
echo "shudonw keepalived"
#如果killall命令不能使用,就需要安装psmisc工具了
#yum install -y psmisc
killall keepalived
fi
fi
之后给脚本权限:
chmod +x /etc/keepalived/nginx_check.sh
keepalived的相关命令
keepalived的启动、重启、和停止命令: 1. systemctl start keepalived.service #启动keepalived 2. systemctl restart keepalived.service #重启keepalived 3. systemctl stop keepalived.service #停止keepalived
启动后可以使用:systemctl status keepalived.service
查看keepalived的状态,如果发现异常及时修改直到正常启动,正常运行截图:

图 3.2.1 正常启动keepalived
两边的nginx和keepliaved都启动后,在浏览器中输入我们刚才配置的虚拟ip,不出意外应该走的是主 nginx,如下图:

图3.2.2 配置成功
4、测试故障转移
4.1 主服务器正常提供服务
初始时候,nginx主服务器正常,将vip绑定到自身,对外提供服务,从服务器始终与主服务器保持通信,监测主服务器的健康状态。

图 4.1 主服务器正常服务
4.2 主服务器宕机,备份服务器接替主服务器的工作
当nginx主服务器宕机或发生异常,总之以任何理由造成服务器上的健康监测程序发生异常,无法和从服务器上的健康监测程序通信,此时从服务器上的健康监测机制就会认为主服务器挂了,从而将vip绑定到自身,成功上位,充当主服务器的角色。

图 4.2.1 主服务器宕机后
验证: 关闭主服务器(192.168.92.128)上的nginx:/usr/local/nginx/sbin/nginx -s quit
,之后在浏览器地址栏中输入vip:192.168.92.150

图 4.2.1 切换到备用服务器(192.168.92.134)
4.3 “一山不容二虎”:主服务器恢复后,备份服务器主动让位
在keepalive机制中,主服务器终究是主服务器,一旦主服务器恢复,边从新绑定vip,继续充当主服务器,而从服务器又成为了热备。

图 4.3 主服务器恢复
验证: 重启主服务器(192.168.92.128)和主服务器的keepalived,再次输入192.168.92.150,主服务器恢复服务:

图3.2.2 配置成功