您的位置:  首页 > 技术 > 中间件 > 正文

Nginx技术专题(1)基于Nginx负载均衡机制实现负载均衡介绍和配置

2022-02-14 19:00 https://my.oschina.net/liboware/blog/5445153 浩宇天尚 次阅读 条评论

前言介绍

  • 由于目前现有网络的各个核心部分随着业务量的提高,访问量和数据流量的快速增长,其处理能力和计算强度也相应地增大,使得单一的服务器设备根本无法承担。在此情况下,如果扔掉现有设备去做大量的硬件升级,这样将造成现有资源的浪费,而且如果再面临下一次业务量的提升时,这又将导致再一次硬件升级的高额成本投入,甚至性能再卓越的设备也不能满足当前业务量增长的需求。
  • 针对此情况而衍生出来的一种廉价有效透明的方法以扩展现有网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性的技术就是负载均衡(Load Balance)。

负载均衡是什么?

  • 什么是负载均衡?单从字面上的意思来理解就可以解释N台服务器平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。那么负载均衡的前提就是要有多台服务器才能实现,也就是两台以上即可。负载均衡是高并发、大流量网站必须要实现的技术。
  • 让客户端的请求均匀地分布到各个服务器上。客户端的请求先到达负载均衡器,由负载均衡器通过一系列算法将请求转发到某台上游的业务服务器上。

负载均衡策略

实现负载均衡的方式有很多,下面将列出几种方式,并对比优劣:

  1. 通过硬件来进行解决,常见的硬件有NetScaler、F5、Radware和Array等商用的负载均衡器,但是它们是比较昂贵的。
  2. 通过软件来进行解决的,常见的软件有LVS、Nginx、apache等,它们是基于Linux系统并且开源的负载均衡策略。

硬件层面

通过F5实现负载均衡,性能优异,F5的底层是在芯片层面做了优化,这样就使得它的性能不依赖主机操作系统的处理能力,但是F5价格高昂,一般小公司用不起软件层面可以通过LVS来实现负载均衡,这是一款中国人开发的软件。

软件层面

性能受到主机运算能力的制约除了LVS之外,还可以通过Nginx实现负载均衡,为了实现高可用需要和keepalived配合使用,Nginx实现负载均衡也是本文讲解的重点还可以在DNS层面做负载均衡,在域名解析的时候解析到不同的服务器上。

优点是配置简单,非常容易实现,缺点是没有检测机制,不够均衡,容错能力比较差

硬件层面可以通过F5实现负载均衡,性能优异。F5的底层是在芯片层面做了优化,这样就使得它的性能不依赖主机操作系统的处理能力,但是F5价格高昂,一般小公司用不起 软件层面可以通过LVS来实现负载均衡,这是一款中国人开发的软件。因为是软件层面的负载均衡,性能受到主机运算能力的制约 除了LVS之外,还可以通过Nginx实现负载均衡,为了实现高可用需要和keepalived配合使用,Nginx实现负载均衡也是本文讲解的重点 还可以在DNS层面做负载均衡,在域名解析的时候解析到不同的服务器上。优点是配置简单,非常容易实现,缺点是没有检测机制,不够均衡,容错能力比较差

