• lvs + keepalived + gninx 高性能负载均衡


    1,nginx 作为负载均衡器,在应用层实现了负载均衡和反向代理,在分布式集群中,能够有效的去处理大数据量,高访问的应用。但是,如果nginx 服务挂了怎么办?  

          为此,可以实现两台nginx或者多台nginx服务器,也就是双机主从热备,或者多机多主多从。当主nginx(master)挂了之后,备机器(backup)顶上。

          主nginx 和备nginx 由谁来控制?lvs

          主nginx 和备nginx 都挂了怎么办?keepalived

     2,lvs + keepalived + gninx

        lvs 简介:

        LVS是一个开源的软件,可以实现传输层四层负载均衡。LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器。目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);八种调度算法(rr,wrr,lc,wlc,lblc,lblcr,dh,sh)。

        LVS 在linux 2.6 之后,已经嵌入到Linux 内核之中,所以不需要单独安装

        虚拟ip

        keepalived:

        keepalived是一个类似于Layer2,4,7交换机制的软件。是Linux集群管理中保证集群高可用的一个服务软件,其功能是用来防止单点故障。

        keepalived的工作原理:

        keepalived是基于VRRP协议实现的保证集群高可用的一个服务软件,主要功能是实现真机的故障隔离和负载均衡器间的失败切换,防止单点故障

        VRRP原理:https://www.cnblogs.com/pickKnow/p/11236532.html

    3,搭建

     

      实现效果,本地开启服务192.168.178.1:8080 ,192.168.178.1:8081 ,由主的nignx 服务器分发,192.168.178.1:8082,192.168.178.1:8083 由备用的nignx 服务器分发

                         nginx 集群:192.168.178.115(MASTER),192.168.178.110(BACKUP),由lvs+ keepalived 分发,nginx 的主次是由keepalived 服务决定的

                         Keepalived高可用服务对之间的故障切换转移,是通过VRRP来实现的。在keepalived服务工作时,主Master节点会不断地向备节点发送(多播的方式)心跳消息,

                        用来告诉备Backup节点自己还活着。当主节点发生故障时,就无法发送心跳的消息了,备节点也因此无法继续检测到来自主节点的心跳了。

                        于是就会调 用自身的接管程序,接管主节点的IP资源和服务。当主节点恢复时,备节点又会释放主节点故障时自身接管的IP资源和服务,恢复到原来的备用角色。

                         默认情况下,是由主的nginx 分发至web 集群(8080.8081),当主nginx服务宕机之后,自动切换到备机。

    step 1: 本地开启了四个服务192.168.178.1:8080 ,192.168.178.1:8081,192.168.178.1:8082,192.168.178.1:8083

    step2: linux 两台机器分别是192.168.178.115 (master) 192.168.178.110 (backup),虚拟vip 192.168.178.116

    step3:   在115 和 110 机器上分别安装 nginx 和  keepalived

    安装keepalived 如下:

    1.下载keepalived
    wget http://www.keepalived.org/software/keepalived-1.2.18.tar.gz
    2.解压安装:
    tar -zxvf keepalived-1.2.18.tar.gz -C /usr/local/
    3.下载插件openssl
    yum install -y openssl openssl-devel(需要安装一个软件包)
    4.开始编译keepalived
    cd keepalived-1.2.18/ && ./configure --prefix=/usr/local/keepalived
    5.make一下
    make && make install
    
    
    报错: eepalived执行./configure --prefix=/usr/local/keepalived时报错:configure: error: Popt libraries is required
    出现此错误的原因:
    未安装popt的开发包
    解决方法:
    yum install popt-devel
    安装好popt的开发包。重新./configure 即可。
    
    
    keepalived安装成Linux系统服务
    
    将keepalived安装成Linux系统服务,因为没有使用keepalived的默认安装路径(默认路径:/usr/local),安装完成之后,需要做一些修改工作:
    首先创建文件夹,将keepalived配置文件进行复制:
    mkdir /etc/keepalived
    cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
    然后复制keepalived脚本文件:
    cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
    cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    ln -s /usr/local/sbin/keepalived /usr/sbin/
    ln -s /usr/local/keepalived/sbin/keepalived/sbin/
    可以设置开机启动:chkconfig keepalived on,到此我们安装完毕!
    keepalived 常用命令
    service keepalived start
    service keepalived stop
    
    启动报错Starting keepalived (via systemctl):  Job for keepalived.service failed. See 'systemctl status keepalived.service' and 'journalctl -xn' for details.  
    解决办法
    [root@edu-proxy-01 sbin]# cd /usr/sbin/  
    [root@edu-proxy-01 sbin]# rm -f keepalived   
    [root@edu-proxy-01 sbin]# cp /usr/local/keepalived/sbin/keepalived  /usr/sbin/  

      step4:115,110 机器上分别配置keepalived

    115: 

    vi /etc/keepalived/keepalived.conf

    ! Configuration File for keepalived
    
    # 心跳检测的脚本,去执行这个sh 文件 vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 20 weight -20 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 121 mcast_src_ip 192.168.178.115 priority 100 nopreempt advert_int 1 authentication { auth_type PASS auth_pass 1111 }
    # 心跳检测的脚本 track_script { chk_nginx } virtual_ipaddress { 192.168.178.116 } }

    脚本sh 文件如下:

    #!/bin/bash
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then /usr/local/nginx/sbin/nginx; sleep 5; if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then systemctl stop keepalived; fi; fi

    意思就是查看有没有nginx线程,如果nginx 挂了,重启nginx 服务,睡眠5秒,如果重启失败,则关闭这个主的keepalived 服务。

    当主的keepalived 服务挂了之后,根据vrrp 协议,虚拟vip 会切换到backup 机器(也就是192.168.178.110),这就是心跳检测,加上故障转移。但是我这边没有成功,脚本没有执行。问题还没找到。

    110:操作也是一样,就是个别地方需要改一下:

     vi /etc/keepalived/keepalived.conf

    ! Configuration File for keepalived
    
    vrrp_script chk_nginx {
        script "/etc/keepalived/nginx_check.sh"
        interval 2 #检测时间间隔
        weight -20 #如果条件成立的话,则权重 -20
    }
    
    vrrp_instance VI_2 {
        state BACKUP #来决定主从
        interface ens33 # 绑定虚拟 IP 的网络接口,根据自己的机器填写
        virtual_router_id 121 # 虚拟路由的 ID 号, 两个节点设置必须一样
        mcast_src_ip 192.168.178.110 #填写本机ip
        priority 100 # 节点优先级,主要比从节点优先级高
        nopreempt # 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
        advert_int 1 # 组播信息发送间隔,两个节点设置必须一样,默认 1s
        track_script {
            chk_nginx
        }
        authentication {
            auth_type PASS
            auth_pass 1111
        }
    
        virtual_ipaddress {
            192.168.178.116 # 虚拟ip,也就是解决写死程序的ip怎么能切换的ip,也可扩展,用途广泛。可配置多个。
        }
    }

    脚本sh 文件如下:

    #!/bin/bash
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then /usr/local/nginx/sbin/nginx; sleep 5; if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then systemctl stop keepalived; fi; fi

    step5: 两台机器上分别设置nginx 负载均衡,反向代理

        upstream aiyuesheng {
          server 192.168.178.1:8080;
          server 192.168.178.1:8081;
         }
        
        server {
            listen       80;
            server_name  localhost;
            location / {
                proxy_pass   http://aiyuesheng;
                index  index.html index.htm;
            }
             ###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
              proxy_connect_timeout 1s;
             ###nginx发送给上游服务器(真实访问的服务器)超时时间
             proxy_send_timeout 1s;
              ### nginx接受上游服务器(真实访问的服务器)超时时间
             proxy_read_timeout 1s;
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
    
        }
        upstream aiyuesheng {
          server 192.168.178.1:8082;
          server 192.168.178.1:8083;
         }
        
        server {
            listen       80;
            server_name  localhost;
            location / {
                proxy_pass   http://aiyuesheng;
                index  index.html index.htm;
            }
             ###nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
              proxy_connect_timeout 1s;
             ###nginx发送给上游服务器(真实访问的服务器)超时时间
             proxy_send_timeout 1s;
              ### nginx接受上游服务器(真实访问的服务器)超时时间
             proxy_read_timeout 1s;
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
    
        }

    step6:效果:115,110,分别启动nignx ,keepalived ,通过 ip a 命令可以看到115 机器上多了个ip 192.168.178.116

    浏览器输入192.168.178.116(虚拟vip),转发到了nginx 集群上的192.168.178.115 机器上,nginx 服务又通过反向代理和负载均衡分发到192.168.178.1:8080,192.168.178.1:8081

    当把192.168.178.115 的nginx 服务stop ,192.168.178.116(虚拟vip)因该到192.168.178.110 机器上,nginx 服务又通过反向代理和负载均衡分发到192.168.178.1:8082,192.168.178.1:8083

    最后一步没有成功,原因还不清楚。

    注意:写shell 脚本要在linux 上写,因为windows 上格式和linux 不一样,windows 换行 linux 编译不出来

    web 集群,也可以做备用服务,比如一直访问 192.168.178.1:8080,当192.168.178.1:8080 挂了之后才访问192.168.178.1:8081

    upstream testproxy {
          server 192.168.178.1:8080;
          server 192.168.178.1:8081 backup;
      }

     所以,综上,当生产的项目出现宕机,对应的策略是:

     1,故障转移.....从master 转到 backup

     2,  心跳检测,keepalived每隔多长时间会执行脚本,查看nginx 服务是否还在

     3,自动重启,检查服务不在了,会执行/usr/local/nginx/sbin/nginx 的命令开启nginx

      

          

  • 相关阅读:
    0722
    SGU
    预测一下吧
    0625
    0624
    0610
    0607
    0604
    poj2455Secret Milking Machine【二分 + 最大流】
    BZOJ3489: A simple rmq problem
  • 原文地址:https://www.cnblogs.com/pickKnow/p/11236501.html
Copyright © 2020-2023  润新知