7.Nginx keepalived部署高可用、原理

1、什么是nginx高可用

在这里插入图片描述

2、体系架构

  Keepalived是基于vrrp协议的一款高可用软件。Keepailived有一台主服务器和多台备份服务器,在主服务器和备份服务器上面部署相同的服务配置,使用一个虚拟IP地址对外提供服务,当主服务器出现故障时,虚拟IP地址会自动漂移到备份服务器。

  在Keepalived + Nginx高可用负载均衡架构中,keepalived负责实现High-availability (HA) 功能控制前端机VIP(虚拟网络地址),当有设备发生故障时,热备服务器可以瞬间将VIP自动切换过来,实际运行中体验只有2秒钟切换时间,DNS服务可以负责前端VIP的负载均衡。

  nginx负责控制后端web服务器的负载均衡,将客户端的请求按照一定的算法转发给后端Real Server处理,而Real Server将响应直接返回给客户端。

3、配置高可用的准备工作

  1、需要两台服务器192.168.3.3 和192.168.3.4

  2、在两台服务器安装nginx

  3、在两合服务器安装keepalived

4、keepalived主从配置、测试

  (1)修改(主)keepalived的配置文件keepalived.conf为:

global_defs {
        notification_email {
          acassen@firewall.loc
          failover@firewall.loc
          sysadmin@firewall.loc
        }
        notification_email_from Alexandre.Cassen@firewall.loc
        smtp_ server 192.168.3.3
        smtp_connect_timeout 30
        router_id LVS_DEVEL     # LVS_DEVEL这字段在/etc/hosts文件中看;通过它访问到主机
}

vrrp_script chk_http_ port {
        script "/etc/keepalived/nginx_check.sh"
        interval 2   # (检测脚本执行的间隔)2s
        weight 2  #权重,如果这个脚本检测为真,服务器权重+2
}

vrrp_instance VI_1 {
        state MASTER   # 备份服务器上将MASTER 改为BACKUP
        interface enp0s3  #  网卡名称
        virtual_router_id 51 # 主、备机的virtual_router_id必须相同
        priority 100   #主、备机取不同的优先级,主机值较大,备份机值较小
        advert_int 1    #每隔1s发送一次心跳
        authentication {        # 校验方式, 类型是密码,密码1111
        auth type PASS
        auth pass 1111
    }
        virtual_ipaddress { # 虛拟ip
                192.168.3.50 # VRRP H虛拟ip地址
        }
}

  (2)修改(从)keepalived的配置文件keepalived.conf为:

global_defs {
        notification_email {
          acassen@firewall.loc
          failover@firewall.loc
          sysadmin@firewall.loc
        }
        notification_email_from Alexandre.Cassen@firewall.loc
        smtp_ server 192.168.3.4
        smtp_connect_timeout 30
        router_id LVS_DEVEL     # LVS_DEVEL这字段在/etc/hosts文件中看;通过它访问到主机
}

vrrp_script chk_http_ port {
        script "/etc/keepalived/nginx_check.sh"
        interval 2   # (检测脚本执行的间隔)2s
        weight 2  #权重,如果这个脚本检测为真,服务器权重+2
}

vrrp_instance VI_1 {
        state BACKUP   # 备份服务器上将MASTER 改为BACKUP
        interface enp0s3  #  网卡名称
        virtual_router_id 51 # 主、备机的virtual_router_id必须相同
        priority 90   #主、备机取不同的优先级,主机值较大,备份机值较小
        advert_int 1    #每隔1s发送一次心跳
        authentication {        # 校验方式, 类型是密码,密码1111
        auth type PASS
        auth pass 1111
    }
        virtual_ipaddress { # 虛拟ip
                192.168.3.50 # VRRP H虛拟ip地址
        }
}

  (3)在两台(主从)的/etc/keepalived/下新建检测脚本 nginx_check.sh

  脚本说明:当nginx进程不存在时,会自动重启docker服务,docker服务启动时会自动启动nginx容器;再次检查nginx进程,如果不存在,就停止keepalived服务,然后NGINX_BACKUP主机会自动接替NGINX_MASTER的工作。

