暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

nginx集群系列(一):结合keepalived搭建主从模式的nginx集群

巴韭特锁螺丝 2024-07-23
116

一、基本概念

    Nginx集群是通过将多个Nginx服务器组合在一起,以协同工作来处理和分发传入的网络流量和请求的系统。集群中的每个Nginx节点都负责处理一部分请求,从而分担负载,提高性能、可伸缩性和可用性。Nginx集群通常用于构建高效的、分布式的Web应用架构。

二、基础环境

    nginx 版本:俩台服务器同版本v1.25.3

    [root@DB-Slave ~]# nginx -V
    nginx version: nginx/1.25.3
    built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
    built with OpenSSL 1.1.1d 10 Sep 2019
    TLS SNI support enabled
    configure arguments: --without-http_gzip_module --with-http_ssl_module --with-http_stub_status_module --with-http_v2_module --with-file-aio --with-openssl=/usr/local/gmssl --with-cc-opt=-I/usr/local/gmssl/include --with-ld-opt=-lm


        Nginx-Master:192.168.1.137

        Nginx-Slave:   192.168.1.138

        虚拟IP(用户实际访问IP):192.168.1.50

        俩台服务器的前端文件保持一致。

    三、配置流程

    1、安装keepalived工具

    2、配置keepalived,主要是权重优先级pri不同

        Master上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.17.129
      smtp_connect_timeout 30
      # 通过它,可以访问到主机,在hosts文件中,要做映射关系,类似于 127.0.0.1 LVS_DEVEL
      router_id LVS_DEVEL
      }


      vrrp_script chk_http_port {
      script "/usr/local/src/nginx_check.sh" # 执行脚本所在的位置
      interval 2 #检测脚本执行的间隔,单位秒,每个2秒执行一次脚本
      weight 2
      }

      vrrp_instance VI_1 {
      state MASTER # 备份服务器上将 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.1.50 # VRRP H 虚拟地址
      }
      }


       Slave上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.17.129
        smtp_connect_timeout 30
        # 通过它,可以访问到主机,在hosts文件中,要做映射关系,类似于 127.0.0.1 LVS_DEVEL
        router_id LVS_DEVEL
        }


        vrrp_script chk_http_port {
        script "/usr/local/src/nginx_check.sh" # 执行脚本所在的位置
        interval 2 #检测脚本执行的间隔,单位秒,每个2秒执行一次脚本
        weight 2
        }

        vrrp_instance VI_1 {
        state MASTER # 备份服务器上将 MASTER 改为 BACKUP
        interface ens33 # 绑定的网卡
        virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
        priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
        advert_int 1 #每隔一秒发送一次心跳,确保从服务器是否还活着
        authentication { # 心跳检测需要的密码
        auth_type PASS
        auth_pass 1111
        }
        virtual_ipaddress {
        192.168.1.50 # VRRP H 虚拟地址
        }
        }

        3、配置nginx服务检测脚本

            vim 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 #Nginx启动命令的位置
          sleep 2
          if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
          killall keepalived
          fi
          fi


          或者使用

            #!/bin/bash


            while true; do
            # 检测Nginx进程
            nginx_process_count=$(ps -C nginx --no-header |wc -l)


            # 判断Nginx进程是否存在
            if [ $nginx_process_count -eq 0 ]; then
            echo "Nginx进程不存在,正在停止keepalived.service服务..."
            systemctl stop keepalived.service
            break # 退出循环,因为服务已被停止
            else
            echo "Nginx进程存在,正在启动keepalived.service服务..."
            systemctl start keepalived.service
            break # 退出循环,因为服务已被启动
            fi


            sleep 2 # 暂停2秒钟再次检测
            done


            使该脚本保持后台运行监测:nohup sh nginx_check.sh &

            4、重启keepalived和nginx

              systemctl start keepalived.service
              systemctl restart keepalived.service
              systemctl status keepalived.service
              nginx -s reload

              四、验证测试

                  1、确认2台主机keepalived和nginx都属于启动状态,并查看网卡信息。

                    可以发现当前master主机的IP地址为192.168.1.138

                2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
                link/ether 00:0c:29:2f:20:61 brd ff:ff:ff:ff:ff:ff
                inet 192.168.1.138/24 brd 192.168.1.255 scope global noprefixroute dynamic ens33
                valid_lft 1717sec preferred_lft 1717sec
                inet 192.168.1.50/32 scope global ens33
                valid_lft forever preferred_lft forever
                inet6 fe80::ab04:d981:54a0:9f52/64 scope link noprefixroute
                valid_lft forever preferred_lft forever


                    模拟Master宕机,# poweroff

                    此时再次查看192.168.1.137信息,可以发现137主机称为Master

                  2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
                  link/ether 00:0c:29:f1:24:91 brd ff:ff:ff:ff:ff:ff
                  inet 192.168.1.137/24 brd 192.168.1.255 scope global noprefixroute dynamic ens33
                  valid_lft 1376sec preferred_lft 1376sec
                  inet 192.168.1.50/32 scope global ens33
                  valid_lft forever preferred_lft forever
                  inet6 fe80::ab04:d981:54a0:9f52/64 scope link tentative noprefixroute dadfailed
                  valid_lft forever preferred_lft forever
                  inet6 fe80::460b:fc4:bde5:73ec/64 scope link noprefixroute
                  valid_lft forever preferred_lft forever


                    2、模拟Master-2:192.168.1.138恢复

                          可以看到192.168.1.138重新成为Master

                      证明故障移配置完成。

                  五、小结

                      本篇内容keepalived结合nginx实现故障转移的前提条件时俩个服务都挂掉,比如服务器宕机的情况发生,方能实现故障转移。

                      如果只是单独的nginx挂掉,则会通过脚本重启nginx,而不会实现故障转移。

                  文章转载自巴韭特锁螺丝,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论