
负载均衡:算法与配置
负载均衡算法
轮询(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):
- 任何服务器可处理任何请求
- 最适合水平扩展
无状态应用设计配合共享存储是实现轻松水平扩展的关键。