Nginx 配置高可用的集群

本文最后更新于:2 年前

本文部分内容参考了架构文摘的博客【 传送门】

关于高可用

高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。如果一个系统能够一直提供服务,那么这个可用性则是百分之百,但是天有不测风云。所以我们只能尽可能的去减少服务的故障。

解决的问题

在生产环境上很多时候是以 Nginx 做反向代理对外提供服务,但是一天 Nginx 难免遇见故障,如:服务器宕机。当 Nginx 宕机那么所有对外提供的接口都将导致无法访问。

服务器宕机后请求无法实现

虽然我们无法保证服务器百分之百可用,但是也得想办法避免这种悲剧,今天我们使用 keepalived 来实现 Nginx 的高可用。

双机热备方案

这种方案是国内企业中最为普遍的一种高可用方案,双机热备其实就是指一台服务器在提供服务,另一台为某服务的备用状态,当一台服务器不可用另外一台就会顶替上去。

  • 需要两台 nginx 服务器
  • 需要 keepalived
  • 需要虚拟 ip

使用keepalived实现Nginx的高可用

keepalived是什么?

Keepalived 软件起初是专为 LVS 负载均衡软件设计的,用来管理并监控 LVS 集群系统中各个服务节点的状态,后来又加入了可以实现高可用的 VRRP (Virtual Router Redundancy Protocol ,虚拟路由器冗余协议)功能。因此, Keepalived 除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。

故障转移机制

Keepalived 高可用服务之间的故障切换转移,是通过 VRRP 来实现的。在 Keepalived 服务正常工作时,主 Master 节点会不断地向备节点发送(多播的方式)心跳消息,用以告诉备 Backup 节点自己还活着,当主 Master 节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主 Master 节点的心跳了,于是调用自身的接管程序,接管主 Master 节点的 IP 资源及服务。而当主 Master 节点恢复时,备 Backup 节点又会释放主节点故障时自身接管的 IP 资源及服务,恢复到原来的备用角色。

具体配置

准备工作

  1. 需要两台服务器 192.168.17.129 和 192.168.17.131

  2. 在两台服务器安装 nginx

  3. 在两台服务器安装 keepalived

    1
    yum install keepalived –y

    安装之后,在 etc 里面会生成目录 keepalived,有配置文件 keepalived.conf。

具体配置

对两台服务器做如下配置。

  1. 修改 /etc/keepalived/keepalivec.conf 配置文件:

    1
    vim /etc/keepalived/keepalivec.conf
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    global_defs {
    notification_email {
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
    }
    notification_email_from Alexandre.Cassen@firewall.loc
    smtp_server 192.168.17.129
    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 {
    state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
    interface ens33 //网卡
    virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
    priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress {
    192.168.17.50 // VRRP H 虚拟地址
    }
    }
  2. 在 /usr/local/src 目录中添加检测脚本 nginx_check.sh

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/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

最终测试

  1. 把两台服务器上 nginx 和 keepalived 启动最终测试

    1
    2
    /usr/local/nginx/sbin/nginx
    systemctl start keepalived.service
  2. 在浏览器地址栏输入 虚拟 ip 地址 192.168.17.50 访问

  3. 把主服务器(192.168.17.129)nginx 和 keepalived 停止,再输入 192.168.17.50

此时依然可以访问到 Nginx 服务器首页,说明我们的高可用配置成功。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!