十年前我们部署应用时,通常会把所有流量直接打到单台服务器上。随着业务量增长,这种简单架构很快会遇到瓶颈:高峰期服务响应变慢、突发流量导致服务崩溃、单点故障引发全线瘫痪。这些问题催生了负载均衡技术的快速发展。
我经历过多次流量突增导致的线上事故,最严重的一次是某电商大促期间,单台服务器在承受每秒3000请求时直接宕机,造成半小时服务不可用。正是这些教训让我深刻认识到:负载均衡不是可选项,而是现代IT架构的生存必需品。
负载均衡器(Load Balancer)本质上是个"智能流量调度员"。它根据预设算法,将客户端请求合理分配到后端服务器集群。最常见的轮询算法就像餐厅叫号系统,新请求按顺序分配给下一台可用服务器。
但真实场景往往更复杂。比如电商系统需要:
| 类型 | 工作层级 | 典型协议 | 性能 | 功能复杂度 |
|---|---|---|---|---|
| 四层(L4) | 传输层(TCP) | TCP/UDP | 高 | 低 |
| 七层(L7) | 应用层 | HTTP/HTTPS | 中 | 高 |
我在金融项目中选择L7负载均衡,因为它能:
某银行核心系统采用F5方案,其优势在于:
但硬件方案存在明显短板:
这是我为某视频网站配置的Nginx负载均衡片段:
nginx复制upstream video_servers {
server 192.168.1.10:8000 weight=3;
server 192.168.1.11:8000;
server 192.168.1.12:8000 backup;
least_conn;
keepalive 32;
}
server {
listen 443 ssl;
ssl_certificate /path/to/cert.pem;
location / {
proxy_pass http://video_servers;
proxy_set_header Host $host;
}
}
关键配置说明:
weight=3表示该服务器处理3倍流量backup标记备用服务器least_conn使用最小连接数算法现代云原生架构中,我推荐使用Ingress + Service的组合:
yaml复制apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
spec:
rules:
- host: example.com
http:
paths:
- path: /video
pathType: Prefix
backend:
service:
name: video-service
port:
number: 80
这种方案的优势在于:
Istio等Service Mesh方案提供了更精细的控制:
yaml复制apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: bookinfo-ratings
spec:
host: ratings.prod.svc.cluster.local
trafficPolicy:
loadBalancer:
simple: LEAST_CONN
outlierDetection:
consecutiveErrors: 5
interval: 10s
baseEjectionTime: 30s
某次线上事故让我总结出这些经验:
监控这些核心指标至关重要:
bash复制# 查看TCP连接状态
ss -ant | awk '{print $1}' | sort | uniq -c
# 跟踪HTTP请求耗时
curl -w "\n时间统计:\n总时长:%{time_total}\nDNS解析:%{time_namelookup}\n" \
-o /dev/null -s https://example.com
对于日活百万级的系统,我建议采用分层负载方案:
在最近的项目中,这种架构成功支撑了双11期间每秒12万订单的峰值流量。关键是要根据业务特性选择合适的负载均衡策略,并建立完善的监控告警体系。