网站这么上百度,网站的规划与创建,网站建设中 怎么办,wordpress 只有内页能打开一、负载均衡今天学习一下Nginx的负载均衡。由于传统软件建构的局限性#xff0c;加上一台服务器处理能里的有限性#xff0c;在如今高并发、业务复杂的场景下很难达到咱们的要求。但是若将很多台这样的服务器通过某种方式组成一个整体#xff0c;并且将所有的请求平均的分配…一、负载均衡今天学习一下Nginx的负载均衡。由于传统软件建构的局限性加上一台服务器处理能里的有限性在如今高并发、业务复杂的场景下很难达到咱们的要求。但是若将很多台这样的服务器通过某种方式组成一个整体并且将所有的请求平均的分配给这些机器处理那么这个“系统”就能处理尽可能多的请求这就是负载均衡最初的设计思想。当然可以使用的技术包含软件、硬件咱们本次就着重谈谈Nginx的负载均衡。下图是一个四层 七层的负载均衡。采用lvsnginx的拓扑结构。二、负载均衡概念1、什么是负载均衡负载均衡简称LBLoad Balancing是一种计算机技术。用来在多个计算机计算机集群、网络连接、CPU、磁盘驱动器或其他资源中分配负载以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。宏观上的意思是将负载工作任务访问请求进行平衡、分摊到多个操作单元服务器组件上进行执行以解决高性能单点故障高可用扩展性水平伸缩等高流量下常见的问题。2、负载均衡分类由于载均衡技术是要对网络传输中的报文进行控制涉及到网络七层模型因此负载均衡分类可以按照网络层次进行分类比如二层、三层、四层、七层负载均衡。其中最常见的是四层和七层负载均衡。此外还有其他方面进行分类的有软衡、硬件负载均衡等比如SpringCloud全家桶中的Eureka组件、各种分库分表的中间件都属于负载均衡的范畴。二层、三层、四层、七层负载均衡都都工作在OSI模型接下来会对做一个简单的解释。业界已经有很多开源的负载均衡工具大部分是工作在第四层和第七层的。代表的开源工具有Nginx、LVS、Haproxy。LVS 主要用来做四层负载均衡Nginx 和 Haproxy 主要是做七层的负载均衡但它们都支持四层的负载均衡例如在 Nginx 中的 stream 模块除了支持四层的反向代理功能也支持四层负载均衡功能。2.1 二层负载均衡负载均衡服务器对外提供一个VIP虚拟IP集群中不同的机器采用相同IP地址但是机器的MAC地址不一样。当负载均衡服务器接受到请求之后通过改写报文的目标MAC地址的方式将请求转发到目标机器实现负载均衡。二层负载均衡发生在数据链路层所以也称为“数据链裤层负载均衡”它是属于OSI模型。2.2 三层负载均衡负载均衡服务器对外提供一个VIP虚拟IP但是集群中不同的机器采用不同的IP地址。当负载均衡服务器接受到请求之后根据不同的负载均衡算法通过IP将请求转发至不同的真实服务器。三层负载均衡发生在网络层故又称为“网络层负载均衡”同样的它也是属于OSI模型。2.3 四层负载均衡四层负载均衡工作在OSI模型的传输层由于在传输层只有TCP/UDP协议这两种协议中除了包含源IP、目标IP以外还包含源端口号及目的端口号。四层负载均衡服务器在接受到客户端请求后以后通过修改数据包的地址信息IP端口号将流量转发到应用服务器。2.4 七层负载均衡七层负载均衡工作在 OSI 模型的应用层应用层协议较多常用 http、dns 等。七层负载就可以基于这些协议来负载。这些应用层协议中会包含很多有意义的内容。比如同一个 Web 服务器的负载均衡除了根据 IP 加端口进行负载外还可根据七层的 URL、浏览器类别、语言来决定是否要进行负载均衡。3、负载均衡算法负载均衡算法可以分成两大类一类是静态的负载均衡算法常见的有轮询、权重等另一大类动态的负载均衡算法常见的有最少的连接、最快响应、服务类型、服务质量等等。下面就着重记录几种常用的负载均衡算法。3.1 轮询 (默认)每一个来自网络中的请求轮流分配给内部的服务器从 1 到 N 然后重新开始。此种负载均衡算法适合服务器组内部的服务器都具有相同的配置并且平均服务请求 相对均衡的情况。3.2 加权轮询weight根据服务器的不同处理能力给每个服务器分配不同的权值使其能够接受相应权值数的服务请求。例如服务器 A 的权值被设计成 1B 的权值是 3C 的权值是6则服务器 A、B、C 将分别接受到 10%、30%、60% 的服务请求。此种均衡算法能确保高性能的服务器得到更多的使用率避免低性能的服务器负载过重。3.2 ip-haship_hash我们都知道每个请求的客户端都有相应的 ip 地址该均衡策略中nginx 将会根据相应的 hash 函数对每个请求的 ip 作为关键字得到的 hash 值将会决定将请求分发给相应 Server 进行处理。iphash算法的情况下每一个IP在不变的情况下都会路由到首次请求的服务上。3.2 最少连接数least_conn最少连接也就是说 nginx 会判断后端集群服务器中哪个 Server 当前的 Active Connection 数是最少的那么对于每个新进来的请求nginx 将该其分发给对应的 Server。4. Nginx中的负载均衡配置Nginx 的 stream 模块和 http 模块分别支持四层和七层模块的负载均衡。其用法和支持的负载均衡策略大致相同。首先使用 upstream 指令块 和 server 指令指定上游的服务upstream 指令的用法如下upstream name { ... }官网示例如下下面定义了4台服务器分别是域名、IP端口、socket形式指定地址默认情况下upstream指令块中采用的是加权轮训的方式轮询配置得服务当然我们可以指定一些服务的静态配置比如注定服务的权重、server的最大并发连接max_connsmax_fails 和 fail_timeout失败几次之后将服务标记为故障服务在设置的时间内不在路由到标记为故障的服务。upstream backend {server backend1.example.com weight5;server 127.0.0.1:8080 max_fails3 fail_timeout30s;server unix:/tmp/backend3;server backup1.example.com backup;
}三、 负载均衡实践基础知识梳理完毕接下来进行实践来感受一下相关的概念俗话说的好纸上得来终觉浅绝知此事要躬行希望可以通过这些实验让咱们更加巩固这些技术点。1、Nginx中负载均衡环境准备mac我这边使用的是docker安装的nginx安装教程可以根据我的这篇文章传送门Nginx教程两给SpringBoot服务。首先咱们搭建环境。因为我们之前学习过docker挂载所以这次修改Nginx文件就方便很多需要的同学可以参考docker 挂载、修改文件如果没有进行挂载想要修改文件的可以参考这篇文章。废话不多说直接上case.1.1 两个微服务首先提供两个微服务模拟一份代码两台机器。两个服务都有一个路径相同的对外接口。RestController
Slf4j
public class Demo1LBController {GetMapping(/lb/start)public String demo1() {String str demo1 lb start ...;log.info(str);System.out.println(str);return str;}
}RestController
Slf4j
public class Demo2LBController {GetMapping(/lb/start)public String demo2() {String str demo2 lb start ...;log.info(str);System.out.println(str);return str;}
}1.2 Nginx配置修改upstream 块在http块中用于设置一系列的后端服务器设置反向代理及后端服务器的负载均衡。咱们定义负载均衡的服务叫做myserver然后在 server 块里的 location 配置代理proxy_pass http://myserver;。nginx.config里的配置# ######## 负载均衡开始 ########upstream myserver {server 10.33.148.23:8081;server 10.33.148.23:8082;# server backend1.example.com weight5;# server 127.0.0.1:8080 max_fails3 fail_timeout30s;# server unix:/tmp/backend3;# server backup1.example.com backup;}# ######## 负载均衡结束 ########default.config里的配置location / {root /usr/share/nginx/html;index index.html index.htm;proxy_pass http://myserver;}1.2 验证咱们启动NG之后在浏览器输入http://localhost:8010/lb/start即可得到请求到不同服务的返回默认走的轮询所以都是规律性的返回。2、轮询轮询的配置就是不设置任何静态参数采用 Nginx 默认的负载均衡策略上面的验证就是我这边就做赘述。3、加权轮询顾名思义就是根据服务器的不同处理能力给每个服务器分配不同的权值。具体配置如下8081的服务权重占4/5大家可以在浏览器操作感受一下。4、ip_hash每个请求按访问 ip 的 hash 结果分配这样每个访客固定访问一个后端服务器可以解决 session 的问题。配置上ip hash之后即使有权重也不会重新请求其他的服务上。大家可以操作感受。 ip_hash;5、参数说明weightnumber 设定服务器的权重默认是1权重越大被访问机会越大可以根据机器的配置情况来配置。max_failsnumber 设定Nginx与服务器通信的尝试失败的次数。在fail_timeout参数定义的时间段内如果失败的次数达到此值Nginx就认为服务器不 可用。在下一个fail_timeout时间段服务器不会再被尝试。 失败的尝试次数默认是1。默认配置时http_404状态不被认为是失败的尝试。 可以通过指令proxy_next_upstream 和memcached_next_upstream来配置什么是失败的尝试。fail_timeouttime
统计失败尝试次数的时间段。在这段时间中服务器失败次数达到指定的尝试次数服务器就被认为不可用。默认情况下该超时时间是10秒。 backup
标记为备用服务器。当主服务器不可用以后请求会被传给这些服务器配置这个指令可以实现故障转移。down 标记服务器永久不可用可以跟ip_hash指令一起使用。负载均衡的相关知识就梳理完毕啦本次对 Nginx 中的负载均衡的相关配置指令实战 Nginx 的负载均衡功能同时测试多种负载均衡算法的学习和记录希望可以帮助大家更好的里解Nginx。