Skip to content

负载均衡算法

Nginx提供多种负载均衡算法,可以根据不同的业务需求选择合适的算法。

轮询(Round Robin)

默认算法

按顺序依次分配请求到后端服务器。

nginx
upstream backend {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

server {
    listen 80;
    server_name lb.example.com;

    location / {
        proxy_pass http://backend;
    }
}

特点

  • 简单易用
  • 请求均匀分配
  • 不考虑服务器性能差异

最少连接(Least Connections)

配置方法

将请求分配到当前连接数最少的服务器。

nginx
upstream backend {
    least_conn;

    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

server {
    listen 80;
    server_name lb.example.com;

    location / {
        proxy_pass http://backend;
    }
}

特点

  • 考虑服务器当前负载
  • 适合请求处理时间差异较大的场景
  • 需要配合keepalive使用

IP哈希(IP Hash)

配置方法

根据客户端IP地址分配请求,同一IP的请求总是分配到同一台服务器。

nginx
upstream backend {
    ip_hash;

    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

server {
    listen 80;
    server_name lb.example.com;

    location / {
        proxy_pass http://backend;
    }
}

特点

  • 会话保持
  • 适合有状态的应用
  • 可能导致负载不均

一致性哈希(Hash)

配置方法

根据自定义key进行哈希分配。

nginx
upstream backend {
    hash $request_uri consistent;

    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

server {
    listen 80;
    server_name lb.example.com;

    location / {
        proxy_pass http://backend;
    }
}

特点

  • 灵活的哈希key
  • 支持一致性哈希
  • 适合缓存场景

加权轮询(Weighted Round Robin)

配置方法

根据权重分配请求,权重高的服务器分配更多请求。

nginx
upstream backend {
    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=2;
    server 192.168.1.12:8080 weight=1;
}

server {
    listen 80;
    server_name lb.example.com;

    location / {
        proxy_pass http://backend;
    }
}

特点

  • 考虑服务器性能差异
  • 灵活调整权重
  • 适合服务器性能不均的场景

加权最少连接(Weighted Least Connections)

配置方法

结合权重和连接数进行分配。

nginx
upstream backend {
    least_conn;

    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=2;
    server 192.168.1.12:8080 weight=1;
}

server {
    listen 80;
    server_name lb.example.com;

    location / {
        proxy_pass http://backend;
    }
}

特点

  • 综合考虑权重和负载
  • 适合复杂场景
  • 需要仔细调优

随机(Random)

配置方法

随机选择后端服务器。

nginx
upstream backend {
    random;

    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

server {
    listen 80;
    server_name lb.example.com;

    location / {
        proxy_pass http://backend;
    }
}

特点

  • 简单快速
  • 可能导致负载不均
  • 适合测试环境

算法对比

算法会话保持负载均衡性能适用场景
轮询通用场景
最少连接很好请求处理时间差异大
IP哈希一般有状态应用
一致性哈希缓存场景
加权轮询服务器性能不均
加权最少连接很好复杂场景
随机一般测试环境

选择建议

无状态应用

推荐使用轮询或最少连接:

nginx
upstream backend {
    least_conn;

    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

有状态应用

推荐使用IP哈希:

nginx
upstream backend {
    ip_hash;

    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

服务器性能不均

推荐使用加权轮询:

nginx
upstream backend {
    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=1;
}

缓存场景

推荐使用一致性哈希:

nginx
upstream backend {
    hash $request_uri consistent;

    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

总结

负载均衡算法的关键点:

  • 轮询:简单通用,适合大多数场景
  • 最少连接:考虑负载,适合请求处理时间差异大
  • IP哈希:会话保持,适合有状态应用
  • 一致性哈希:灵活key,适合缓存场景
  • 加权:考虑性能差异,适合服务器性能不均

根据业务需求选择合适的负载均衡算法。