美文网首页
Nginx 高可用

Nginx 高可用

作者: YonchanLew | 来源:发表于2022-03-09 14:50 被阅读0次

    1、使用Keepalived程序让nginx高可用

    下载:https://www.keepalived.org/download.html
    上传到服务器
    解压:tar -zxvf keepalived-2.0.18.tar.gz
    然后就安装三部曲,./configure、make、make install

    打开配置文件

    vim keepalived.conf
    
    global_defs { 
      # 路由id:当前安装keepalived的节点主机标识符,保证全局唯一 
      router_id keep_171 
    }
    vrrp_instance VI_1 { 
      # 表示状态是MASTER主机还是备用机BACKUP 
      state MASTER 
      # 该实例绑定的网卡  #查看网卡名称 ip addr
      interface ens33 
      # 保证主备节点一致即可 
      virtual_router_id 51 
      # 权重,master权重一般高于backup,如果有多个,那就是选举,谁的权重高,谁就当选 
      priority 100 
      # 主备之间同步检查时间间隔,单位秒 
      advert_int 2 
      # 认证权限密码,防止非法节点进入 
      authentication { 
        auth_type PASS 
        auth_pass 1111 
      }
      # 虚拟出来的ip,可以有多个(vip) 
      virtual_ipaddress { 
        192.168.1.161
      } 
    }
    

    启动

    ./keepalived
    

    注册为系统服务

    在keepalived下有个etc目录的,进入去
    cp init.d/keepalived /etc/init.d/
    cp sysconfig/keepalived /etc/sysconfig/
    
    systemctl start keepalived.service
    

    2、keepalived也可能崩的,也需要主备

    配置备

    global_defs { 
      router_id keep_172 
    }
    vrrp_instance VI_1 { 
      # 备用机设置为BACKUP 
      state BACKUP 
      interface ens33 
      virtual_router_id 51 
      # 权重低于MASTER 
      priority 80 
      advert_int 2 
      authentication { 
        auth_type PASS 
        auth_pass 1111 
      }
      virtual_ipaddress { 
        # 注意:主备两台的vip都是一样的,绑定到同一个vip 
        192.168.1.161 
      } 
    }
    

    增加Nginx重启检测脚本

    vim /etc/keepalived/check_nginx_alive_or_not.sh
    
    #!/bin/bash 
    
    A=`ps -C nginx --no-header |wc -l` 
    # 判断nginx是否宕机,如果宕机了,尝试重启 
    if [ $A -eq 0 ];then 
      /usr/local/nginx/sbin/nginx 
      # 等待一小会再次检查nginx,如果没有启动成功,则停止keepalived,使其启动备用机 
      sleep 3 
      if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then 
        killall keepalived 
      fi 
    fi
    

    增加运行权限

    chmod +x /etc/keepalived/check_nginx_alive_or_not.sh
    

    配置keepalived监听nginx脚本

    vrrp_script check_nginx_alive { 
      script "/etc/keepalived/check_nginx_alive_or_not.sh" 
      interval 2 # 每隔两秒运行上一行脚本 
      weight 10 # 如果脚本运行失败,则升级权重+10 
    }
    

    在 vrrp_instance 中新增监控的脚本

    track_script { 
      check_nginx_alive # 追踪 nginx 脚本 
    }
    

    重启Keepalived使得配置文件生效

    systemctl restart keepalived
    

    3、双主热备

    规则:以一个虚拟ip分组归为同一个路由



    主节点配置:

    global_defs { 
      router_id keep_171 
    }
    vrrp_instance VI_1 { 
      state MASTER 
      interface ens33 
      virtual_router_id 51 
      priority 100 
      advert_int 1 
      authentication { 
        auth_type PASS 
        auth_pass 1111 
      }
      virtual_ipaddress { 
        192.168.1.161 
      } 
    }
    vrrp_instance VI_2 { 
      state BACKUP 
      interface ens33 
      virtual_router_id 52 
      priority 80 
      advert_int 1 
      authentication { 
        auth_type PASS 
        auth_pass 1111 
      }
      virtual_ipaddress { 
        192.168.1.162 
      } 
    }
    

    备节点配置

    global_defs { 
      router_id keep_172 
    }
    vrrp_instance VI_1 { 
      state BACKUP 
      interface ens33 
      virtual_router_id 51 
      priority 80 
      advert_int 1 
      authentication { 
        auth_type PASS 
        auth_pass 1111 
      }
      virtual_ipaddress { 
        192.168.1.161
      }
    }
    vrrp_instance VI_2 { 
      state MASTER 
      interface ens33 
      virtual_router_id 52 
      priority 100 
      advert_int 1 
      authentication { 
        auth_type PASS 
        auth_pass 1111 
      }
      virtual_ipaddress { 
        192.168.1.162 
      } 
    }
    

    4、LVS

    一般不会直接使用keepalived直接作用在nginx上,而是keepalived+LVS+Nginx实现高可用。
    LVS 基于四层,工作效率高
    单个Nginx承受不了压力,需要集群
    LVS 充当Nginx集群的调度者
    Nqinx 接受请求来回,LVS可以只接受不响应




    5、前期准备:

    服务器与ip规划:
    LVS - 1台
    VIP(虚拟IP):192.168.1.150
    DIP(转发者IP/内网IP):192.168.1.151
    Nginx - 2台(RealServer)
    RIP(真实IP/内网IP):192.168.1.171
    RIP(真实IP/内网IP):192.168.1.172
    所有计算机节点关闭网络配置管理器,因为有可能会和网络接口冲突:

    systemctl stop NetworkManager 
    systemctl disable NetworkManager
    

    创建子接口

    cd /etc/sysconfig/network-scripts/
    #数字可以是其他,只是随便起个别名
    cp ifcfg-ens33 ifcfg-ens33:1
    

    修改子接口配置: vim ifcfg-ens33:1,保留这些即可

    BOOTPROTO="static"
    DEVICE="ens33:1"
    ONBOOT="yes"
    IPADDR=192.168.1.150  #虚拟IP
    NETMASK=255.255.255.0
    

    service network restart
    安装集群管理工具
    yum install ipvsadm

    6、搭建LVS-DR模式- 为两台RS配置虚拟IP

    #这个文件上网查一查
    cp ifcfg-lo ifcfg-lo:1
    
    修改为
    DEVICE=lo:1
    IPADDR=192.168.1.150
    NETMASK=255.255.255.255
    NETWORK=127.0.0.1
    BROADCAST=127.255.255.255
    ONBOOT=yes
    NAME=loopback
    

    service network restart
    另一台

    cp ifcfg-lo ifcfg-lo:1
    
    修改为
    DEVICE=lo:1
    IPADDR=192.168.1.150
    NETMASK=255.255.255.255
    NETWORK=127.0.0.1
    BROADCAST=127.255.255.255
    ONBOOT=yes
    NAME=loopback
    

    这样两台虚拟ip都构建好了

    7、搭建LVS-DR模式- 为两台RS配置arp

    ARP响应级别与通告行为的概念

    1. arp-ignore:ARP响应级别(处理请求)
      只要本机配置了ip,就能响应请求
      请求的目标地址到达对应的网络接口,才会响应请求
    2. arp-announce:ARP通告行为(返回响应)
      本机上任何网络接口都向外通告,所有的网卡都能接受到通告
      尽可能避免本网卡与不匹配的目标进行通告
      只在本网卡通告

    打开sysctl.conf:

    vim /etc/sysctl.conf
    

    配置 所有网卡 、 默认网卡 以及 虚拟网卡 的arp响应级别和通告行为,分别对应: all , default , lo :

    两台都是相同配置
    # configration for lvs 
    net.ipv4.conf.all.arp_ignore = 1 
    net.ipv4.conf.default.arp_ignore = 1 
    net.ipv4.conf.lo.arp_ignore = 1 
    
    net.ipv4.conf.all.arp_announce = 2 
    net.ipv4.conf.default.arp_announce = 2 
    net.ipv4.conf.lo.arp_announce = 2
    

    刷新配置文件:

    sysctl -p
    

    增加一个网关,用于接收数据报文,当有请求到本机后,会交给lo去处理:

    两台都是相同配置
    route add -host 192.168.1.150 dev lo:1
    
    route -n
    

    开机自启

    echo "route add -host 192.168.1.150 dev lo:1" >> /etc/rc.local
    

    8、搭建LVS-DR模式- 使用ipvsadm配置集群规则

    创建LVS节点,用户访问的集群调度者

    ipvsadm -A -t 192.168.1.150:80 -s rr -p 5
    

    -A:添加集群
    -t:tcp协议
    ip地址:设定集群的访问ip,也就是LVS的虚拟ip
    -s:设置负载均衡的算法,rr表示轮询
    -p:设置连接持久化的时间

    创建2台RS真实服务器

    ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.171:80 -g 
    ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.172:80 -g
    

    -a:添加真实服务器
    -t:tcp协议
    -r:真实服务器的ip地址
    -g:设定DR模式

    保存到规则库,否则重启失效

    ipvsadm -S
    

    检查集群

    查看集群列表
    ipvsadm -Ln
    查看集群状态
    ipvsadm -Ln --stats
    

    其他命令:

    # 重启ipvsadm,重启后需要重新配置 
    service ipvsadm restart 
    # 查看持久化连接 
    ipvsadm -Ln --persistent-conn 
    # 查看连接请求过期时间以及请求源ip和目标ip 
    ipvsadm -Lnc 
    # 设置tcp tcpfin udp 的过期时间(一般保持默认) 
    ipvsadm --set 1 1 1 
    # 查看过期时间 
    ipvsadm -Ln --timeout
    #更详细的帮助文档
    ipvsadm -h 
    man ipvsadm
    

    至此,已经实现单个LVS+两个Nginx,但这样LVS还是有可能崩的,所以LVS要配置主备

    9、Keepalived+LVS,主配置

    修改Keepalived的配置文件

    global_defs {
      router_id LVS_151
    }
    
    vrrp_instance VI_1 { 
      state MASTER 
      interface ens33 
      virtual_router_id 41 
      priority 100 
      advert_int 1 
      authentication { 
        auth_type PASS 
        auth_pass 1111 
      }
      virtual_ipaddress {
        192.168.1.150
      }
    }
    
    #配置集群地址访问的IP+端口,端口和nginx保持一致,都是80
    virtual server 192.168.1.150 80 { 
      # 健康检查的时问,单位:秒
      delay_loop 6
      #配置负载均衡的算法,默认是轮询
      lb_algo rr
      # 设置LVS的模式 NAT | TUN | DR
      lb_kind DR
      # 设置会话持久化的事件
      persistence_timeout 5
      #协议 -t
      protocol TCP
    
      #负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址
      real_server 192.168.1.171 80 {
        #轮询的默认权重配比设置为1
        weight 1
        #设置健康检查
        TCP_CHECK {
          #检查的80端口
          connect_port 80
          #超时时间
          connect_timeout 2
          # 重试次数 2次
           nb_get_retry 2
           # 间隔时间 3秒
           delay_before_retry 3
         }
      }
      real_server 192.168.1.172 80 {
        weight 1
        #设置健康检查
        TCP_CHECK {
          #检查的80端口
          connect_port 80
          #超时时间
          connect_timeout 2
          # 重试次数 2次
           nb_get_retry 2
           # 间隔时间 3秒
           delay_before_retry 3
         }
      }
    }
    
    清空规则
    ipvsadm -C
    重启
    systemctl restart keepalived
    

    10、Keepalived+LVS,备配置

    修改Keepalived的配置文件

    global_defs {
      router_id LVS_152
    }
    
    vrrp_instance VI_1 { 
      state BACKUP 
      interface ens33 
      virtual_router_id 41 
      priority 50 
      advert_int 1 
      authentication { 
        auth_type PASS 
        auth_pass 1111 
      }
      virtual_ipaddress {
        192.168.1.150
      }
    }
    
    #配置集群地址访问的IP+端口,端口和nginx保持一致,都是80
    virtual server 192.168.1.150 80 { 
      # 健康检查的时问,单位:秒
      delay_loop 6
      #配置负载均衡的算法,默认是轮询
      lb_algo rr
      # 设置LVS的模式 NAT | TUN | DR
      lb_kind DR
      # 设置会话持久化的事件
      persistence_timeout 5
      #协议 -t
      protocol TCP
    
      #负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址
      real_server 192.168.1.171 80 {
        #轮询的默认权重配比设置为1
        weight 1
        #设置健康检查
        TCP_CHECK {
          #检查的80端口
          connect_port 80
          #超时时间
          connect_timeout 2
          # 重试次数 2次
           nb_get_retry 2
           # 间隔时间 3秒
           delay_before_retry 3
         }
      }
      real_server 192.168.1.172 80 {
        weight 1
        #设置健康检查
        TCP_CHECK {
          #检查的80端口
          connect_port 80
          #超时时间
          connect_timeout 2
          # 重试次数 2次
           nb_get_retry 2
           # 间隔时间 3秒
           delay_before_retry 3
         }
      }
    }
    
    清空规则
    ipvsadm -C
    重启
    systemctl restart keepalived
    

    相关文章

      网友评论

          本文标题:Nginx 高可用

          本文链接:https://www.haomeiwen.com/subject/fihbrrtx.html