• Nginx+Keepalived实现简单的服务高可用


    Nginx+Keepalived实现简单的服务高可用

    一般情况下,如果我们做小型项目,前端用一个nginx做反向代理即可,大概是这样的

     
    image.png

    但是,作为互联网项目,纯2C的话必然需要做高可用,不仅后端的Server有N个,Nginx同样需要有N个,一主N备,当有一个服务器挂掉的时候,服务能瞬间切换到其他服务器,大概是这样的

     
    image.png

    下面就以上图为例,说明一下如何实现server的高可用。

    1、准备

    虚拟机两台,同样安装nginx,keepalived,最简单的安装方法yum -y install nginx,yum -y install keepalived。如果找不到安装到哪儿了,可以使用whereis nginx查看,这里不再赘述。
    网络划分如下

    名称IP虚拟IP操作系统
    虚拟机1(VM1) 192.168.136.2 192.168.136.99 centos7.6
    虚拟机2(VM2) 192.168.136.4 192.168.136.99 centos7.6

    2、关闭防火墙,修改nginx首页,启动nginx

    • 关闭防火墙
    systemctl stop firewalld.service #临时关闭,重启失效
    systemctl disable firewalld.service  #禁止开机启动
    
    • 简单起见,我们认为每个nginx都是代理一个服务,只用nginx默认带的静态页作为测试,分别修改页面内容为"Welcome to 192.168.136.4"和“Welcome to 192.168.136.2”
    • 启动nginx
    systemctl start nginx
    

    3、修改keepalived的配置文件

    主配置如下(默认配置文件:/etc/keepalived/keepalived.conf):

    ! 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_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
            weight -20
    }
    vrrp_instance VI_1 {
        state MASTER # 标识为主服务
        interface ens33 #绑定虚拟机的IP
        virtual_router_id 51 # 虚拟路由id,和从机保持一致
        #mcast_src_ip 192.168.126.2  #本机ip
        priority 100 #权重,需要高于从机
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
       track_script {
                    chk_nginx ## 执行 Nginx 监控的服务
            }
        virtual_ipaddress {
            192.168.136.99 #/32 brd 255.255.255.0 dev ens33 label ens33:vip #虚拟IP地址
    #        192.168.200.17
    #        192.168.200.18
        }
    }
    

    从机配置(默认配置文件:/etc/keepalived/keepalived.conf)

    ! 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 dreamer1
    #   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" ## 检测 nginx 状态的脚本路径
            interval 2 ## 检测时间间隔
            weight -20 ## 如果条件成立,权重-20
    }
    
    vrrp_instance VI_1 {
        state BACKUP
        interface ens33
        virtual_router_id 51
        #mcast_src_ip 192.168.136.4 ## 本机 IP 地址 
        priority 90
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
            track_script {
                    chk_nginx ## 执行 Nginx 监控的服务
            }
        virtual_ipaddress {
            192.168.136.99
            #192.168.200.17
            #192.168.200.18
        }
    }
    
    

    3、编写监测心跳脚本

    上面配置中可以看到有一个脚本文件:/etc/keepalived/nginx_check.sh
    查看nginx是否启动,如果没启动则启动,如果启动不起来,停掉keepalived服务,此时心跳断掉,服务转向另一个nginx。

    #!/bin/bash
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
        /usr/sbin/nginx
        sleep 2
        counter=$(ps -C nginx --no-heading|wc -l)
        if [ "${counter}" = "0" ]; then
            /etc/init.d/keepalived stop
        fi
    fi
    
    

    4、测试

    • 启动192.168.136.2上的nginx和keepalive
    • 启动192.168.136.4上的nginx和keepalive
    • 访问虚拟IP:http://192.168.136.99


       
      image.png
    • 停掉192.168.136.2上的keepalive


       
      image.png
    • 重新启动192.168.136.2上的keepalive,又会回到 Welcome to 192.168.136.2
    • 停掉192.168.136.2上的nginx,系统会自动调回Welcome to 192.168.136.4


       
      image.png

    就是这样。

  • 相关阅读:
    [转]面向对象的三个基本特征
    C#验证Email
    天气预报
    【原】c#实现数字金额转换成大写金额
    C#发送Email
    DIV 显示最上层
    ArrayList 与 String[] 之间的转换
    Flex与.NET互操作(五):FileReference+HttpHandler实现上传/下载
    Flex与.NET互操作(三):基于WebService的数据访问(下)
    Flex与.NET互操作(六):Flex和.NET协同开发利器FluorineFx
  • 原文地址:https://www.cnblogs.com/xiexun/p/14604650.html
Copyright © 2020-2023  润新知