Skip to content

⚖️ 负载均衡

什么是负载均衡?

想象一个超市收银台——只有一个收银台(服务器)时,排长队。开了多个收银台后,顾客被分配到不同台前,速度飞快。负载均衡就是这个分配顾客的调度员

轮询(Round Robin)——默认策略

nginx
# 定义后端服务器组
upstream backend_servers {
    server 192.168.1.101:3000;
    server 192.168.1.102:3000;
    server 192.168.1.103:3000;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

请求会按顺序分配:第 1 个→服务器 1,第 2 个→服务器 2,第 3 个→服务器 3,第 4 个→服务器 1,以此类推。

加权轮询(Weighted Round Robin)

nginx
upstream backend_servers {
    server 192.168.1.101:3000 weight=5;   # 高配服务器,多分点流量
    server 192.168.1.102:3000 weight=3;   # 中配
    server 192.168.1.103:3000 weight=1;   # 低配,少分点
}

IP Hash——会话保持

nginx
upstream backend_servers {
    ip_hash;                              # 同一个 IP 的请求始终发到同一台
    server 192.168.1.101:3000;
    server 192.168.1.102:3000;
}

💡 提示: 💡 什么时候用 ip_hash?当后端用 Session(不是 JWT)做登录状态管理时,用户的每次请求必须到同一台服务器。

最少连接(Least Connections)

nginx
upstream backend_servers {
    least_conn;                           # 优先分配给连接数最少的服务器
    server 192.168.1.101:3000;
    server 192.168.1.102:3000;
    server 192.168.1.103:3000;
}

健康检查和故障转移

nginx
upstream backend_servers {
    server 192.168.1.101:3000 max_fails=3 fail_timeout=30s;
    server 192.168.1.102:3000 max_fails=3 fail_timeout=30s;
    server 192.168.1.103:3000 backup;     # 备份服务器,平时不用
}

📝 备注: 📝 max_fails=3 fail_timeout=30s意思是:如果连续 3 次请求失败,就标记该服务器为不可用,30 秒后再尝试。