1. 轮询(round - robin)
- 原理:这是 Nginx 默认的负载均衡算法。它会按照服务器列表的顺序依次将客户端请求分发到各个后端服务器,当所有服务器都被访问过一次后,再从头开始循环。
- 优点:简单公平,适用于后端服务器性能相近的场景,能平均分配请求负载。
- 缺点:没有考虑后端服务器的实际负载情况,如果服务器性能差异较大,可能会导致性能强的服务器资源利用不充分,而性能弱的服务器过载。
- 配置示例:
upstream backend {
server 192.168.1.100:8080;
server 192.168.1.101:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
2. 加权轮询(weighted round - robin)
- 原理:在轮询算法的基础上,为每个后端服务器分配一个权重值。权重值越高的服务器,在分发请求时被选中的概率就越大。通常权重值会根据服务器的硬件配置、处理能力等因素来设置。
- 优点:可以根据服务器的实际性能合理分配请求,提高整体系统的性能和资源利用率。
- 配置示例:
upstream backend {
server 192.168.1.100:8080 weight=3;
server 192.168.1.101:8080 weight=1;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
在上述示例中,192.168.1.100:8080
服务器的权重为 3,192.168.1.101:8080
服务器的权重为 1,意味着在分发请求时,前者被选中的概率是后者的 3 倍。
3. IP 哈希(ip_hash)
- 原理:根据客户端的 IP 地址进行哈希计算,将相同 IP 地址的客户端请求始终分发到同一台后端服务器。这样可以保证来自同一客户端的请求会被处理到同一台服务器上,对于一些需要保持会话状态的应用场景非常有用,例如用户登录状态、购物车信息等。
- 优点:可以有效解决会话保持问题,避免用户在不同服务器之间切换导致的会话丢失问题。
- 缺点:如果某一个客户端的请求量过大,可能会导致该客户端对应的服务器负载过高。
- 配置示例:
upstream backend {
ip_hash;
server 192.168.1.100:8080;
server 192.168.1.101:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
4. 最少连接(least - connections)
- 原理:Nginx 会将新的请求分发到当前连接数最少的后端服务器上。这种算法考虑了服务器的实际负载情况,优先选择负载较轻的服务器来处理新请求,从而使各个服务器的负载更加均衡。
- 优点:能更好地适应后端服务器负载动态变化的情况,避免某些服务器因为连接过多而性能下降。
- 配置示例:
upstream backend {
least_conn;
server 192.168.1.100:8080;
server 192.168.1.101:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
5. 加权最少连接(weighted least - connections)
- 原理:在最少连接算法的基础上,为每个后端服务器分配一个权重值。当选择服务器时,不仅考虑服务器的当前连接数,还会结合权重值进行综合计算。权重高的服务器在连接数较少时,会更优先被选中处理新请求。
- 优点:综合考虑了服务器的性能和当前负载情况,能更合理地分配请求。
- 配置示例:
upstream backend {
least_conn;
server 192.168.1.100:8080 weight=3;
server 192.168.1.101:8080 weight=1;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
6. 通用哈希(generic hash)
- 原理:可以根据任意的键(如 URL、请求参数等)进行哈希计算,然后根据哈希结果将请求分发到后端服务器。这种算法可以根据具体的业务需求灵活地决定请求的分发规则。
- 优点:灵活性高,适用于一些特殊的业务场景,例如根据用户 ID 进行请求分发,确保同一用户的请求始终由同一台服务器处理。
- 配置示例:
upstream backend {
hash $request_uri;
server 192.168.1.100:8080;
server 192.168.1.101:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
在上述示例中,根据请求的 URI 进行哈希计算,将相同 URI 的请求分发到同一台服务器。