VIP + keepalived 实现 nginx 的主从热备

使用 keepalived配置虚拟ip(VIP):https://blog.csdn.net/Jason160918/article/details/100101791

Nginx主从热备参考:https://www.cnblogs.com/youzhibing/p/7327342.html

 

前言

使用集群是网站解决高并发、海量数据问题的常用手段。当一台服务器的处理能力、存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求。这种情况下,更恰当的做法是增加一台服务器分担原有服务器的访问及存储压力。通过负载均衡调度服务器,将来自浏览器的访问请求分发到应用服务器集群中的任何一台服务器上,如果有更多的用户,就在集群中加入更多的应用服务器,使应用服务器的负载压力不再成为整个网站的瓶颈。我们使用应用服务器集群来保证服务的高可用,Nginx作为负载均衡的中间件,但如果nginx服务宕机,应用集群将不可用。所以我们如何保证Nginx服务的高可用呢?今天我们来探讨一下keepalived实现Nginx的主从热备。

 

应用场景的思考

今天和运维同事讨论了一下生产环境的nginx实践。生产应用服务用的F5 + 2台相同配置的Nginx集群做的负载均衡和反向代理。那既然F5已经实现了负载均衡,为什么还有必要再加一层的Nginx呢。我们在什么时候需要用Nginx集群,什么时候该用主从热备呢?以下是基于我的一些思考:

  1. 我们常理解的Nginx首先是Web服务器,同时也做负载均衡和反向代理。但Nginx的功能不止于此,还能够实现白名单、黑名单、限流、灰度发布。结合lua脚本能实现很多扩展,所以这也是在F5后加Nginx集群的原因。
  2. 如果有硬件负载,我们后面可以搭配Nginx集群。但如果是中小型企业网站或应用,只使用软负载架构,可能只有Nginx做负载和反向代理时。Nginx集群不好实现但又要保证Nginx服务高可用(HA)的情况下。那主从热备还是有使用场景的。当然这时会有备用机的资源闲置。

 

1. 环境准备

如果你本地有两台虚拟机了。可以跳过安装步骤。

 

安装虚拟机:

  1. 使用 virtualBox 安装了2台 centos7 环境的虚拟机。安装步骤完全参考:https://www.jianshu.com/p/18207167b1e7
  2. 步骤1安装完成,登录centos7
  3. 完全退出虚拟机。重新设置 -> 网络,配置NAT(网卡1)+ Host-Only(网卡2)两种网络模式。NAT网卡保证虚拟机能联网,Host-Only保证虚拟机能和主机联通。(注意:设置网卡2 Host-Only需要在虚拟机完全安装完成后再设置,而不能在安装centos7过程中设置。这样会使得网卡2没有ip地址,这是实际踩坑发现的
  4. 设置完成网络后。再次启动centos7。

 

安装 ifconfig

$ yum install -y net-tools

查看【虚拟机1】的ifconfig:

VIP + keepalived 实现 nginx 的主从热备_第1张图片

查看【虚拟机2】的ifconfig:

VIP + keepalived 实现 nginx 的主从热备_第2张图片

可以看到,两台虚拟机在网卡2(enp0s8),Host-Only模式下,其ip地址和主机已经是在同一网段,可以通信了。

 

安装keepalived

$ yum install -y keepalived

 

部署应用服务

我们还需要在虚拟机安装jdk,在104和 102 分别启动1个web服务。

VIP + keepalived 实现 nginx 的主从热备_第3张图片

VIP + keepalived 实现 nginx 的主从热备_第4张图片

 

安装nginx

  1. 192.168.56.104 - nginx主
  2. 192.168.56.102 - nginx备
# 这是下载包的地址,具体安装教程网上有很多,我就不罗列了
$ wget http://nginx.org/download/nginx-1.6.2.tar.gz

分别添加如下配置到nginx.conf

VIP + keepalived 实现 nginx 的主从热备_第5张图片

验证nginx负载均衡

nginx1 (192.168.56.104)

VIP + keepalived 实现 nginx 的主从热备_第6张图片

VIP + keepalived 实现 nginx 的主从热备_第7张图片

nginx2 (192.168.56.102)

VIP + keepalived 实现 nginx 的主从热备_第8张图片

VIP + keepalived 实现 nginx 的主从热备_第9张图片

验证完成,现在两台Nginx都已经完成了负载均衡。我们继续~

 

预期效果1

我们理论上应该有4台服务器,分别用来部署nginx1、nginx2 和 web1、web2。但我只有2台。我在这两台虚拟机(192.168.56.104、192.168.56.102)分别部署一个Nginx和一个web服务。

正常情况下是nginx1作为负载均衡,分别向web1,web2分发请求。如果nginx1所在服务器宕机 或者 keepalavid 挂掉或者 keepalived 不能把Nginx服务重新唤起,那nginx2将取代nginx1,继续保证服务可用。直到nginx1恢复。

192.168.56.104 # nginx1(主) + web1

192.168.56.102 # nginx2(备) + web2

 

2. keepalived+vip,搭建主从热备Nginx服务。实现高可用(HA)

  keepalived的安装本文就不讲述了,具体可参考:主从热备+负载均衡(LVS + keepalived)

  keepalived作用其实在第一张图中已经有所体现,主要起到两个作用:实现VIP到本地ip的映射; 以及检测nginx状态。

 

实验主从热备。

  master(虚拟机1,192.168.56.104)上的keepalived.conf内容如下:

$ vim /etc/keepalived/keepalived.conf
global_defs {
    script_user root    # 这两行很重要。否则执行不到检测脚本
    enable_script_security
    notification_email {
        [email protected]
    }
    notification_email_from [email protected]
    smtp_server smtp.hysec.com
    smtp_connection_timeout 30
    router_id nginx_master        # 设置nginx master的id,在一个网络应该是唯一的
}
vrrp_script chk_http_port {
    script "/usr/local/src/check_nginx_pid.sh"    #最后手动执行下此脚本,以确保此脚本能够正常执行
    interval 2                    #(检测脚本执行的间隔,单位是秒)
    weight 2
}
vrrp_instance VI_1 {
    state MASTER            # 指定keepalived的角色,MASTER为主,BACKUP为备
    interface enp0s8        # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
    virtual_router_id 66    # 虚拟路由编号,主从要一致
    priority 100            # 优先级,数值越大,获取处理请求的优先级越高
    advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_http_port             #(调用检测脚本)
    }
    virtual_ipaddress {
        192.168.56.200            # 定义虚拟ip(VIP),与我主机及虚拟机在同一网段。可多设,每行一个
    }
}

  backup(虚拟机2,192.168.56.102)上的keepalived.conf内容如下:

