一、引言
明人不说暗话,下面来解析一下 Nginx 的负载均衡。需要有 Linux 和 Nginx 环境哈。
二、nginx负载均衡的作用
高并发:负载均衡通过算法调整负载,尽力均匀的分配应用集群中各节点的工作量,以此提高应用集群的并发处理能力(吞吐量)。
伸缩性:添加或减少服务器数量,然后由负载均衡进行分发控制。这使得应用集群具备伸缩性。
高可用:负载均衡器可以监控候选服务器,当服务器不可用时,自动跳过,将请求分发给可用的服务器。这使得应用集群具备高可用的特性。
安全防护:有些负载均衡软件或硬件提供了安全性功能,如:黑白名单处理、防火墙,防 DDos 攻击等
三、upstream配置
首先给大家说下 upstream 这个配置,写一组被代理的服务器地址,然后配置负载均衡的算法。这里的被代理服务器地址有两种写法。
第一种方式
upstream testapp { server ip:端口; #需要代理的服务器地址ipserver ip:端口; #需要代理的服务器地址ip}server {listen 80;server_name localhost;location / { proxy_pass http://testapp; #请求转向 testapp 定义的服务器列表 }
}
第二种方式
upstream mysvr { server http://ip:端口; #需要代理的服务器ip和端口server http://ip:端口; #需要代理的服务器ip和端口}server {listen 80;server_name localhost;location / { proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表 }
}
示例
我们使用第一种方法准备三台机器
代理器 :10.12.153.41
服务器1 :10.12.153.222
服务器2:10.12.153.140
首先保证服务器1和2能够正常访问到web页面
现在配置代理端的nginx配置文件
配置完成后重新加载就可以进入浏览器测试了
我们通过访问代理器10.12.153.41访问到了两个服务器的页面
默认访问页面是轮询的,什么是轮询下面会讲到哈
四、负载均衡算法
upstream 支持4种负载均衡调度算法:
1、
轮询(默认)
:每个请求按时间顺序逐一分配到不同的后端服务器;2、
ip_hash
:每个请求按访问IP的hash结果分配,同一个IP客户端固定访问一个后端服务器。可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。3、
url_hash
:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。后台服务器为缓存的时候提高效率。4、
fair
:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx
本身是不支持fair
的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair
模块。
负载均衡调度算法配置示例
1、热备backup
当一台服务器发生事故时,才启用第二台服务器给提供服务
服务器处理请求的顺序为 001 001 001 001 001 001 突然001出现故障这是访问页面则会是002 002 002 002 ....
2、轮询weight
nginx默认就是轮询其权重默认为1,服务器处理请求的顺序:001 002 001 002 001 002....
weight的默认值为1可以不写。上面的upstream配置实例中使用的就是普通轮询。
3、加强轮询weight
即可以使用weight修改轮询次数,下面的配置轮询访问显示为001 001 001 002 002 001 001 001 002 002 ...
4、ip_hash
nginx会让相同的客户端ip请求相同的服务器,使用ip_hash这种负载均衡以后,可以保证用户的每一次会话都只会发送到同一台服务器上
注意事项
- 一旦使用了ip_hash,当我们需要移除一台服务器的时候,不能直接删除这个配置项,而是需要在这台服务器配置后面加上关键字down,表示不可用;
- 因为如果直接移除配置项,会导致hash算法发生更改,后续所有的请求都会发生混乱;
5、nginx负载均衡配置状态参数
down,表示当前的server暂时不参与负载均衡。
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误
fail_timeout,在经历了max_fails次失败后,暂停服务的时间单位秒。max_fails可以和fail_timeout一起使用。
例
10.12.153.222 轮循两次且请求2次后失败,失败后暂停服务2秒
10.12.153.140 轮循三次且请求2次后失败,失败后暂停服务1秒
五、7层协议和4层协议介绍
7层负载和4层负载的区别
四层负载与七层负载最大的区别就是效率与功能的区别。
四层负载架构设计比较简单,无需解析具体的消息内容,在网络吞吐量及处理能力上会相对比较高,
而七层负载均衡的优势则体现在功能多,控制灵活强大。
在具体业务架构设计时,使用七层负载或者四层负载还得根据具体的情况综合考虑。
七层协议
OSI(Open System Interconnection)是一个开放性的通行系统互连参考模型,他是一个定义的非常好的协议规范,共包含七层协议
如图显示
4层协议
TCP/IP协议 之所以说TCP/IP是一个协议族,是因为TCP/IP协议包括TCP、IP、UDP、ICMP、RIP、TELNETFTP、SMTP、ARP、TFTP等许多协议,这些协议一起称为TCP/IP协议。
从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层、网络层、传输层、应用层。
nginx在1.9.0的时候,增加了一个 stream 模块,用来实现四层协议(网络层和传输层)的转发、代理、负载均衡等。stream模块的用法跟http的用法类似,允许我们配置一组TCP或者UDP等协议的监听,然后通过proxy_pass来转发我们的请求,通过upstream添加多个后端服务,实现负载均衡
扩展
TCP (传输控制协议)和 UDP (用户数据报协议) 是两种不同的网络通信协议,它们在传输数据的方式可靠性、传输速度和应用场景等方面存在一些区别。
1.传输方式
TCP 是一种面向连接的协议,它在传输数据之前需要先建立连接,然后才能传输数据。而 UDP 是一种无连接的协议,它不需要建立连接就可以直接传输数据。2.可靠性:
TCP 是一种可靠的协议,它可以保证数据的传输不会出现丢失、重复或乱序等问题。它通过确认机制.超时重传和滑动窗口等技术来保证数据的可靠性。而 UDP 是一种不可靠的协议,它不能保证数据的传输不会出现丢失、重复或乱序等问题。
3.传输速度:
TCP 的传输速度相对较慢,因为它需要建立连接、确认数据的传输和进行流量控制等操作。而 UDP 的传输速度相对较快,因为它不需要建立连接和进行流量控制等操作。
4.应用场景:
TCP 适用于需要可靠传输数据的应用场景,例如文件传输、电子邮件、远程登录等。而 UDP 适用于对传输速度要求较高,但对数据可靠性要求不高的应用场景,例如视频会议、实时游戏、DNS 解析等。
总的来说,TCP 和 UDP 都有各自的优缺点,需要根据具体的应用场景来选择使用哪种协议。