Nginx负载均衡
Nginx作为一款高性能的Web服务器、和反向代理服务器,其负载均衡功能通过将客户端请求分发到多台后端服务器,
如下图所示:
当某个后端服务器发生故障时,Nginx 可以将请求转发到其他健康的服务器,保证服务的连续性。
以及, 通过将请求分发到多台服务器上,可以显著提高系统的并发处理能力和吞吐量,应对高并发场景。
而且,可以根据后端服务器的性能差异或当前负载情况,合理地分配请求,提高服务器资源的利用率。
Nginx负载均衡算法
Nginx 的负载均衡算法,会将客户端发送的请求分摊到多个后端服务器(upstream servers)上进行处理,而不是让单个服务器承担所有请求。
在 upstream
模块中配置 server
指令时,可以指定不同的负载均衡算法。
以下是常用的四种:
1.轮循(默认)
Nginx 默认采用轮询算法,按顺序将请求依次分发给各个后端服务器,每台服务器处理的请求数量大致相同。
比如:
请求1 → Server A 请求2 → Server B 请求3 → Server C 请求4 → Server A ……循环继续
优点:
-
实现简单;
-
默认启用,易于上手;
缺点:
-
不考虑服务器当前负载;
-
适用范围受限(对处理速度差异大的节点不友好);
加权模式
加权轮询算法在轮循的基础上,为每个后端服务器设置一个权重值(通过 weight
参数指定)。
权重越高的服务器,在单位时间内接收到的请求数量越多,Nginx 会根据配置的权重比例来分配请求。
upstream backend { server backend1.example.com weight=2; server backend2.example.com weight=1; server backend3.example.com weight=3; } server { listen 80; server_name example.com; location / { proxy_pass http://backend; } }
在这个例子中,backend1
接收到请求的概率是 backend2
的两倍,backend3
接收到请求的概率是 backend2
的三倍。
优点:
-
考虑服务器性能差异;
-
可手动调节负载分配策略;
缺点:
-
权重静态配置,不支持自动调整;
-
实时性能变化无法感知;
ip_hash模式
源地址哈希算法通过对客户端的 IP 地址进行哈希运算,然后将哈希结果与后端服务器的数量取模,得到一个分配给该客户端的固定后端服务器。
这意味着来自同一个 IP 地址的客户端的请求,在后端服务器数量不变的情况下,总是会被分配到同一台服务器。
优点:
-
实现会话粘性(Session粘性);
-
简单高效;
缺点:
-
某个IP请求集中可能导致单点压力;
-
后端变动(增删节点)会大范围影响哈希分布;
最少连接
最少连接数算法会将新的请求分配给当前活跃连接数最少的后端服务器。
Nginx 会实时跟踪每个后端服务器的活动连接数,选择连接数最小的服务器来处理新的请求。
优点:
-
动态感知后端压力;
-
高效利用后端资源;
缺点:
-
依赖连接数统计,复杂度略高;
-
对于短连接请求差异不大;
在实际应用中,选择哪种负载均衡算法需要根据具体的业务需求、后端服务器的性能特点以及对会话保持、负载均衡效果等方面的考虑进行权衡。
通常情况下,加权轮询和最少连接数是更常用的选择,能够更好地适应各种复杂的应用场景。