最早的业务访问流量不是很大,基本上都是基于单体节点部署,但是后期呢,随着业务的增长,流量越来越大,单台服务器所受到的访问压力也在不断增大,时间一长,性能无法跟上现在的业务,最终导致宕机发生,最终导致系统瘫痪并且无法处理用户的请求。因此,引入了负载均衡的概念,巧妙地解决了nginx服务器负载访问压力大和宕机的问题。
因此在这种背景下,引入负载均衡技术可带来的收益:
-
系统的高可用:当某个节点宕机后可以迅速将流量转移至其他节点。
-
系统的高性能:多台服务器共同对外提供服务,为整个系统提供了更高规模的吞吐。
-
系统的拓展性:当业务再次出现增长或萎靡时,可再加入/减少节点,灵活伸缩。
当然呢,实现负载均衡解决问题主要分为两种方案,一种是在硬件层面,另外一种是在软件层面,由于公司做业务重点在于节省资金,所以以下几点是关于软件层面进行阐述。
一、介绍Nginx服务器
二、理解负载均衡的概念
三、什么是 Nginx 负载均衡
Nginx 如何实现负载均衡?这就要从正向代理和反向代理说起了
- 正向代理
正向代理(Forward Proxy)最大的特点是,客户端非常明确要访问的服务器地址,它代理客户端,替客户端发出请求。比如:科学上网,俗称翻墙(警告⚠️:翻墙操作违反相关法律规定,本文只是为了解释正向代理向读者举个例子,仅供学习参考,切勿盲目翻墙)。
假设客户端想要访问 Google,它明确知道待访问的服务器地址是 https://www.google.com/,但由于条件限制,它找来了一个能够访问到 Google 的”朋友”:代理服务器。客户端把请求发给代理服务器,由代理服务器代替它请求 Google,最终再将响应返回给客户端。这便是一次正向代理的过程,该过程中服务器并不知道真正发出请求的是谁。
- 反向代理
那么,随着请求量的爆发式增长,服务器觉得自己一个人始终是应付不过来,需要兄弟服务器们帮忙,于是它喊来了自己的兄弟以及代理服务器朋友。此时,来自不同客户端的所有请求实际上都发到了代理服务器处,再由代理服务器按照一定的规则将请求分发给各个服务器。
这就是反向代理(Reverse Proxy),反向代理隐藏了服务器的信息,它代理的是服务器端,代其接收请求。换句话说,反向代理的过程中,客户端并不知道具体是哪台服务器处理了自己的请求。如此一来,既提高了访问速度,又为安全性提供了保证。
在这之中,反向代理需要考虑的问题是,如何进行均衡分工,控制流量,避免出现局部节点负载过大的问题。通俗的讲,就是如何为每台服务器合理的分配请求,使其整体具有更高的工作效率和资源利用率。
四、负载均衡常用算法
1、轮询
轮询为负载均衡中较为基础也较为简单的算法,它不需要配置额外参数。假设配置文件中共有 台服务器,该算法遍历服务器节点列表,并按节点次序每轮选择一台服务器处理请求。当所有节点均被调用过一次后,该算法将从第一个节点开始重新一轮遍历。
特点:由于该算法中每个请求按时间顺序逐一分配到不同的服务器处理,因此适用于服务器性能相近的集群情况,其中每个服务器承载相同的负载。但对于服务器性能不同的集群而言,该算法容易引发资源分配不合理等问题。
2、加权轮询
为了避免普通轮询带来的弊端,加权轮询应运而生。在加权轮询中,每个服务器会有各自的 weight
。一般情况下,weight
的值越大意味着该服务器的性能越好,可以承载更多的请求。该算法中,客户端的请求按权值比例分配,当一个请求到达时,优先为其分配权值最大的服务器。
特点:加权轮询可以应用于服务器性能不等的集群中,使资源分配更加合理化。
3、IP 哈希(IP hash)
ip_hash
依据发出请求的客户端 IP 的 hash 值来分配服务器,该算法可以保证同 IP 发出的请求映射到同一服务器,或者具有相同 hash 值的不同 IP 映射到同一服务器。
特点:该算法在一定程度上解决了集群部署环境下 Session 不共享的问题。
“Session 不共享问题是说,假设用户已经登录过,此时发出的请求被分配到了 A 服务器,但 A 服务器突然宕机,用户的请求则会被转发到 B 服务器。但由于 Session 不共享,B 无法直接读取用户的登录信息来继续执行其他操作。
实际应用中,我们可以利用 ip_hash
,将一部分 IP 下的请求转发到运行新版本服务的服务器,另一部分转发到旧版本服务器上,实现灰度发布。再者,如遇到文件过大导致请求超时的情况,也可以利用 ip_hash
进行文件的分片上传,它可以保证同客户端发出的文件切片转发到同一服务器,利于其接收切片以及后续的文件合并操作。
4、URL hash
url_hash
是根据请求的 URL 的 hash 值来分配服务器。该算法的特点是,相同 URL 的请求会分配给固定的服务器,当存在缓存的时候,效率一般较高。然而 Nginx 默认不支持这种负载均衡算法,需要依赖第三方库。
5、最小连接数(Least Connections)
假设共有 台服务器,当有新的请求出现时,遍历服务器节点列表并选取其中连接数最小的一台服务器来响应当前请求。连接数可以理解为当前处理的请求数。