← 返回分布式系统
🛡️ 高可用 · 容灾架构

高可用与容灾

系统"挂不了、挂了能恢复、恢复不丢数据"是分布式架构的终极目标。本文讲清 冗余、故障转移、多活、异地多活、脑裂 这套面试高频体系。

📊可用性指标:几个 9

可用性 = 正常运行时间 / 总时间。业界用"几个 9"衡量,每多一个 9 难度指数级上升。

可用度年停机典型级别
99%(2个9)约 87.6 小时普通单机
99.9%(3个9)约 8.8 小时基本高可用
99.99%(4个9)约 52 分钟企业级
99.999%(5个9)约 5 分钟电信/金融核心
🧮
核心公式:可用性靠"减少故障概率 × 缩短恢复时间"。也就是冗余(别让单点) + 快速故障转移(Failover)。MTTR(平均恢复时间)比 MTBF(平均故障间隔)往往更可控。

🔁冗余与故障转移

主备(Active-Standby)
一台主(处理流量),一台备(待命)。主挂,备顶上。简单,但备平时闲置,资源利用率低。
双活 / 多活(Active-Active)
多节点同时服务,互为主备。资源利用率高,但数据一致性、冲突处理更复杂(见"异地多活")。
故障转移(Failover)
依靠健康检查 + 选主/路由自动切换。如通过 Keepalived/VRRP 漂移 VIP,或注册中心摘除故障节点。
✅
关键:故障转移必须自动且可重入。手动切=人为瓶颈;切过去还要能切回来(回切)而不丢数据。

🏗️容灾等级(距离递进)

同机房单点风险 同地多机机架/机房 同城双活城市级 异地多活地域级
递进逻辑:故障域越小越能容。单机房(断电/火灾)→ 同城多机房(楼宇级)→ 异地(城市级灾难、断网)。越往上,数据同步延迟越大、一致性越难。

🌐异地多活

多地数据中心同时对外服务,任一地故障,流量切到其余地,用户无感。这是高可用的"天花板"方案,也最难。

三大难点

① 数据一致性:跨地域网络延迟高(几十~上百 ms),强一致代价巨大,通常用"单元化路由 + 最终一致"。

② 路由与就近:用户请求要被引导到最近/健康的机房(DNS、GSLB、任意播)。

③ 冲突与回切:多地写同一数据会冲突,需"单元封闭"——让相关数据收敛到同一机房处理。

🧩
单元化(Cell)是核心思路:把用户按维度(如用户ID取模)划分到固定机房,其全链路数据都在该单元内闭环,跨单元交互降到最低。这样每个单元近似"独立小系统",容灾切换干净。

🧠💥脑裂(Split-Brain)

网络分区导致集群被切成两半,每半都以为自己是"老大",同时对外服务、同时写数据,恢复后数据冲突撕裂。

防脑裂三板斧:
Quorum(多数派):只有获得超过半数节点认可的节点才能成为主。两半里必有一半不足半数,无法同时当选。
fencing(围栏):夺主后对旧主"断电/隔离"(如关端口、吊销租约、STONITH 关机),保证旧主真的不再写。
租约(Lease):主角色带有时效租约,过期未续约自动失效,避免"假死主"长期霸占。
⚠️
经典坑:"双机房各 50% 节点"最易脑裂——网络抖动时两边都是半数,都以为自己是多数。所以集群节点数应取奇数,且跨机房部署要算好 quorum 容错度。

🧪演练与 SLA

混沌工程 / 故障演练
高可用不是"配置了就高可用",要主动注入故障(杀节点、断网、延迟)验证真实恢复能力。Netflix 的 Chaos Monkey 是鼻祖。
SLA / SLO / SLI

SLI:实际指标(如成功率、延迟)。

SLO:目标值(如 99.95% 请求 < 200ms)。

SLA:对用户的承诺+违约补偿(如赔代金券)。容灾设计要能撑住 SLO。

📌
记住:"没有演练过的高可用都是纸面高可用"。定期做"真实切库/切机房"演练,才能在上线后真扛得住。

🎯面试要点速记

指标:可用性=几个 9;靠降 MTTR + 冗余;公式=减少故障×加速恢复。
冗余:主备 / 多活;故障转移要自动、可重入、能回切。
容灾等级:同机房 → 同城双活 → 异地多活,故障域递进。
异地多活:难点在数据一致+路由+冲突;核心解法是单元化。
脑裂防护:Quorum + Fencing + Lease;集群用奇数节点。
验证:混沌演练 + SLI/SLO/SLA 闭环。
🔥
必考题:"怎么防止脑裂?"——多数派选举(不足半数不能成主)+ 围栏(夺主后立即隔离旧主)+ 租约过期。三者配合,缺一不可。