$ vim /etc/keepalived/keepalived.conf
global_defs {
    script_user root    # 这两行很重要。否则执行不到检测脚本
    enable_script_security
    notification_email {
        [email protected]
    }
    notification_email_from [email protected]
    smtp_server smtp.hysec.com
    smtp_connection_timeout 30
    router_id nginx_backup              # 设置nginx backup的id,在一个网络应该是唯一的
}
vrrp_script chk_http_port {
    script "/usr/local/src/check_nginx_pid.sh"
    interval 2                          #(检测脚本执行的间隔)
    weight 2
}
vrrp_instance VI_1 {
    state BACKUP                        # 指定keepalived的角色,MASTER为主,BACKUP为备
    interface enp0s8                    # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
    virtual_router_id 66                # 虚拟路由编号,主从要一直
    priority 99                         # 优先级,数值越大,获取处理请求的优先级越高
    advert_int 1                        # 检查间隔,默认为1s(vrrp组播周期秒数)
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_http_port                   #(调用检测脚本)
    }
    virtual_ipaddress {
        192.168.56.200                   # 定义虚拟ip(VIP),与我主机及虚拟机在同一网段。可多设,每行一个
    }
}

  nginx检测脚本 /usr/local/src/check_nginx_pid.sh 内容如下:

#!/bin/bash
A=`ps -C nginx --no-header |wc -l`        
if [ $A -eq 0 ];then                            
    /usr/local/nginx/sbin/nginx                #重启nginx
    sleep 2
    if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then    #nginx重启失败
        systemctl stop keepalived.service        #重启失败就杀掉keepalived服务。
    else
        exit 0
    fi
else
    exit 0
fi

  keepalived 配置 Nginx 检测脚本的意义:

  1. keepalived 主备原理是备机根据监测主机 keepalived 服务的状态来判断服务器的运行状态。如果 keepalived 挂掉。则认为主服务器已经宕机,执行主备切换
  2. 但如果是Nginx进程挂掉。keepalived是不会做主备切换的。
  3. 为了能保证nginx的持续可用。keepalived会定时检测 Nginx的执行状态。当判断其挂掉时,先尝试重启。如果重启失败,执行命令杀掉 keepalived 服务。启动主备切换。

 

  添加执行权限

