Nginx教程(3)—负载均衡

时间:2022-12-19 08:53:26

Nginx教程一
Nginx教程二

3.1 负载均衡-轮询

轮询是Nginx默认使用的策略,轮询算法是最简单的一种负载均衡算法。它的原理是把来自用户的请求轮流分配给内部的服务器:从服务器1开始,直到服务器N,然后重新开始循环。在教程二中已经搭建了一个简单的Tomcat集群,下面对每个Tomcat下的webapp下的index.jsp加上一个表示后面用于区分,访问的是哪个服务器。

Nginx教程(3)—负载均衡

浏览器中访问www.tomats.com,进行多次访问,下面是第一次请求:

Nginx教程(3)—负载均衡

第二次访问:

Nginx教程(3)—负载均衡

第三次访问:

Nginx教程(3)—负载均衡

继续访问会发现Tomcat 1,2,3会轮流被访问到,这就是负载均衡的沦轮询策略

3.2 负载均衡-加权轮询

所谓的加权轮询是在轮询算法上进行的改进,由于每个服务器的性能可能会有差异,性能好的可以多进行一些请求处理,所以我们会给每个服务器加上一个权重,性能越好的权重越大,分配到的请求量越大。下面是在Nginx的核心配置文件Nginx.conf中配置各个服务器的权重

Nginx教程(3)—负载均衡

3.3 upstream指令参数

max_conns

用于限制一个服务器的最大连接数,默认值为0,表示不作任何限制,下面是在Nginx的核心配置文件Nginx.conf中配置

Nginx教程(3)—负载均衡

使用Jmeter进行测试(使用方法见3.4),设置线程数为200,每个线程访问10次

Nginx教程(3)—负载均衡

由于连接数的限制会出现很多失败的请求,并且规律是两个请求后的请求都是失败的

Nginx教程(3)—负载均衡
slow_start

配置集群服务器慢启动,会随着访问量的增大而去慢慢的启动服务器,而不是一开始就启动全部服务器,而设置slow_start的服务器的慢启动的过程是通过权重的逐步增加来实现的(所以要和权重配合使用)。

Nginx教程(3)—负载均衡
down

用于标识服务器的状态为不可用,用户访问不了

backup

backup标注的服务器,表示这是一个备用机,当当前使用的服务器宕机后,它才会被使用

max_fails和fail_timeout

前者表示最大失败次数,如果服务器配置了该参数,则发生在该服务器的请求次数达到了我们定义的次数系统就会认为该服务器已经宕机,会将该服务器踢出集群。后者是指失败的时间,它和前者配合使用,表示如果在后者指定的时间(假如为15s)内失败达到了前者规定的次数,则认为该服务器已经宕机,会将其踢出集群。

3.4 使用JMeter测试集群

Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。JMeter 最初被设计用于 Web 应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库和 FTP 服务器等等。JMeter 可对服务器、网络或对象模拟巨大的负载,在不同压力类别下测试它们的强度和分析整体性能。另外,JMeter 能够对应用程序做功能/回归测试,通过创建带有断言的脚本来验证程序是否返回了期望结果。为了最大限度的灵活性,JMeter 允许使用正则表达式创建断言。

Nginx教程(3)—负载均衡

  1. 下载与打开

下载地址,直接在官网下载即可。

Nginx教程(3)—负载均衡

打开的主页面如下

Nginx教程(3)—负载均衡

  1. Jmeter的基本使用

添加线程组

Nginx教程(3)—负载均衡

配置线程组

Nginx教程(3)—负载均衡

线程组添加取样器(本质上是线程发送的请求类型),这里选择http类型

Nginx教程(3)—负载均衡

命令行启动tomcat服务(注意Tomcat要装到虚拟机上,而jmeter要装到本机,模拟的是本机作为客户端,虚拟机作为服务端),下面是本机访问服务器上的Tomcat

Nginx教程(3)—负载均衡

配置http访问

Nginx教程(3)—负载均衡

添加监听器(用于得到测试结果),首先添加结果树

Nginx教程(3)—负载均衡

添加聚合报告

Nginx教程(3)—负载均衡

添加用表格查看结果

Nginx教程(3)—负载均衡

点击绿色三角,查看结果

Nginx教程(3)—负载均衡

3.5 负载均衡之IP_hash

上面介绍了负载均衡的轮询、加权轮询算法,IP_hash同样也是负载均衡的一个算法,它根据用户的ip地址,通过hash处理返回一个特定的值,然后根据这个值,将用户的请求分配到特定的服务器进行处理。(底层是用的hash算法),在nginx中配置ip_hash很简单,如下即可:

Nginx教程(3)—负载均衡

使用不同的虚拟机,由于ip地址不同,映射的hash值也不同(也可能相同),所以访问的服务器也会不同(可能相同),注意hash算法映射的是ip地址是前三段,所以属于一个内网的机器会映射到相同的服务器(因为内网的所有机器都是前三段的)。

3.6 一致性hash算法

问题提出,在前面的ip_hash中根据hash算法的原理我们可以知道,当集群中的一台服务器宕机后,此时所有的用户请求的hash值都要重新进行计算,这个工作量是很大的在实际生活中,且用户的原先访问到的资源会全部丢失,用户浏览器的缓冲也会丢失。所以这里提出了一致性hash算法,其原理是将我们的hash值区间范围组织成一个圆形,如下,然后将服务器通过特定的hash算法计算出hash值放置到圆形的特定位置,当用户发送请求时,会计算出hash值,然后在圆环上找到特定位置,沿着顺时针方向找到最近的服务器,如果一个服务器宕机后,它会沿着顺时针方向继续寻找下一个服务器,而不需要重新计算hash值。

Nginx教程(3)—负载均衡

3.7 Nginx控制浏览器缓存

Nginx缓存主要分为下面两个部分

Nginx教程(3)—负载均衡

nginx控制浏览器缓存是通过expires指令,指令格式为expires time,配置如下,表示浏览器的缓存的寿命

Nginx教程(3)—负载均衡

expires @ 22h30m,该指令是expires另外的一种使用方法,表示在22点30分浏览器缓存过期。
expires -1h ,该指令表示缓存在当前时间的前一个小时过期
expires epoch,该指令不设置浏览器缓存
expires off,表示expires关闭
expires max,可以理解为浏览器缓存永不过期(因为过期时间设计的特别久)

3.8 Nginx反向代理缓存

前面介绍了浏览器缓存,下面介绍上游服务器到Nginx服务器的缓存,这里我已经提前将一张图片上传到了所有tomcat服务器中,并可以在本机访问到,如下:

Nginx教程(3)—负载均衡

下面在Nginx核心配置文件中进行配置,然后重启nginx服务,配置生效
Nginx教程(3)—负载均衡
可以看到在nginx文件目录下出现了upstream_cache文件夹,且没有内容

Nginx教程(3)—负载均衡

在本机访问前面的图片,会发现upstream_cache中出现了缓存,且1分钟后缓存会消失(原因见前面配置)

Nginx教程(3)—负载均衡