Nginx配置实例—nginx+keepalived实现主备服务器的高可用集群

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两台服务器上安装nginxkeepalived

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
或者可以使用命令:`ps -ef|grep 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 配置成功

留言区

还能输入500个字符