如何在香港服务器上部署高效的负载均衡架构,确保API网关在高并发环境下的稳定性?

如何在香港服务器上部署高效的负载均衡架构,确保API网关在高并发环境下的稳定性?

昨天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 动态限流,任何一环松动都会掣肘性能。

未经允许不得转载:A5数据 » 如何在香港服务器上部署高效的负载均衡架构,确保API网关在高并发环境下的稳定性?

相关文章

contact