
昨天618,我负责的香港机房 API 集群在凌晨 1 点突遭 20 万 QPS 的流量冲击。虽然业务没垮,但核心网关延迟从 40 ms 抬升到 280 ms,告警声此起彼伏。我痛定思痛,亲手把整套负载均衡架构推倒重来。本文记录我在香港服务器环境下落地一套 L4+L7 双层负载均衡 + API 网关集群 的全过程——不只是配置,更涵盖内核调优、故障演练与监控闭环,帮助各位在高并发场景下守住网关稳定性。
1 | 需求与约束
| 维度 | 目标 | 备注 |
|---|---|---|
| 峰值并发 | ≥ 150 k QPS | 预计 2 年容量 |
| 延迟 P99 | ≤ 120 ms | 含上游业务 |
| 可用性 | ≥ 99.99 % | 单机房容灾 |
| 网络 | BGP 10 GbE | 两条运营商线路 |
| 机房 | 香港葵涌 + 将军澳 | 2 ms RTT |
2 | 总体拓扑
┌─────────────BGP Anycast VIP──────────────┐
│ LVS-DR │
客户端 ───► [Internet] ─► ☆VIP(203.XX.XX.1) ─► keepalived+ipvs[L4] (2 台)
│
┌─────────────────┴─────────────────┐
│ │
HAProxy/L7 (4 台) HAProxy/L7 (4 台)
(front-proxy、TLS offload) (Overflow 备用池)
│ │
┌────────┴────────┐ ┌──────────┴─────────┐
Kong/APISIX 网关 (8 台) … … Kong/APISIX 网关 (8 台)
│ │
后端微服务集群(k8s)
- L4 层(LVS-DR):负责 GARP/VIP、流量分发,转发效率接近线速。
- L7 层(HAProxy):做 TLS 终止、HTTP/2 复用、速率限制。
- API 网关层:统一鉴权、限流、审计;选型 Apache APISIX(LuaJIT 性能优势)。
3 | 栈选型与版本
| 组件 | 版本 | 关键特性 |
|---|---|---|
| 内核 | 6.8.9-ck | BBRv3 + io_uring |
| LVS/keepalived | keepalived-2.3.7 | VRRP + LVS-DR |
| HAProxy | 2.9-stable | native HTTP/2、QUIC、multi-proc |
| APISIX | 3.8.0-alpine | 动态 Lua 插件热加载 |
| Prometheus | 2.54 + Thanos | 跨机房长保留 |
| 硬件 | 2×Xeon 6414U / 256 GB / 2×25 Gbps NIC / NVMe RAID-10 |
4.1 内核 & 网络栈
# /etc/sysctl.d/99-gw-tune.conf
net.ipv4.ip_forward = 1
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 250000
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_sack = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_rmem = 4096 131072 134217728
net.ipv4.tcp_wmem = 4096 131072 134217728
net.ipv4.tcp_mem = 524288 1048576 2097152
net.ipv4.ip_local_port_range = 1024 65000
fs.file-max = 10240000
用 tuned-adm profile network-throughput 搭配 IRQ-balance,把万兆网卡中断绑到 NUMA-local 的 CPU core,实测丢包率从 0.05 %→0.0003 %。
4.2 ulimit
cat >> /etc/security/limits.d/gw.conf <<'EOF'
* soft nofile 1048576
* hard nofile 1048576
* soft nproc 65536
* hard nproc 65536
EOF
5 | 部署步骤
5.1 LVS-DR + keepalived
安装
dnf install -y ipvsadm keepalived
modprobe ip_vs_rr
配置 VRRP + ipvs (/etc/keepalived/keepalived.conf)
vrrp_instance VI_1 {
state MASTER
interface eno1
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass MySecretPwd
}
virtual_ipaddress {
203.0.113.1/32 dev eno1 label eno1:1
}
}
virtual_server 203.0.113.1 443 {
delay_loop 2
lb_algo sch_rr
lb_kind DR
protocol TCP
real_server 10.0.0.21 443 {
weight 100
TCP_CHECK {
connect_timeout 2
nb_get_retry 3
delay_before_retry 1
connect_port 443
}
}
}
后端节点 采用 LVS 旁路回程(lo:0 添加 VIP),并屏蔽 ARP:
ip addr add 203.0.113.1/32 dev lo label lo:0
sysctl -w net.ipv4.conf.lo.arp_ignore=1
sysctl -w net.ipv4.conf.lo.arp_announce=2
5.2 HAProxy 前端
编译开启 QUIC & Lua
make TARGET=linux-glibc USE_OPENSSL=1 USE_QUIC=1 USE_LUA=1
核心配置(/etc/haproxy/haproxy.cfg)
nbthread 16
tune.maxaccept -1
defaults
timeout connect 3s
timeout client 50s
timeout server 50s
option http-use-htx
option http-buffer-request
option log-health-checks
frontend fe_https
bind :443 ssl crt /etc/pki/tls/certs/api.pem alpn h2,http/1.1
mode http
http-request set-header X-Real-IP %[src]
default_backend be_apisix
backend be_apisix
balance fwrr
stick-table type ip size 1m expire 30s
stick on src
server apisix01 10.0.1.11:9080 weight 100 check inter 1s rise 3 fall 2
server apisix02 10.0.1.12:9080 weight 100 check
5.3 APISIX 网关
# conf/config.yaml 片段
apisix:
node_listen: 9080
enable_heartbeat: true
enable_admin: true
allow_admin: 0.0.0.0/0
enable_ipv6: false
nginx_config:
worker_processes: "auto"
event:
worker_connections: 65535
http:
lua_shared_dicts:
prometheus-metrics: 512m
plugin_attr:
prometheus:
export_addr:
ip: "0.0.0.0"
port: 9091
小技巧:LuaJIT 2.1 jit.opt.start(“maxtrace=4000”) 能把复杂限流策略的 CPU 消耗降 12 %。
6 | 高并发调优要点
| 层级 | 关键参数 | 调优理由 |
|---|---|---|
| LVS/ipvs | --sched-rr + conn_reuse_mode=2 |
减少 L4 竞争 |
| HAProxy | tune.bufsize 32768 |
减少多路复用复制 |
| APISIX | worker_rlimit_nofile 1M |
大量长连接 |
| 系统 | IRQ CPU 亲和性 | 缩短 cache miss |
- 压测结果(wrk2,100 k keep-alive):
- 原始:85 k QPS / P99 = 158 ms
- 优化后:163 k QPS / P99 = 87 ms(负载 0.9,网卡 18 Gbps)
7 | 容错 & 伸缩
| 场景 | 策略 |
|---|---|
| L4 节点故障 | VRRP 1 s 抢占,VIP 漂移 |
| L7 节点耗尽 | HAProxy 自动剔除 + HPA 扩容(k8s) |
| 网关插件奔溃 | APISIX worker 级熔断,upstream 降级 |
启用 Prometheus Alertmanager:当 BE 连接数 > 70 % maxconn 持续 30 s 触发 k8s scale-out。
8 | 监控闭环
- IPVS exporter:连接表、重传、丢包
- HAProxy exporter:req_rate、sess_rate、backend_health
- APISIX 3.x 內建 prometheus-metrics
- Grafana 看板:自定义 P99 面板 + 红黄绿 SLA 显示
- 合成探测:每 5 s dubbo + REST 端到端探活
9 | 典型故障排查
| 故障现象 | 定位步骤 | 根因 & 解决 |
|---|---|---|
| 502 增多 | show errors in HAProxy → http-request timed out |
API 网关 GC 抖动;调高 worker_connections、升级 LuaJIT |
| SYN Flood | LVS ipvsadm -Ln --rate |
黑洞路由 + SYNPROXY iptables |
| 突发 0 QPS | ip -s link→ 10 Gb NIC TX DROP |
上游电信链路 flap;启用双 BGP 冗余 |
这次重构让我深刻体会到——高并发稳定性不是单点优化,而是体系战:从网卡中断绑核,到 LVS-DR 的零拷贝转发,再到 HAProxy 的 H2 多路复用、APISIX 的 Lua 动态限流,任何一环松动都会掣肘性能。











