正在加载,请稍候…

负载均衡:算法、健康检查与会话亲和性

了解负载均衡算法:轮询、最少连接和一致性哈希。学习健康检查、会话持久化以及 Nginx/HAProxy 配置。

负载均衡:算法、健康检查与会话亲和性

负载均衡:算法与配置

负载均衡算法

轮询(Round Robin):         Req1->S1, Req2->S2, Req3->S3, Req4->S1...
                             简单但忽略服务器容量差异

加权轮询(Weighted Round Robin): Server1 (w=3): 3 req, Server2 (w=1): 1 req
                              适用于异构服务器

最少连接(Least Connections):   路由到活动连接最少的服务器
                              更适合长连接(如 WebSocket)

IP 哈希(IP Hash):             hash(client_ip) % server_count
                              同一客户端始终访问同一台服务器

负载均衡:算法、健康检查与会话亲和性示意图

Nginx 负载均衡器

upstream api_servers {
    least_conn;

    server api-1.internal:3000 weight=3 max_fails=3 fail_timeout=30s;
    server api-2.internal:3000 weight=3 max_fails=3 fail_timeout=30s;
    server api-backup.internal:3000 backup;

    keepalive 32;
}

server {
    listen 443 ssl;
    ssl_certificate /etc/ssl/certs/cert.pem;
    ssl_certificate_key /etc/ssl/private/key.pem;

    location /api/ {
        proxy_pass http://api_servers;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_connect_timeout 5s;
        proxy_read_timeout 60s;
        proxy_next_upstream error timeout http_503;
    }
}

负载均衡:算法、健康检查与会话亲和性示意图

健康检查端点

app.get('/health/ready', async (req, res) => {
  const checks = await Promise.allSettled([checkDatabase(), checkRedis()]);
  const healthy = checks.every(c => c.status === 'fulfilled');

  res.status(healthy ? 200 : 503).json({
    status: healthy ? 'healthy' : 'degraded',
    checks: { db: checks[0].status, redis: checks[1].status },
  });
});

负载均衡:算法、健康检查与会话亲和性示意图

会话持久化选项

1. 客户端会话(JWT):
   - 无需亲和性
   - Token 包含会话数据
   - 适用于无状态 API

2. 粘性会话(IP 哈希):
   - 客户端始终访问同一台服务器
   - 问题:负载不均,故障转移丢失会话

3. 共享会话存储(Redis):
   - 任何服务器可处理任何请求
   - 最适合水平扩展

无状态应用设计配合共享存储是实现轻松水平扩展的关键。