负载均衡
单台服务器经常会发生性能瓶颈,这时候我们可以利用 Nginx 提供的负载均衡能力对服务器进行横向扩展,然后将流量按照负载算法划分到不同的服务器上去。这篇文档详细描述了如何在 Nginx 中配置负载均衡。
七层负载均衡和四层负载均衡
7 层负载均衡指的是工作在应用层,应用层的负载均衡其实现功能更多,但是相对于4层负载均衡其性能会更弱。四层负载均衡使用 TCP/UDP 协议工作的,在传输层,通过 IP 加上端口的形式实现的。
OSI 模型层级 | TCP/IP 模型层级 | 名称 | 说明 |
|---|---|---|---|
第七层 | 应用层 | 应用层 | 与用户行为交互 |
第六层 | 表示层 | 定义数据格式以及数据加密 | |
第五层 | 会话层 | 创建、管理以及销毁会话 | |
第四层 | 传输层 | 传输层 | 创建、管理请求端到响应端的链接 |
第三层 | 网络层 | 网络层 | 请求端的 IP 地址 |
第二层 | 链路层 | 数据链路层 | 提供介质访问与链路管理 |
第一层 | 物理层 | 传输介质和物理媒介 |
常见的四层负载均衡,有硬件的 F5,软件的 LVS,还有 Haroxy 支持 4 层和 7 层。而新版本(V1.9 以后,之前只支持 HTTP 协议的负载均衡)的 Nginx 也是支持 4 层和 7层负载均衡的。而 Apache 只支持 7 层负载均衡。
另外,也可以根据 DNS 地域负载均衡。它可以根据你的地域来访问就近的服务器。它的优点是将负载均衡的工作交给了 DNS 服务器,根据地域来划分,提升访问访问速度。
配置七层负载均衡
在 Nginx 中配置七层负载均衡并不复杂,首先需要配置 upsteam ,示例配置如下:
upstream的一些配置参数如下表所示:
参数 | 说明 |
|---|---|
| 设置最大连接数,默认为 0,不设限,限流作用 |
| 缓慢开始,在设置时间内,将权重从0到指定权重 |
| 表示该服务器下线 |
| 表示该服务器是备份使用,其他服务器宕机才启用 |
| 最大错误次数,达到后该服务器下线 |
| 设置请求失败后多少秒不再访问该服务器,默认为10秒 |
| 设置服务器权重 |
然后在 server 下的 location 中配置转发:
轮询策略
Nginx 提供了轮询、加权轮询、IP Hash、一致性 Hash、URL Hash、Random 等轮询策略,配置如下:
IP hash 是根据hash(ip) % node_count = index 算法来实现的。另外,使用 hash 策略的时候,如果要下线某台服务器,只能标记为 down 不能直接删除。
因为采用 IP Hash 的方式,如果某台服务器下线,会导致所有的取模发生变化,会话和缓存全部丢失。所以可以采用一致性 HASH 算法,减少因为服务器下线或者增加的影响。
4 层负载均衡
Nginx 的开源版本并不直接支持 4 层负载均衡,它主要专注于第 7 层(应用层)的负载均衡,如 HTTP、HTTPS 协议。
但是,通过 Nginx 的 stream 模块,可以实现对 TCP/UDP 等四层协议的代理和简单的负载均衡功能,不过其功能相对有限。
而 Nginx Plus 是 Nginx 官方提供的商业版本,相比开源版本在功能上更加丰富和强大。Nginx Plus 在 4 层负载均衡方面提供了更全面且高级的功能, 比如会话持久化、动态重新配置、主动健康检查等,非常适合对 4 层负载均衡有较高要求的场景。
所以,这里就不详细描述这块内容了。后面会讲解通过 LVS 来实现 4 层负载均衡。
总结
本文详细介绍了使用 Nginx 实现负载均衡的方法。首先指出单台服务器可能面临的性能瓶颈问题,并提出通过 Nginx 的负载均衡功能进行横向扩展的解决方案。 文章分析了七层(应用层)和四层(传输层)负载均衡的差异,指出七层负载均衡功能更全面,但性能略弱于四层负载均衡。文中列举了不同层级的 OSI 模型和 TCP/IP 模型,以及常见的四层负载均衡产品。
接着,文章深入讲解了在 Nginx 中配置七层负载均衡的方法,包括 upstream 配置及其参数的详细说明。需要注意 slow_start 和 backup 参数在某些 情况下的使用限制。然后,介绍了 server 下的 location 设置,以实现流量转发。
文章还介绍了 Nginx 支持的多种轮询策略,如加权轮询、IP Hash、一致性 Hash、URL Hash 等,并解释了 IP Hash 策略在服务器下线时的处理要求。
最后,文档说明了 Nginx 开源版本不直接支持四层负载均衡,主要聚焦于七层协议,但可以通过 stream 模块实现有限的四层协议负载均衡。 而 Nginx Plus 作为商业版本,提供更加丰富和强大的四层负载均衡功能,适用于更高要求的场景。