[root@localhost /]# cd etc/keepalived/
[root@localhost keepalived]# ls
keepalived.conf  nginx_check.sh
[root@localhost keepalived]# more nginx_check.sh 
#!/bin/bash
#version 0.0.1
#
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
     systemctl restart docker
      sleep 3
            if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
                  systemctl stop keepalived
fi 
fi

  (4) 把两台服务器上nginx和keepalived启动

   启动nginx并访问:http://192.168.3.3/,http://192.168.3.4/
在这里插入图片描述

$ systemctl start keepalived.service #keepalived启动
$ ps -ef I grep keepalived #查看keepalived是否启动
$ service keepalived status #查看状态
$ systemctl stop keepalived.service #keepalived关闭

   查看主keepalived状态,虚拟ip已绑定192.168.17.50

[root@localhost keepalived]# systemctl start keepalived.service
[root@localhost keepalived]# service keepalived status
Redirecting to /bin/systemctl status keepalived.service
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-11-16 08:13:01 EST; 15s ago
  Process: 2977 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 2978 (keepalived)
    Tasks: 3
   Memory: 1.4M
   CGroup: /system.slice/keepalived.service
           ├─2978 /usr/sbin/keepalived -D
           ├─2979 /usr/sbin/keepalived -D
           └─2980 /usr/sbin/keepalived -D

Nov 16 08:13:03 localhost.localdomain Keepalived_vrrp[2980]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:13:03 localhost.localdomain Keepalived_vrrp[2980]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:13:03 localhost.localdomain Keepalived_vrrp[2980]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:13:03 localhost.localdomain Keepalived_vrrp[2980]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:13:08 localhost.localdomain Keepalived_vrrp[2980]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:13:08 localhost.localdomain Keepalived_vrrp[2980]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on enp0s3 for 192.168.3.50
Nov 16 08:13:08 localhost.localdomain Keepalived_vrrp[2980]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:13:08 localhost.localdomain Keepalived_vrrp[2980]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:13:08 localhost.localdomain Keepalived_vrrp[2980]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:13:08 localhost.localdomain Keepalived_vrrp[2980]: Sending gratuitous ARP on enp0s3 for 192.168.3.50

   查看备用:backup却没有绑定

[root@localhost keepalived]# systemctl start keepalived.service
[root@localhost keepalived]# service keepalived status
Redirecting to /bin/systemctl status keepalived.service
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-11-16 08:15:17 EST; 11s ago
  Process: 2355 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 2356 (keepalived)
    Tasks: 3
   Memory: 1.4M
   CGroup: /system.slice/keepalived.service
           ├─2356 /usr/sbin/keepalived -D
           ├─2357 /usr/sbin/keepalived -D
           └─2358 /usr/sbin/keepalived -D

Nov 16 08:15:17 localhost.localdomain Keepalived_vrrp[2358]: Registering gratuitous ARP shared channel
Nov 16 08:15:17 localhost.localdomain Keepalived_vrrp[2358]: Opening file '/etc/keepalived/keepalived.conf'.
Nov 16 08:15:17 localhost.localdomain Keepalived_vrrp[2358]: Unknown keyword 'smtp_'
Nov 16 08:15:17 localhost.localdomain Keepalived_vrrp[2358]: WARNING - default user 'keepalived_script' for script execution does not exist - please create.
Nov 16 08:15:17 localhost.localdomain Keepalived_vrrp[2358]: Unknown keyword 'auth'
Nov 16 08:15:17 localhost.localdomain Keepalived_vrrp[2358]: Unknown keyword 'auth'
Nov 16 08:15:17 localhost.localdomain Keepalived_vrrp[2358]: VRRP_Instance(VI_1) removing protocol VIPs.
Nov 16 08:15:17 localhost.localdomain Keepalived_vrrp[2358]: Using LinkWatch kernel netlink reflector...
Nov 16 08:15:17 localhost.localdomain Keepalived_vrrp[2358]: VRRP_Instance(VI_1) Entering BACKUP STATE
Nov 16 08:15:17 localhost.localdomain Keepalived_vrrp[2358]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
Hint: Some lines were ellipsized, use -l to show in full.

   通过浏览器访问测试:http://192.168.3.50/可正常访问网站
在这里插入图片描述
  (5) 最终测试

  把主服务器(192.168.3.3) nginx和keealived停止

