负载均衡集群技术-nginx


前言

  负载均衡(又称为负载分担),英文名称为Load Balance,其意思就是将负载(工作任务)进行平衡、分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。


一、什么是负载均衡集群技术

  • 负载均衡
      负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
  • 集群
      集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技术。集群组成后,可以利用多个计算机和组合进行海量请求处理(负载均衡),从而获得很高的处理效率,也可以用多个计算机做备份(高可用),使得任何一个机器坏了整个系统还是能正常运行。
  • 负载均衡集群技术
      负载均衡(Load Balance):负载均衡集群为企业需求提供了可解决容量问题的有效方案。负载均衡集群使负载可以在计算机集群中尽可能平均地分摊处理。
      负载通常包括应用程序处理负载和网络流量负载,每个节点都可以承担一定的处理负载,并且可以实现处理负载在节点之间的动态分配,以实现负载均衡。

二、负载均衡技术的实现

负载均衡(Load Balance)

负载均衡技术类型:基于 4 层负载均衡技术和基于 7 层负载均衡技术

负载均衡实现方式:硬件负载均衡设备或者软件负载均衡

硬件负载均衡产品:F5 、深信服 、Radware

软件负载均衡产品: LVS(Linux Virtual Server)、 Haproxy、Nginx、Ats(apache traffic server)

- 实现效果图
负载均衡展示图

三、负载均衡的分类

  负载均衡根据所采用的设备对象(软/硬件负载均衡),应用的OSI网络层次(网络层次上的负载均衡)等来分类。根据应用的 OSI 网络层次来分类的两个负载均衡类型。

负载均衡可以大概分为以下几类:

  • 二层负载均衡(mac)
    一般是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后分配后端实际的MAC地址响应。
  • 三层负载均衡(ip)
    一般采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后分配后端实际的IP地址响应。
  • 四层负载均衡(tcp)
    在三层负载均衡的基础上,用ip+port接收请求,再转发到对应的机器。
  • 七层负载均衡(http)
    根据虚拟的url或IP,主机名接收请求,再转向相应的处理服务器。

  四层负载均衡
  实现四层负载均衡的产品有:

  • F5:硬件负载均衡器,功能很好,但是成本很高。
  • lvs:重量级的四层负载软件
  • nginx:轻量级的四层负载软件,带缓存功能,正则表达式较灵活
  • haproxy:模拟四层转发,较灵活
    七层负载均衡
    实现七层负载均衡的软件有:
  • haproxy:天生负载均衡技能,全面支持七层代理,会话保持,标记,路径转移;
  • nginx:只在http协议和mail协议上功能比较好,性能与haproxy差不多;
  • apache:功能较差
  • Mysql proxy:功能尚可。
      由于在实际应用中,我们比较常用的是四层负载及七层负载。这里也重点说下这两种负载。
    在这里插入图片描述
      四层负载架构设计比较简单,无需解析具体的消息内容,在网络吞吐量及处理能力上会相对比较高,而七层负载均衡的优势则体现在功能多,控制灵活强大。在具体业务架构设计时,使用七层负载或者四层负载还得根据具体的情况综合考虑。

二、操作步骤

  • nginx四层负载均衡及七层负载均衡

  • nginx既有四层的负载均衡也有七层的负载均衡
  • 代理实现
    在这里插入图片描述

七层负载均衡

1.首先准备三台机器,其中两台为真实服务器,一台为proxy代理服务器并且关闭防火墙及linux确保三台机器之间可以被互相访问到。

扫描二维码关注公众号,回复: 13376333 查看本文章
  • 192.168.253.176 webserver1
  • 192.168.253.178 webserver2
  • 192.168.253.189 nginx-proxy

2.在webserver1和webserver2两台机器上分别部署一个简单的页面用于测试。为了能够更好的体现出负载均衡,这里的两台服务器分别设置不同的内容。
如果有需要可以参考关于nginx的文章

  • server1
[root@server1 ~]# yum -y install nginx
[root@server1 ~]# systemctl start nginx
[root@server1 ~]# systemctl enable nginx
[root@server1 ~]# echo "hello world!" >/usr/share/nginx/html/index.html
[root@server1 ~]# curl 127.0.0.1
hello world!
  • server2
[root@server2 ~]# yum -y install nginx
[root@server2 ~]# systemctl start nginx
[root@server2 ~]# systemctl enable nginx
[root@server2 ~]# echo "hi world!" >/usr/share/nginx/html/index.html
[root@server2 ~]# curl 127.0.0.1
hi world!

