
我把香港A5数据机房、狮城Evoque DC以及洛杉矶Coresite三个数据中心通过分布式负载均衡“串”成了一台逻辑上统一、故障自愈、低延迟的全球加速集群。下面把完整的思路、配置与踩坑记录原汁原味地奉上,供你在类似项目里快速复刻甚至做得更好。
1. 背景与目标
业务场景
- 高并发电商网站,主要流量在东南亚与北美。
- 峰值 1 Tbps 静态流量 + 80 k RPS 动态请求,99.9 % 页面加载 < 200 ms。
- 容忍单个数据中心整站级故障,RPO=0、RTO<60 s。
目标拆解
- 站内(Intra-DC)负载均衡:每个机房内部横向扩容 + 无单点。
- 站外(Inter-DC / GSLB)负载均衡:自动按就近、负载与健康状况选择机房。
- 秒级故障转移:机房不可达时 30 s 内切流。
- 自动化交付:所有配置 IaC 化并可滚动发布。
2. 总体架构
┌──────────┐ ┌──────────┐ ┌──────────┐
│ GSLB │──Anycast│ Anycast │──BGP──► ISP/IX │
│ Route53 │◄─Health─│ Nodes │◄─Flows─► Edge │
└──────────┘ └──────────┘ └──────────┘
│ ▲
▼ │
┌────────────────────────────────────────────────────────┐
│ DC-HK (A5) DC-SG DC-LA │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ HAProxy │◄VIP► │ HAProxy │◄VIP► │ HAProxy │ │
│ └─Keepalived┘ └─Keepalived┘ └─Keepalived┘ │
│ │ │ │ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Web Nginx│ … │ Web Nginx│ … │ Web Nginx│ … │
└────────────────────────────────────────────────────────┘
- GSLB 层:Route 53 的 Geoproximity + 健康检查;同一域名多 A 记录指向各机房的 Anycast IP。
- Anycast 层:三台边缘节点(Bird+BIRD-RN 或 ExaBGP)在 HK、SG、LA 公网播 /24;同块地址里再由 Keepalived VRRP 浮动 VIP 到本地 HAProxy 流量入口。
- 站内层:HAProxy 作为 L4/L7 LB,后端服务器 (Nginx/PHP-FPM 或容器) 通过 Consul 服务发现自动注册。
3. 实验环境清单
| 角色 | 位置 | 规格示例 | 关键参数 |
|---|---|---|---|
| Anycast/BGP Node | HK/SG/LA 各 1 | 2 × Intel Xeon 4216, 64 GB RAM, 2 × 480 GB NVMe | 2 × 10 GbE + BGP session |
| HAProxy Pair | 每 DC 2 台 | Xeon 6354, 128 GB, 2 × 1.92 TB NVMe (RAID1) | 内网 25 GbE |
| Web Server Pool | 每 DC 12 台 | Ryzen 7950X, 64 GB, 2 × 960 GB NVMe (RAID0) | 内网 25 GbE |
| Consul/etcd | 每 DC 3 台 | EPYC 7313, 32 GB, 240 GB SSD | 内网 10 GbE |
4. 站内负载均衡 (HAProxy + VRRP)
4.1 安装与内核调优
# CentOS Stream 9
dnf install haproxy keepalived conntrack-tools
sysctl -w net.ipv4.ip_nonlocal_bind=1 # 允许备用节点绑定 VIP
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.core.somaxconn=65535
4.2 Keepalived 配置要点
vrrp_instance VI_1 {
state MASTER
interface bond0 # 物理绑定两个 25G 口
virtual_router_id 51
priority 150
advert_int 1
authentication { auth_type PASS auth_pass "lb_secret" }
virtual_ipaddress { 10.200.0.254/24 dev bond0 }
notify "/usr/local/bin/vrrp_notify.sh"
}
抢占模式 + 脚本钩子:探测 HAProxy 状态,宕机即降权。
advert_int=1 s → failover 平均 2–3 s 内完成。
4.3 HAProxy 核心配置
global
maxconn 120000
tune.ssl.default-dh-param 2048
tune.bufsize 32768
nbthread 32
defaults
mode http
option httplog
timeout connect 2s
timeout client 30s
timeout server 30s
backend web_pool
balance hdr(User-Agent) # UA 哈希可保持会话粘性
server-template web 20 _web._tcp.service.dc.consul check inter 2s fastinter 1s
frontend https_in
bind 10.200.0.254:443 ssl crt /etc/haproxy/certs/site.pem alpn h2,http/1.1
default_backend web_pool
server-template 使得实例自动从 Consul 发现并维护健康探针。
生产中启用 ebpf conntrack offload 提升 L4 性能(内核 6.1+)。
5. 跨机房 GSLB 设计
5.1 DNS 选型:AWS Route 53 + Failover + Geoproximity
resource "aws_route53_record" "www" {
zone_id = aws_route53_zone.public.id
name = "www"
type = "A"
set_identifier = "hk"
geo_location { continent_code = "AS" }
health_check_id = aws_route53_health_check.hk.id
records = ["203.119.88.9"] # HK Anycast 节点
ttl = 30
}
- 健康检查:通过 HTTP-S、TCP 与 ICMP 综合判断;失败阈值 = 3,恢复阈值 = 2。
- 冷名单:将临时退役机房标记到专用 “drain” 记录避免 DNS 缓存污染。
5.2 Anycast BGP 发布
# Bird 2.x
protocol bgp hk_bgp {
local as 65010;
neighbor 203.119.88.1 as 4788; # HKGIX
import none;
export where net = 203.119.88.0/24;
}
与各 IX/ISP 建 eBGP,Origin 设置为 IGP (BGP attribute) 以提高优先级。
用 RTBH 社区 65535:666 允许远程黑洞应对 DDoS。
5.3 健康驱动的 BGP 触发脚本
简单思路:Health-daemon → ExaBGP API → Add/Withdraw 路由。
if not healthy("haproxy"):
withdraw("203.119.88.0/24")
else:
announce("203.119.88.0/24")
这样即使整个 HAProxy 层宕机,也能 15 s 内把 Anycast IP 从路由表撤掉,DNS 回退到其它 DC。
6. 自动化与 CI/CD
| 工具 | 用途 | 关键实践 |
|---|---|---|
| Terraform + Terragrunt | 统一编排 CIDR、VPC、GSLB 记录、LB 节点 | 每次 PR 触发 plan,强制审批 |
| Ansible | 部署 HAProxy/Keepalived、BIRD | Inventory 按 DC 标签分组,支持蓝绿 |
| GitHub Actions | 自动生成 HAProxy 映像并推送 Harbor 私库 | Tag = 版本号 + Git SHA |
| Consul KV | 持久化后端权重、维护流量灰度策略 | 动态读取,不重载进程 |
7. 监控与容量预测
| 监控项 | 指标阈值 | 处理动作 |
|---|---|---|
| LB 进程 CPU>75 % 5 min | 触发自动扩容脚本 (IaC) + Slack 消息 | |
| 后端池 Healthy <80 % | DNS 权重 –50 %;通知 on-call | |
| BGP RTT >100 ms (↗) | Prometheus Alertmanager + Grafana 圆环地图 | |
| Global 99p latency >250 ms | 自动把静态文件迁移到最近机房 S3 边缘桶 |
8. 安全与合规
- WAF 位置:轻量级 ModSecurity (OWASP CRS) 插件直接挂在 HAProxy;防错误绕过。
- Mutual-TLS:机房间同步流量 (Consul Gossip + Prometheus remote-write) 全部开 mutual TLS。
- RPKI ROA:对自家 /24 段在 APNIC 请求 ROA;Bird 启用 rpki-validator 拒绝无效前缀。
9. 性能与故障演练结果
| 场景 | 结果 | 备注 |
|---|---|---|
| 单 DC 电源全断 | GSLB 23 s 完成切流,订单丢失 0 | 测试时手动拔机房总电 |
| HAProxy 版本热升级 | 0 掉线,p99 latency ↑ 14 ms,4 min 恢复 | 使用 Runtime API 平滑下线实例 |
| BGP Session Drop (HK<->HKGIX) | Anycast 18 s Withdraw;DNS 30 s 缓存回收 | 中途 IPv6 会短暂走 SG |
10. 常见坑与优化 Tips
- DNS TTL 不要低于 30 s,否则移动网络大量递归查询会自爆。
- Anycast CIDR /24 并不浪费——更小前缀在多 ISP 会被垃圾回收。
- Keepalived v2.2.x 开的 gratuitous ARP 在十万并发时会丢包,需要 garp_master_refresh_repeat 调成 5 s 而非 1 s。
- probe fastinter 1s 不是越小越好,后端多到上百时会因 event loop 拖慢整个 HAProxy;实测 1 s 合理。
- BIRD route flap dampening 别开!对 Anycast 来说延迟收敛等于损失钱。
三地六层的分布式负载均衡看似复杂,其实核心只有两件事:
- 本地健康检查驱动的流量入口接管(VRRP VIP + HAProxy);
- 全局可宣可撤的统一前缀(DNS GSLB + Anycast BGP)。
把它们拆成最小单元、用 IaC 合理胶合,再配合严格的演练脚本,你就能像我一样,把跨数据中心的“巨龙”驯服成秒级自愈的温顺坐骑——即便峰值千亿 PV,也能游刃有余。祝你部署顺利,踩坑少收尾快!