$ chmod +x check_nginx_pid.sh

  启动keepalived

$ systemctl start keepalived.service        # 启动keepalived服务

$ systemctl enable keepalived.service       # 设置开机启动

  查看keepalived启动后。配置的虚拟ip(virtual ip)是否生效

# 着重说明一下:
1. 这个enp0s8是虚拟机查看 ifconfig 时显示的网卡。
2. 在这个网卡下虚拟机的ipv4地址分别是:192.168.56.102, 192.168.56.104。
3. 这两个ip网段和主机在同一网段,可以通信。
4. 浮动ip(即vip),就是在这个网卡下给虚拟机ip绑定一个别名ip。我设为192.168.56.200

$ ip addr show enp0s8

  虚拟机1(192.168.56.102)作为主,我们查看一下其网卡信息,发现我们设置的 vip=192.168.56.200 已经绑定到了该机器。说明 keepalived 设置的vip确实生效了。

VIP + keepalived 实现 nginx 的主从热备_第10张图片

  虚拟机1(192.168.56.102)作为备,我们查看一下备份机上的 enp0s8 网卡的信息,因为 vip 已经被虚机1 绑定占用。所以我们看不到其绑定的 vip 信息。

VIP + keepalived 实现 nginx 的主从热备_第11张图片

关于Vip总结

vip(virtual ip),又称为虚拟ip、浮动ip。vip在一个网卡里,只有分配给一台主机。当有2台或多台服务器配置了vip后。会将此vip地址分配给已存活的优先级最高的服务器。此时这台服务器,用其本机ip或者vip都能访问,也可以理解成vip是其ip的又一别名。当这台服务器宕机或其keeplived服务挂掉。vip会继续向次优先级分配,但当更高优先级的服务器恢复keepalived服务时,vip会还回去。vip在这些服务器之间来回浮动,所以又被称为浮动ip。

 

查看效果

  访问VIP,效果如下:

VIP + keepalived 实现 nginx 的主从热备_第12张图片

VIP + keepalived 实现 nginx 的主从热备_第13张图片

 

验证 vip 的主从热备生效

1. 虚拟机1 (192.168.56.104)作为 keepalived master 服务,我们停止该 keepalived 服务,并查看日志

$ systemctl stop keepalived.service    # 关闭keepalived服务

$ tail -f /var/log/messages    # 查看keepalived日志

VIP + keepalived 实现 nginx 的主从热备_第14张图片

2. 监控虚拟机2(192.168.56.102)的keepalived日志,并分析

VIP + keepalived 实现 nginx 的主从热备_第15张图片

3. 继续访问该服务。验证 vip 生效后,热备机上的nginx 继续生效并提供服务

由此可以得出结论:keepalived已经生效,并在主机 keepalived 服务挂掉的情况下。vip浮动到了备机上。

 

4. 监控主备机的 nginx 日志,来继续验证是备机的Nginx生效

$ cd /usr/local/nginx/logs    # nginx日志目录

$ tail -f access.log          # 监控运行日志

我看到备机上的nginx日志每次访问都有日志输出。主机上的Nginx 日志并无继续输出。

VIP + keepalived 实现 nginx 的主从热备_第16张图片

由此确认是备机的Nginx 在提供服务。

 

5. 当我们恢复主机的 keepalived 服务。会发现vip继续浮动到主机。由主机继续来主持Nginx工作。

tail -f /var/log/messages

VIP + keepalived 实现 nginx 的主从热备_第17张图片

查看主机Nginx日志。再次请求服务的日志又输出出来了。

 

3. 验证 Keepalived 实现本机 Nginx 的高可用

现在我的虚拟机2(192.168.56.102)已经替代虚机1 成为 keepalived master 主机。我在此基础上,将该机器上的nginx 服务停止。验证 keepalived 会监控 nginx 状态并自动启动。开始吧:

3.1 停止 nginx服务

$ ./nginx -s stop

停止nginx服务后。我这里访问服务还是正常。

 

 

总结

  1. 当主机宕机或主机的keepalived服务挂掉,备机都能正常接管。验证没问题。
  2. 当主机的nginx停掉后,预期应该是 keepalived 能重新拉起这个服务。但刚才从 keepalived 和 nginx的日志看,主机keepalived并没有能拉起nginx,导致主机的keepalived 服务被停止,直接由备机接管了。这里还需要完善,应该是 keepalived 配置或者检测脚本里的问题。

 

 

 

你可能感兴趣的:(软件安装,keepalived,nginx主从热备)