Nginx(6)之配置Nginx高可用集群

Nginx(6)之配置Nginx高可用集群

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

介绍

什么是负载均衡高可用

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实现主备

通常说的双机热备是指两台机器都在运行,但并不是两台机器都同时在提供服务。当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,而且切换的时间非常短。

image.png

该方案实际上就是暴露同一个虚拟 IP(上图的 VIP) 绑定到主备多台 Nginx 服务器上,默认情况下访问虚拟 IP 则直接访问到主服务器,如果主服务器出现故障,虚拟 IP 则绑定到从服务器,由于用户实际访问的是虚拟 IP,所以切换的过程对用户透明。

实例

准备工作

  1. 准备两台服务器;
  2. 在这两台服务器上安装上 Nginx;
  3. 在这两台服务器上安装上 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

image.png

可以看到,成功访问到 Nginx,为测试主备功能,现在我们停止主机上的 Nginx 和 Keepalived 服务后再次访问,会发现依旧访问成功,此时访问的就是备份主机了。

之所以要停止 Keepalived 服务是因为在 Keepalived 中配置了每两秒执行检测脚本,检测脚本如果发现 Nginx 挂掉了又会把该主机上的 Nginx 重新启动起来。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/nginx6.html

Buy me a cup of coffee ☕.