第 12 章 · 多活容灾与流量调度
本章讲解 同城双活、异地灾备、流量调度、脑裂防护,含 RTO/RPO 手算例题 与 ch18 跟练衔接。
前置:ch02 HA/DR;ch08~09;运维 ch06;跟练 ch18。
12.1 容灾等级
| 等级 | 拓扑 | RTO | RPO | 成本 |
|---|---|---|---|---|
| 冷备 | 异地备份手动拉 | 4~24h | 1~24h | 1× |
| 温备 | 灾备待机 | 30~60min | 5~15min | 1.5× |
| 同城双活 | 两AZ同时接流 | <5min | 0~3s | 2~2.5× |
| 异地多活 | 跨城多中心写 | 分钟级 | 秒~分 | 3×+ |
社区电商 99.95%
年停机预算 = (1-0.9995)×525600 ≈ 262 分钟/年
推荐:同城双活 60/40 + 异地冷备(季度演练)
RPO/RTO 例题
| 术语 | 例题 |
|---|---|
| RPO | 异步复制 lag 30s → RPO≈30s |
| RTO | DNS 3min+扩容10min → RTO≈13min |
事故损失粗算:GMV 500万/天 ≈ 3472元/分钟;RTO 60→15min 少损约 26万元/次(满负载极端)。
12.2 同城双活架构
[ GSLB / DNS 60/40 ]
/ \
[ AZ-A cluster-a ] [ AZ-B cluster-b ]
order×6, MySQL主 order×4, MySQL从
\ 专线/内网 /
[ Witness ]
| 组件 | 双活要点 |
|---|---|
| 应用 | 无状态,镜像同源 digest |
| 会话 | JWT 优先,Redis refresh |
| MySQL | 单主异步复制(写TPS250够用) |
| MQ | 3副本跨AZ |
| MinIO | EC 4+2 跨节点 |
小紫云
| AZ-A | AZ-B | |
|---|---|---|
| 集群 | cluster-a | cluster-b |
| 节点 | 8C16G×3 | 8C16G×2 |
| Ingress | ingress-a | ingress-b |
12.3 流量调度
| 手段 | 场景 |
|---|---|
| DNS 权重 | 常态 60/40 |
| GSLB 健康检查 | 3次失败摘流 |
| Ingress 金丝雀 | 新版 5% |
| 应急切流 | A故障→100%B |
# DNS 概念配置
api.shop.example.com:
- target: ingress-a.example.com
weight: 60
health_check: /health
- target: ingress-b.example.com
weight: 40
ttl: 30 # 应急前24h降至30s
# APISIX 金丝雀
plugins:
traffic-split:
rules:
- match: [{ vars: [["http_x_canary","==","1"]] }]
weighted_upstreams: [{ upstream_id: v2, weight: 100 }]
- weighted_upstreams: [{ upstream_id: v1, weight: 95 }, { upstream_id: v2, weight: 5 }]
健康检查层次
| 层 | 检查 | 失败动作 |
|---|---|---|
| L7 | /health 200 | 摘Pod |
| 依赖 | DB+Redis ping | 摘AZ |
| 业务 | 合成下单探针 | 降级 |
12.4 双活容量(数值例题)
| 项 | 值 |
|---|---|
| 常态下单 | A:30 + B:20 = 50 QPS |
| 单AZ故障 | B扛100%毛刺 267 QPS |
| 单Pod安全 | 180 QPS |
| B所需 | ceil(267/180×1.35)=2 → 工程 ≥6 |
原则:任一 AZ 须扛 100% 毛刺,非简单 50/50 各一半。
跨AZ RTT:同AZ <1ms;跨AZ写主 +2~5ms/跳;跨城 20~40ms 不宜同步写。