Nginx是什么?

Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev(伊戈尔·西索夫)所开发,供俄国大型的入口网站及搜索引擎Rambler(漫步者)(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:新浪、网易、 腾讯等。

优点

  1. 可运行linux,并有 Windows移植版。
  2. 在高连接并发的情况下,Nginx是Apache服务器不错的替代品Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达50,000个并发连接数的响应

负载均衡的功能

  • 转发
  • 故障移除
  • 恢复添加
  • 高可用 Ha

我们想要使用Nginx那么就必须满足上面的四个条件. 我们配置负载均衡的目的是在于当用户访问我们的服务器的时候, 首先会通过 Nginx服务器来决定转发到哪个Tomcat服务器上去给用户提供服务, 当然这个概率是我们通过权重来配置的. 经过Nginx指派之后, 我们就可以处理高并发的访问了, 这里就能达到负载均衡的目的.

Nginx如何实现负载均衡

Nginx的负载均衡是通过upstream来实现的,在upstream中指定若干个 server,格式如下:

myserver就是通过 upstream 定义的一组负载均衡模板,其中:

在配置完upstream后,还要让客户端过来的请求反向代理到myserver,格式如下:

完成了负载均衡的配置,但是在实际需求中除了上面的设置外,还会增加一些额外设置:

负载均衡策略设置请求上游服务器携带请求头信息upstream模块中其他参数设置

Nginx的负载均衡策略有5种方式:

除以上5种,还有一种:least-connected — 下一个请求被分配到拥有最少活动连接数的服务器。

编辑nginx配置文件(例中为/usr/local/ngnix/conf/nginx.conf),找到http结点,

配置案例
http {
    upstream myapp1 {
        server 192.168.1.103:8080;
        server 192.168.1.104:8080;
   }
   server {
        listen 80;
        server_name  localhost;
        location /webautotest/ {
            proxy_buffering off;
            proxy_pass http://myapp1;
        }
    }
}
重新加载配置文件
[root@localhost nginx-1.10.0]# /usr/local/ngnix/sbin/nginx -s reload
默认的负载均衡配置
http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://myapp1;
        }
    }
}
最少连接负载均衡
  • 另一个负载均衡原则为least-connected。当一些请求花费较长时间来完成时,least-connected更“公平”的控制应用程序实例上的负载。
  • 配置了least-connected的负载均衡机制的情况下,nginx会尽量不让负载繁忙的应用服务器上负载过多的请求,相反的,会把新的请求发送到比较不繁忙的服务器。
配置示例:
upstream myapp1 {
        least_conn;
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
}
会话持久性

注意,round-robin或least-connected负载均衡下,每个后续的客户端可能被分发至不同服务器,不保证相同客户端的请求总是被发送到相同的服务器。

如果有必要把客户端绑定至特定服务器,则可使用ip-hash负载均衡机制。

ip-hash机制

ip-hash机制下,客户端ip地址被用作hash key来判断客户端请求应该发送到哪个服务器,这种方法保证了来自相同客户端的请求总是发送到相同服务器(如果服务器可用的话)

upstream myapp1 {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}

负载均衡权重

可通过配置服务器权重来影响负载均衡机制。上面的例子中,都未配置服务器权重,这意味着所有服务器都拥有相同的权重。 针对round-robin负载机制,权重意味着更多或更少的请求传送至服务器---假设有足够的请求,且按统一方式处理请求,且足够快完成请求处理。

配置示例:
  upstream myapp1 {
        server srv1.example.com weight=3;
        server srv2.example.com;
        server srv3.example.com;
}

上例配置中,每发送至服务器实例的5个新的请求中,有3个发送到srv1,1个发送到srv2,另1个发送到srv3。

注:当前版本似乎只实现了round-robin机制下的权重设置

健康检测

  • nginx反向代理实现包含服务器健康检查。如果来自特定服务器的响应失败,报错,nginx将标记该服务器为failed,一段时间内尽量避免选择此服务器作为随后请求的分发服务器。

  • max_fails机制设置fail_timeout期间,和服务器沟通失败的连续重试次数,默认为1.当设置为0时,不做服务器健康检测。fail_timeout定义了服务器被标记为failed的时长。fail_timeout时间间隔过后,nginx将开始使用活动客户端请求来探测服务器,如果探测成功则标记服务器为活动服务器。

Nginx负载均衡配置项介绍

下面我们将介绍一下proxy模块的参数:

各个参数介绍:

设置proxy_connect_timeout 为2秒,缩短超时时间,使其不至于太慢。

参考链接:

展开阅读全文
  • 0
    感动
  • 0
    路过
  • 0
    高兴
  • 0
    难过
  • 0
    搞笑
  • 0
    无聊
  • 0
    愤怒
  • 0
    同情
热度排行
友情链接