有一个业务场景:有一个http请求的业务接口,这个接口服务,部署在N个业务服务器上面,通过一台对外的nginx服务器对外提供访问入口,如果压力大,可以通过增加业务服务器来抗住压力,但是一台对外的nginx服务器如果也到达了瓶颈,要怎么解决,有什么解决方案,有什么具体的网络架构解决
这是一个非常典型的负载均衡器成为单点瓶颈的问题。当业务服务器可以水平扩展,但入口的Nginx成为瓶颈时,需要采用负载均衡器集群或分布式入口的架构来解决。
一、解决方案概览
1. DNS轮询/智能DNS(最简单)
# DNS记录配置
www.example.com A 10.0.0.1
www.example.com A 10.0.0.2
www.example.com A 10.0.0.3优点:简单易实现
缺点:无健康检查、会话保持困难、TTL缓存问题
2. 商用硬件负载均衡器
F5 BIG-IP、Citrix ADC等
优点:性能极高、功能丰富
缺点:成本高昂、厂商锁定
3. 软件负载均衡器集群(推荐方案)
二、具体网络架构方案
方案1:LVS + Keepalived 集群(四层负载均衡)
客户端 → DNS轮询 → LVS主备集群 → Nginx集群 → 业务服务器部署架构:
# LVS配置示例(DR模式)
# 虚拟IP: 192.168.1.100
# 真实服务器: 192.168.1.101-110
# LVS主节点配置
virtual_server 192.168.1.100 80 {
delay_loop 6
lb_algo wrr # 加权轮询
lb_kind DR # 直接路由模式
protocol TCP
real_server 192.168.1.101 80 {
weight 1
TCP_CHECK {
connect_timeout 3
}
}
# ... 更多real_server
}优点:
LVS基于内核,性能极高(可处理百万并发)
可与Nginx组成多层负载均衡
成本低廉,完全开源
方案2:Nginx集群 + 一致性哈希
客户端 → DNS/GSLB → Nginx集群 → 业务服务器Nginx集群配置:
# 使用nginx-sticky-module或hash策略
upstream backend_cluster {
hash $remote_addr consistent; # 一致性哈希
server 10.0.1.1:8080;
server 10.0.1.2:8080;
server 10.0.1.3:8080;
# 可以扩展到几十个Nginx节点
}
# 每个Nginx节点配置
server {
listen 80;
location / {
proxy_pass http://backend_cluster;
}
}方案3:云原生架构(Kubernetes Ingress + Service)
# Kubernetes Ingress Controller 自动扩展
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-ingress-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-ingress-controller
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70架构:
客户端 → 云服务商LB/ELB → Ingress Nginx Pods → Service → 业务Pods三、企业级推荐架构
多层负载均衡架构
┌─────────────────┐
│ 智能DNS/GSLB │
│ (基于地理位置/健康检查) │
└─────────┬───────┘
│
┌───────────────────────────┼───────────────────────────┐
│ │ │
┌───────▼───────┐ ┌─────────▼─────────┐ ┌─────────▼─────────┐
│ LVS集群-区域1 │ │ LVS集群-区域2 │ │ LVS集群-区域3 │
│ (主备+Keepalived)│ │ (主备+Keepalived)│ │ (主备+Keepalived)│
└───────┬───────┘ └─────────┬─────────┘ └─────────┬─────────┘
│ │ │
┌───────▼───────┐ ┌─────────▼─────────┐ ┌─────────▼─────────┐
│ Nginx集群-区域1 │ │ Nginx集群-区域2 │ │ Nginx集群-区域3 │
│ (10-20个节点) │ │ (10-20个节点) │ │ (10-20个节点) │
└───────┬───────┘ └─────────┬─────────┘ └─────────┬─────────┘
│ │ │
└───────────────────────────┼───────────────────────────┘
│
┌─────────▼─────────┐
│ 统一配置中心 │
│ (Consul/Nacos) │
└─────────┬─────────┘
│
┌───────────────────────────┼───────────────────────────┐
│ │ │
┌───────▼───────┐ ┌─────────▼─────────┐ ┌─────────▼─────────┐
│ 业务服务器集群1 │ │ 业务服务器集群2 │ │ 业务服务器集群N │
│ (100+节点) │ │ (100+节点) │ │ (100+节点) │
└───────────────┘ └───────────────────┘ └───────────────────┘四、详细实施步骤
步骤1:确认瓶颈点
# 监控Nginx性能
top -p $(pgrep nginx | head -1)
netstat -ant | grep :80 | wc -l
# 查看Nginx状态
curl http://nginx-status/stats步骤2:实施LVS集群(示例配置)
# 1. 安装LVS和Keepalived
yum install ipvsadm keepalived -y
# 2. 配置Keepalived
cat > /etc/keepalived/keepalived.conf << EOF
vrrp_instance VI_1 {
state MASTER # BACKUP在备机
interface eth0
virtual_router_id 51
priority 100 # 备机设为90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100
}
}
EOF
# 3. 启动服务
systemctl start keepalived步骤3:配置健康检查和监控
# Nginx upstream健康检查
upstream backend {
zone backend 64k;
server 10.0.1.1:80 max_fails=3 fail_timeout=30s;
server 10.0.1.2:80 max_fails=3 fail_timeout=30s;
# 主动健康检查
health_check interval=5s fails=3 passes=2;
}五、高级优化方案
1. DPDK优化版Nginx
使用支持DPDK的Nginx版本
性能可提升5-10倍
2. CDN + 边缘计算
静态内容通过CDN分发
动态API路由到最近的入口节点
3. Service Mesh方案
客户端 → Istio Ingress Gateway → Envoy Sidecar → 业务服务六、选择建议
推荐实施路径:
先验证瓶颈确实在Nginx(可能是配置问题)
实施LVS主备方案作为过渡
扩展为LVS集群 + Nginx集群
考虑引入智能DNS/GSLB做全局负载
关键提醒:
确保会话保持策略(sticky session或共享session存储)
实施完整的监控告警(LVS/Nginx健康状态)
准备回滚方案,避免影响线上业务
考虑安全防护(WAF、DDoS防护)的集成
这种架构可以支持每秒数十万到百万级别的并发请求,满足绝大多数互联网公司的需求。