3.在ngonx-proxy 代理服务器上进行配置
upstream配置
这个配置是写一组被代理的服务器地址,然后配置负载均衡的算法.

upstream testapp {
    
     
      server 192.168.253.178:80;
      server 192.168.253.176:80;
}
 server {
    
    
        ....
        location / {
    
             
           proxy_pass  http://testapp;  #请求转向 testapp 定义的服务器列表         
        } 
  • upstream支持的几种算法
    • A、轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器;
    • B、ip_hash:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。
    • C、url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。
    • D、fair:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持 fair的,如果需要使用这种调度算法,必须下载Nginx的 upstream_fair模块。

配置实例参考
热备:如果你有两台服务器,当一台服务器发生故障时,才启用第二台服务器提供服务;

upstream myweb {
    
     
      server 192.168.253.178:80; 
      server 192.168.253.176:80 backup;  #热备     
    }

轮询:nginx默认的就是轮询其权重默认为1,请求访问时 每台服务器访问一次;

upstream myweb {
    
     
      server 192.168.253.176:8080;    #默认80端口可以不用写端口号
      server 192.168.253.178:8080;      
    }

加权轮询:根据配置的权重大小从而处理不同数量的访问及请求

upstream myweb {
    
     
      server 192.168.253.176:8080 weight=1;
      server 192.168.253.178:8080 weight=2;
}

ip_hash:nginx会让相同客户端ip访问同一个服务器;

upstream myweb {
    
     
      ip_hash;
      server 192.168.253.178:80; 
      server 192.168.253.176:80
    }
  • nginx 负载均衡配置状态参数
    • down,表示当前的server暂时不参与负载均衡。
    • backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
    • max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
    • fail_timeout,在经历了max_fails次失败后,暂停服务的时间单位秒。max_fails可以和fail_timeout一起使用。
 upstream myweb {
    
     
      server 172.17.14.2:8080 weight=2 max_fails=2 fail_timeout=2;
      server 172.17.14.3:8080 weight=1 max_fails=2 fail_timeout=1;    
    }

4.编辑nginx-proxy配置文件,如下

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    
    
    worker_connections 1024;
}

http {
    
    
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
    upstream testapp {
    
     
      server 192.168.253.176;
      server 192.168.253.178;
    }

    server {
    
    
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
    
    
             proxy_pass  http://testapp;

        }


        error_page 404 /404.html;
        location = /404.html {
    
    
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    
    
        }
    }
}

5.接下来就可以访问测试了

[root@nginx-proxy ~]# curl 127.0.0.1
hi world!
[root@nginx-proxy ~]# curl 127.0.0.1
hello world!

修改配置文件,增加权重,重新加载配置文件生效

[root@nginx-proxy ~]# vim /etc/nginx/nginx.conf
 upstream testapp {
    
    
      server 192.168.253.176 weight=1;
      server 192.168.253.178 weight=2;
    }
...
[root@nginx-proxy ~]# curl 127.0.0.1
hello world!
[root@nginx-proxy ~]# curl 127.0.0.1
hi world!
[root@nginx-proxy ~]# curl 127.0.0.1
hi world!

在此也可以看到配置已经生效。

四层负载均衡

  nginx在1.9.0 的时候,增加了一个 stream 模块,用来实现OSI第四层协议(网络层和传输层)的转发、代理、负载均衡等。stream模块的用法跟http的用法类似,允许我们配置一组TCP或者UDP等协议的监听.

#4层tcp负载 
stream {
    
    
   upstream myweb {
    
    
      hash $remote_addr consistent;
      server 172.17.14.2:8080;
      server 172.17.14.3:8080;
}
server {
    
    
            listen 82;
            proxy_connect_timeout 10s;
            proxy_timeout 30s;
            proxy_pass myweb;
        }
}

*在这里要注意stream模块不在http的服务里边,采用的是四层的协议。
在这里就不重复操作了,可以参考官方网站学习。


总结

  负载均衡除了nginx的使用外比较常用的还有 LVS 、Haproxy等,在使用时应根据具体的场景进行使用,如果条件允许的话,还可以使用keepalived 高可用等相关技术。

  
欢迎一起交流分享!

猜你喜欢

转载自blog.csdn.net/weixin_52099680/article/details/113849440
今日推荐