[root@localhost keepalived]# systemctl stop keepalived.service
[root@localhost keepalived]#  service keepalived status 
Redirecting to /bin/systemctl status keepalived.service
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

Nov 16 08:13:08 localhost.localdomain Keepalived_vrrp[2980]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on enp0s3 for 192.168.3.50
Nov 16 08:13:08 localhost.localdomain Keepalived_vrrp[2980]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:13:08 localhost.localdomain Keepalived_vrrp[2980]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:13:08 localhost.localdomain Keepalived_vrrp[2980]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:13:08 localhost.localdomain Keepalived_vrrp[2980]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:21:13 localhost.localdomain Keepalived[2978]: Stopping
Nov 16 08:21:13 localhost.localdomain systemd[1]: Stopping LVS and VRRP High Availability Monitor...
Nov 16 08:21:13 localhost.localdomain Keepalived_vrrp[2980]: VRRP_Instance(VI_1) sent 0 priority
Nov 16 08:21:13 localhost.localdomain Keepalived_vrrp[2980]: VRRP_Instance(VI_1) removing protocol VIPs.
Nov 16 08:21:14 localhost.localdomain systemd[1]: Stopped LVS and VRRP High Availability Monitor.
[root@localhost keepalived]# docker stop 802047bd7530
802047bd7530
[root@localhost keepalived]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost keepalived]# 

  查看从服务器(192.168.3.4)的keealived状态,已成功绑定虚拟ip

[root@localhost keepalived]# service keepalived status
Redirecting to /bin/systemctl status keepalived.service
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-11-16 08:15:17 EST; 10min ago
  Process: 2355 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 2356 (keepalived)
    Tasks: 3
   Memory: 1.4M
   CGroup: /system.slice/keepalived.service
           ├─2356 /usr/sbin/keepalived -D
           ├─2357 /usr/sbin/keepalived -D
           └─2358 /usr/sbin/keepalived -D

Nov 16 08:21:15 localhost.localdomain Keepalived_vrrp[2358]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:21:15 localhost.localdomain Keepalived_vrrp[2358]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:21:15 localhost.localdomain Keepalived_vrrp[2358]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:21:15 localhost.localdomain Keepalived_vrrp[2358]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:21:20 localhost.localdomain Keepalived_vrrp[2358]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:21:20 localhost.localdomain Keepalived_vrrp[2358]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on enp0s3 for 192.168.3.50
Nov 16 08:21:20 localhost.localdomain Keepalived_vrrp[2358]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:21:20 localhost.localdomain Keepalived_vrrp[2358]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:21:20 localhost.localdomain Keepalived_vrrp[2358]: Sending gratuitous ARP on enp0s3 for 192.168.3.50
Nov 16 08:21:20 localhost.localdomain Keepalived_vrrp[2358]: Sending gratuitous ARP on enp0s3 for 192.168.3.50

  再输入http://192.168.3.50/访问,发现从服务器成功接替主服务器的工作
在这里插入图片描述

5、Nginx & keepalived高可用原理

  两台服务器均通过keepalived软件把enp0s3网卡绑上一个虚拟IP(VIP)地址192.168.2.242,此VIP当前由谁承载着服务就绑定在谁的enp0s3上,当NGINX_MASTER发生故障时,NGINX_BACKUP会通过/etc/keepalived/keepalived.conf文件中设置的心跳时间advert_int 1检查,无法获取NGINX_MASTER正常状态的话,NGINX_BACKUP会瞬间绑定VIP来接替nginx_master的工作,当NGINX_MASTER恢复后keepalived会通过priority参数判断优先权将虚拟VIP地址192.168.2.242重新绑定给NGINX_MASTER的ens32网卡。

使用此方案的优越性:

  1.实现了可弹性化的架构,在压力增大的时候可以临时添加web服务器添加到这个架构里面去;

  2.upstream具有负载均衡能力,可以自动判断后端的机器,并且自动踢出不能正常提供服务的机器;

  3.相对于lvs而言,正则分发和重定向更为灵活。而Keepalvied可保证单个nginx负载均衡器的有效性,避免单点故障;

  4.用nginx做负载均衡,无需对后端的机器做任何改动。

  5.nginx部署在docker容器里,即大量地节约开发、测试、部署的时间,又可以在出现故障时通过镜像快速恢复业务。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值