老周在北京和上海各开了一家“蜀香火锅”。他明白,开餐馆最怕的不是生意冷清,而是半夜厨房起火、水管爆裂,把唯一一家店一锅端。于是他琢磨:能不能多开几家店,让它们互相照应?这跟我们今天要讲的多活与灾备架构一模一样——当一个系统的价值到了“宕机就断粮”的程度,我们就在多个地方部署它,让业务像火锅锅底一样永不熄火。两家店同时营业、各接各客,叫 Active-Active 多活;一家营业、一家囤货待命,叫 Active-Standby 灾备。账本怎么同步、起火后怎么把顾客导流去另一家、会不会出现两家店都以为自己是总店、抢着记账的乱子——这就是多活与灾备的全部手艺。下文用这家火锅连锁店的故事,带你从零看懂这套体系。

岗位关联

多活与灾备是云架构师与 SRE 的核心能力:你交付的不只是功能,而是“灾难发生时业务依然在线”的承诺。掌握本文,你将获得高可用架构选型与落地的系统方法论。

目录
  1. 可视化演示
  2. 架构模式
  3. 核心指标
  4. 数据同步
  5. 故障切换
  6. 脑裂防护
  7. 演练验证
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示多活与灾备架构三种模式:Active-Active双向同步、Active-Standby主备复制、故障切换全流程。切换模式对比各架构原理,拖动滑块调节节点数量。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Active-Active双活架构 双活模式:多个数据中心同时对外提供服务,双向实时数据同步,无主备之分,流量负载均衡分配 优势:RTO≈0、RPO≈0,资源利用率高;挑战:数据冲突解决(CRDT/最后写入胜出)、同步延迟管理 RTO ≈ 0; RPO ≈ 0; cost = N * region 双活架构适合核心交易系统

架构模式

老周的第二家店有三种开法,对应三种架构模式。第一种叫“主备”:北京店照常营业,上海店把餐具、食材、账本都备齐,但不摆桌接客——万一北京店被查封,上海店 1 小时就能开门,这就是 Active-Standby 灾备。第二种叫“双活”:两家店同时开门,顾客按地理位置分流到最近的店,任何一家倒下,另一家瞬间吃下全部客流,这就是 Active-Active 多活。第三种最讲究,叫“两地三中心”:在北京搞两家互备的店保低延迟,再在上海放一家异步兜底的店,专门防地震、洪水这种地域性大灾。

转入技术语言:主备架构里,备站点实时接收主站点同步的数据副本,但平时不承担业务流量,只做“热备”或“冷备”。双活架构则要求两个站点都对外提供读写服务,靠全局负载均衡把请求分散。两地三中心本质是“同城双活 + 异地灾备”的组合:同城机房距离近、延迟低,可以做同步复制;异地机房距离远、延迟高,只能做异步复制,保护的是最极端的地域性灾难。

再深一层,多活架构的关键在于业务要能“分区写入”——比如按用户地域、按订单号哈希,把写流量固定路由到某个站点,避免两边同时改同一笔数据。如果所有写请求都拥堵到一个站点,那只是“挂着两个招牌的伪多活”。衡量多活是否合格,就看故障切换那一秒,有没有站点能无缝接住全部读写流量。

A总=1−(1−A1)(1−A2)\displaystyle A_{\text{总}} = 1 - (1 - A_1)(1 - A_2)

1. A₁ 与 A₂ 是单站点可用性:例如 0.99,代表每个站点一年约 99% 时间正常营业。

A1=0.99,  A2=0.99A_1 = 0.99,\; A_2 = 0.99

2. 1-A₁ 是单站点故障概率:可用性的补集,就是它挂掉的可能性。

1−A1=0.011 - A_1 = 0.01

3. 两者相乘得到双站点同时故障的概率:假定两站点故障彼此独立,只有同时倒闭才会让生意彻底中断。

(1−A1)(1−A2)=0.0001(1 - A_1)(1 - A_2) = 0.0001

4. 1 减去同时故障率,就是至少一店存活的总可用性:多活的工程价值正在于此。

A总=1−0.0001=0.9999A_{\text{总}} = 1 - 0.0001 = 0.9999

老周把两家的排班、菜单、供货商全部统一成一套标准——双活不是多买两口锅,而是把“单点”变成“网格”。当一家店冒烟的瞬间,另一家已经在前厅摆好了迎接客人的热毛巾。

核心指标

老周找保险经纪谈话,经纪人只问两个问题:店烧了,你能接受多久不营业?账本被烧了,你能接受丢多少天的账?这就是 RTO 与 RPO。RTO(恢复时间目标)是灾难发生后把业务恢复起来的最长时限;RPO(恢复点目标)是灾难发生时允许丢掉的最大数据量。一个管“多久修好”,一个管“丢多少不心疼”,它们是架构选型的起点。

指标决定了架构选型。RTO 要分钟级,就得用热备或双活;RPO 要为零,就得用同步复制、牺牲写延迟。反过来,如果业务能接受 1 小时恢复、丢失 10 分钟数据,那异步复制加冷备就能省下一大笔钱。所谓高可用,其实是“用钱买时间、用时间换钱”的工程权衡。

行业里用“几个 9”衡量可用性:99.9%(三个 9)意味着每年停机不超过 8.76 小时;99.99%(四个 9)只有 52.6 分钟;99.999%(五个 9)压缩到 5.26 分钟。每多一个 9,成本不是线性增长而是指数翻倍。正确的做法是先定 RTO/RPO 预算,再反推架构复杂度与成本,而不是一上来就要“全冗余、全同步”。

A=MTBFMTBF+MTTR\displaystyle A = \frac{MTBF}{MTBF + MTTR}

1. MTBF 是平均无故障时间:两次故障之间平均能平稳运营多久,代表系统的“体质”。

MTBF=1000 小时MTBF = 1000\ \text{小时}

2. MTTR 是平均恢复时间:故障发生后从发现到恢复的平均耗时,代表团队的“急救”能力。

MTTR=1 小时MTTR = 1\ \text{小时}

3. 两者相加构成一次完整的生命周期:从好到坏再到好的总时长。

MTBF+MTTR=1001 小时MTBF + MTTR = 1001\ \text{小时}

4. 正常时间除以整个周期得到可用性:想让 A 更接近 1,要么 MTBF 更大,要么 MTTR 更小。

A=10001001≈0.999A = \frac{1000}{1001} \approx 0.999

指标不是 PPT 上的装饰,而是预算表:老周最终给自己的店定了“10 分钟恢复、5 分钟账本”的目标,于是他知道自己需要的是热备加异步复制,而不是贵一倍的同步双活。先谈清楚能接受多痛,再决定花多少钱,这是架构师的第一课。

数据同步

两家店要共用一套账本,怎么同步?老周有两种账房方案。同步复制:顾客在北京店买单时,收银员必须拿起电话,等上海店的账房先生也记一笔并回话“记好了”,才敢对顾客说“支付成功”——账绝对一致,但每位顾客都得多等零点几秒。异步复制:北京店先记自己本上,收银员笑脸送客,回头再由账房每隔 10 分钟把新账目快马送往上海——顾客体验极好,可万一北京店在这 10 分钟内起火,这 10 分钟的账就没了。

技术对应:同步复制下,主库必须等备库确认事务落盘才提交,RPO=0,但跨机房网络延迟直接写进用户请求路径,距离越远越痛。异步复制下,主库写完本地就返回,备库按复制策略追赶,RPO 等于追赶窗口内的数据量。因此“距离、延迟、数据安全”三者无法全要,必须按业务分级处理。

多活比主备难在“两边都在写”。同一用户在两家店各下一单,账房合并时发现余额对不上,怎么办?业界有三招:一是“分区写入”,约定北京的客户只在北京店记账,从源头避免冲突;二是“版本号加最后写入者胜”,同一笔账谁后写谁覆盖;三是“字段级合并”,A 店改了地址、B 店改了电话,合并后都保留。一致性模型也从强一致退到最终一致——允许短暂不一致,但保证“追得上、合得拢”。

RPO={0同步复制同步窗口时长×写入速率异步复制\displaystyle RPO = \begin{cases} 0 & \text{同步复制} \\ \text{同步窗口时长} \times \text{写入速率} & \text{异步复制} \end{cases}

1. 同步复制分支 RPO 恒为 0:每笔事务都必须经备库确认才算成功,任意时刻主备账本一致。

RPOsync=0RPO_{\text{sync}} = 0

2. 异步复制的窗口时长:主库与备库之间允许的复制间隔,例如 600 秒。

Δt=600 秒\Delta t = 600\ \text{秒}

3. 窗口内的写入速率:每秒产生多少新账目,两者相乘就是故障时最多会丢的数据量。

RPOasync=600 秒×100 笔/秒=60000 笔RPO_{\text{async}} = 600\ \text{秒} \times 100\ \text{笔/秒} = 60000\ \text{笔}

老周最终把账本同步调到每分钟一次——顾客无感,账房先生闭眼也能算出最坏情况丢多少。数据同步的本质,就是在“顾客体验”和“丢账上限”之间拧一个旋钮,旋钮的位置由业务的风险偏好决定。

故障切换

凌晨三点,北京店的烟雾报警器响了。这背后是“故障探测”:总控每 5 秒向两家店发一次心跳,连续 3 次没回应才判定失联,而不是响一声就当真的,这套流程叫“多级探活加误判容忍”。确认之后,总控按下“切换”按钮——这 5 秒探测加 3 秒决策,就是切换耗时的第一部分。

接下来是“流量调度”:老周在门口立了一块智能电子屏,原本一半顾客指向北京店,现在全部指向上海店,同时 DNS 解析记录和负载均衡策略同步更新。顾客走到上海店门口才被告知“今日北京店休息,请于此用餐”,全程无感。等到北京店灭火修好、账本追平,再按下“回切”按钮,把流量按 7:3 慢慢引导回来,避免新客流量瞬间把上海店压垮。

工程上,故障切换的全链路可分解为探测、决策、调度三段。探测靠心跳与健康检查;决策靠仲裁确认(连续 N 次失败或多数派同意);调度靠 GSLB、负载均衡、客户端路由三者协同。回切的风险常被低估——备库要追平数据、旧主要重新加入集群、双写期间的差异数据要先合并,因此回切往往比切换更谨慎,常按比例灰度放量。

Tswitch=Tdetect+Tdecide+Troute\displaystyle T_{\text{switch}} = T_{\text{detect}} + T_{\text{decide}} + T_{\text{route}}

1. T_detect 是探测耗时:心跳超时与健康检查连续失败的判定时长。

Tdetect=5 秒T_{\text{detect}} = 5\ \text{秒}

2. T_decide 是决策耗时:仲裁确认、选主投票等“是不是真的挂了”的花费。

Tdecide=3 秒T_{\text{decide}} = 3\ \text{秒}

3. T_route 是调度耗时:DNS 缓存过期、负载均衡配置生效、客户端重连的时长,三者求和即为总切换时间。

Tswitch=5+3+2=10 秒T_{\text{switch}} = 5 + 3 + 2 = 10\ \text{秒}

老周后来定了一条规矩:电子屏上的引导动画必须在 10 秒内完成,因为顾客的耐心和业务的流量都是按秒计费的。故障切换练到极致,就是让灾难变成一场没有彩排、但演练过一百遍的变道。

脑裂防护

多活的噩梦来了。某天夜里,北京与上海之间的对讲线缆被施工队挖断,两家店都联系不上对方。北京店想:呼叫没回应,上海肯定倒闭了,我现在是唯一总店!于是挂起“总店”招牌,放开接单;上海店同样以为北京倒闭了,也挂起“总店”招牌。同一批账目两边各记一遍,等线缆修好一对账,乱成一锅粥——这就是“脑裂”。

脑裂的本质不是谁都挂了,而是“网络断了但节点没死”,导致集群被切成多个互不通气的小团体,每个团体都以为自己是唯一合法主人。防止脑裂的铁律叫“多数派仲裁”:只有能拉到超过半数同伴支持的一方才配当主。既然双方都不可能拿到超过一半的票,那就不许任何一方独自升级为“总店”。

具体做法:三站点集群中,如果网络把集群切成“1 对 2”,那么只有 2 个节点的那一侧能凑够法定人数、选主成功;孤立的那一侧自动降级为只读或拒写,绝不能继续接受写请求。更狠一步是“隔离”:仲裁确认某节点是故障旧主后,直接断它的电或关它的网络,防止它“诈尸复活”后继续写数据。降级预案再兜底——宁可短暂不可写,也绝不双写,因为“数据不一致”比“短暂不可用”更致命。

Nquorum>Ntotal2\displaystyle N_{\text{quorum}} > \frac{N_{\text{total}}}{2}

1. N_total 是集群总节点数:例如三家店各投一票,总共三票。

Ntotal=3N_{\text{total}} = 3

2. 半数门槛:超过 1.5 票,意味着至少要拉拢 2 个节点支持。

Ntotal2=1.5\frac{N_{\text{total}}}{2} = 1.5

3. N_quorum 是持票者数量:只有凑齐 2 票以上的那一侧才能宣布自己是总店,另一侧自动降级。

Nquorum=2>1.5N_{\text{quorum}} = 2 > 1.5

老周给所有分店立下死规矩:对讲机断了,谁都不许擅自挂“总店”招牌,先报数再说。脑裂方案的灵魂不是让通信永不中断——那不可能,而是让通信断了之后,谁也没法单方面统治,自然也就分不出一个“唯一胜利者”。

演练验证

老周每年做两次“消防演习”:随机选一家店,当着顾客的面拉闸、断网、封门,然后掐表看店长能不能在 10 分钟内把客流全部导到另一家,账目分毫不差。第一次演练,报警器响了他才发现备用店的钥匙找不到了;第二次,备用店开着门但账本还是上个月的。演练不是走形式,而是专门逼出“纸面架构”和“真实系统”之间的缝隙。

现代工程把这种演习升级成“混沌注入”:不提前打招呼,随机在网络层丢包、在主机上 kill 进程、把磁盘塞满,让系统在随机故障中自己恢复。GameDay 是团队的固定仪式:设定一个故障场景,所有人像真实故障一样值班、通报、切换,结束后开复盘点,对照 RTO/RPO 把每一个超时环节修掉。

度量与改进是演练闭环的最后两环。每次演练都记录“切换是否成功、耗时是否达标、数据是否一致”,计算成功率与平均切换时长,持续优化。真正的韧性不是一次演练满分,而是每次演练都在提高“下次真实故障时活下来”的概率——从技术到组织,都练出肌肉记忆。

Psuccess=NokNdrill\displaystyle P_{\text{success}} = \frac{N_{\text{ok}}}{N_{\text{drill}}}

1. N_drill 是演练总次数:包括注入故障与模拟灾难的全部场景。

Ndrill=10N_{\text{drill}} = 10

2. N_ok 是达标成功次数:切换耗时与数据丢失都在 RTO/RPO 预算内的次数。

Nok=9N_{\text{ok}} = 9

3. 两者相除得到成功率:0.9 意味着还存在一处“预案盲区”,值得复盘修补。

Psuccess=910=0.9P_{\text{success}} = \frac{9}{10} = 0.9

老周在店门口挂了一张“十年零事故”的横幅,只有他自己知道:这不是运气好,而是每年两次演习烧掉了所有坏运气。灾备系统的价值不在平时,而在灾难发生的那一分钟——而那一分钟的表现,早在无数次演练中就被写好了剧本。

AI 应用场景

场景一:大模型推理服务的跨地域多活调度

阶段:AI 服务部署与流量调度

解决的问题:大模型推理服务(智能客服、AI 绘画)若只部署在单机房,机房故障会全线断服,且推理时延与用户到机房距离成正比。多活部署把服务同时跑在多个地域,智能路由把请求分到最近站点,站点故障时自动切流,就像火锅店把顾客导流到另一家分店,既保可用性又降时延。

具体案例:某 AI 绘画平台把文生图推理服务部署在华北、华东双活集群,两地域共用模型版本与 Prompt 审核配置,流量按 5:5 分流。某日华东机房光缆抖动导致可用性下降,监控系统 5 秒内判定故障并自动把全部流量切到华北,用户上传图片无感,RTO 实测 8 秒。

场景二:大模型训练集群的容灾与断点续训

阶段:训练任务容错与资源管理

解决的问题:千卡训练集群中单节点电源故障、网络抖动,会让跑了一周的 checkpoint 白算。通过把 Checkpoint 异步复制到异地对象存储(RPO 约 10 分钟),再用调度系统在故障后于备用资源池拉起新节点、从最近快照恢复,训练损失从“周”级降到“分钟”级——相当于账本每天都快递备一份到外地。

具体案例:某公司训练千亿参数大模型,训练中某可用区供电异常。调度控制器检测到节点失联,5 分钟内在另一可用区拉起等量 GPU 实例,从 8 分钟前的 Checkpoint 续训,整体损失不到半小时算力。

场景三:智能客服系统的容灾演练与混沌注入

阶段:SRE 运维与韧性验证

解决的问题:客服系统链路长(语音识别、语义理解、对话生成),任何一环抖动都会导致用户排队爆炸。靠“纸上预案”扛不住真实故障,必须用 GameDay 演练加混沌注入持续验证切换流程,把 RTO/RPO 从“口号”变成“实测值”,像火锅店每年拉闸演习一样形成肌肉记忆。

具体案例:SRE 团队每月 GameDay:随机 kill 掉一个地域的 ASR 容器,观察会话流量是否在 10 秒内切换到备用地域,随后开复盘点,把“流量调度生效慢 3 秒”的根因修复,下月再验。连续三个季度后,演练成功率从 70% 提升到 98%。

Python 演示

python50 行
"""多数派仲裁模拟: 三站点如何防止灾备脑裂"""  class Site:    """一个数据中心站点"""     def __init__(self, name):        self.name = name        self.up = True     def votes(self, peers):        """自己一票, 加上能联系到的在线同伴票数"""        return 1 + sum(1 for p in peers if p.up)     def has_quorum(self, peers, total):        """超过半数才算获得法定人数"""        return self.up and self.votes(peers) * 2 > total  def main():    beijing = Site("北京中心")    shanghai = Site("上海中心")    guangzhou = Site("广州中心")    sites = [beijing, shanghai, guangzhou]     normal = {        beijing: [shanghai, guangzhou],        shanghai: [beijing, guangzhou],        guangzhou: [beijing, shanghai],    }    print("== 正常状态: 三地互联互通 ==")    for s in sites:        mark = "可当选主" if s.has_quorum(normal[s], len(sites)) else "票数不足"        print("  %s: %d 票, %s" % (s.name, s.votes(normal[s]), mark))     split = {        beijing: [],        shanghai: [guangzhou],        guangzhou: [shanghai],    }    print("== 光纤断裂: 北京被隔离 ==")    for s in sites:        mark = "可当选主" if s.has_quorum(split[s], len(sites)) else "票数不足已降级"        print("  %s: %d 票, %s" % (s.name, s.votes(split[s]), mark))     print("结论: 少数派站点拿不到过半票, 被迫降级, 双主脑裂被阻止")  if __name__ == "__main__":    main()
目的:用 3 个站点投票模型演示多数派仲裁——正常时大家票数充足,光纤断裂后孤立侧票数不足、自动降级,从机制上杜绝双主脑裂。
  1. return self.up and self.votes(peers) * 2 > total用乘法代替除以二,避免浮点误差,同时自己离线直接判失败
  2. return 1 + sum(1 for p in peers if p.up)统计“自己一票”与“能看到且在线”的同伴票数,模拟网络可见性
  3. normal = {健康状态下每个站点都“看得见”彼此,票数全满,任意站点都有当选资格
  4. split = {光纤断裂后,北京视角里只剩自己,票数瞬间从 3 掉到 1
  5. print("结论: 少数派站点拿不到过半票, 被迫降级, 双主脑裂被阻止")多数派原则让孤立站点无法挂“总店”招牌,脑裂在机制上被杜绝

常见误区

误区“我们上了双活,两地机房同时服务,RPO 一定是 0,数据肯定丢不了。”

正解双活不等于数据零丢失。如果站点间采用异步复制,主站在同步窗口内故障,最近几分钟的账本照样会丢。RPO 由复制模式决定:同步复制 RPO=0 但写延迟高;异步复制低延迟但有丢失窗口。就像两家店虽然同时营业,账本却是一个小时才互相抄一次,起火时这小时的账照样没了。

为何常见:大家听到“多活”就自动联想到“高可靠”,忽略了“复制模式”这个决定数据安全的关键变量。

误区“为了防地震,灾备中心建得越远越安全,直接放到另一个大洲。”

正解距离越远,网络延迟越高。同步复制在远距离高延迟下会把业务写请求拖垮,只能退化为异步复制,RPO 随之变大。实际工程常用“两地三中心”:同城双活保低延迟,异地异步灾备防地域性灾难,而不是把日常请求都送去海外绕一圈。

为何常见:只考虑“地理隔离”单一维度,忽略了距离、延迟与同步模式三者之间的强耦合。

误区“切换脚本早就写好了,真出事时照着执行就行,不用老折腾演练。”

正解不演练的灾备等于没有灾备。故障切换涉及网络、域名、中间件、数据追平等多个环节,任何一个环节都会在真实压力下露馅。定期注入故障演练(GameDay、混沌实验)才能让流程和团队形成“肌肉记忆”,并根据复盘持续修正 RTO/RPO 数字。

为何常见:演练要在生产环境操作,有风险又耗时,容易被“以后再说”无限拖延,直到真实故障把问题一次性引爆。

误区“两个站点多活太保守了,我搞五个地域同时读写,不是更保险吗?”

正解站点越多,跨站同步的冲突概率和协调成本呈指数上升,还会出现写写冲突、数据回流的“环路”。业界多数系统停留在“同城双活加异地灾备”或“两地三中心”;更多地域一般按区域拆分业务,每个业务只在少数几个点写入,而不是全量多活。这就像火锅连锁可以开 50 家店,但总账房只有两本,大家各记各的区域账。

为何常见:把“多活”简单理解成“多复制几份”,低估了分布式一致性的工程代价。

面试题

Q1. Active-Active 与 Active-Standby 最本质的区别是?

单选题 · easy

  • A.前者多站点同时服务,后者单站点兜底← 正确答案
  • B.前者支持读写分离,后者不支持存储
  • C.前者只能同城部署,后者只能异地部署
  • D.前者无需网络同步,后者依赖物理介质

答案:A。Active-Active 要求多个站点同时承载读写流量,任意站点倒下都能接手全部业务;Active-Standby 是主站服务、备站待命。这就像两家同时营业的火锅店与一家营业一家囤货。B 混淆了容灾与存储形态,C、D 都附加了实际并不存在的部署限制。

Q2. RPO 描述的是故障切换时的什么?

单选题 · easy

  • A.系统恢复服务所用的最长耗时
  • B.允许丢失的最大数据量← 正确答案
  • C.系统每秒处理请求的数量
  • D.主备之间心跳的发送频率

答案:B。RPO(恢复点目标)衡量灾难时可容忍的最大数据丢失量,类比“账本最多烧掉几天”;A 是 RTO 的定义,C 是吞吐量,D 是探活频率。选 B 说明你分清了两兄弟:RTO 管时间,RPO 管数据。

Q3. 异步复制相比同步复制最大的优势是?

单选题 · easy

  • A.数据永不丢失且完全一致
  • B.主库写入无需等待备库确认← 正确答案
  • C.彻底消除脑裂发生的可能
  • D.备库可以完全替代主库运行

答案:B。异步复制下主库写完本地就返回,写延迟低、用户体验好,代价是故障时会丢同步窗口内的数据。A 是同步复制的特性,C 与复制模式无关,D 在任何复制模式下备库都不能完全替代主库的在线角色。

Q4. 三节点集群发生“1 对 2”网络分区时,多数派仲裁的结果是?

单选题 · mid

  • A.两侧同时选主形成双主
  • B.单独一侧获得全部控制权
  • C.两节点侧选主而单侧降级← 正确答案
  • D.整个集群立刻停止服务

答案:C。3 节点中两节点侧凑齐 2 票、超过半数,可正常选主;单节点侧只有 1 票,按多数派规则降级为只读或拒写,从而防止脑裂。A 正是多数派要避免的灾难,B 与票数规律相反,D 过度悲观——多数派满足时集群仍然可用。

Q5. “脑裂”产生的根本原因是?

单选题 · mid

  • A.备用站点磁盘空间严重不足
  • B.心跳中断后双方都自认主节点← 正确答案
  • C.主节点 CPU 负载持续过高
  • D.数据库事务锁发生死锁

答案:B。脑裂的根因是网络分区导致心跳中断,两边都以为对方已死、自己仍是唯一合法主,于是各自接受写入。磁盘、CPU、死锁都是单点故障,只会让一个节点出问题,不会把集群切成两个对立的小团体。

Q6. 生产环境容灾演练的正确姿势是?

单选题 · mid

  • A.只在测试环境反复排练
  • B.只等待真实故障发生复盘
  • C.定期注入故障并验证切换← 正确答案
  • D.演练结果永远记录为成功

答案:C。在生产环境定期注入故障、验证切换流程并复盘,才能逼出真实系统与预案之间的缝隙。只在测试环境演练覆盖不了真实网络与依赖,等真故障再复盘是纸面预案,把结果记成功则是自欺欺人,都违背了演练的初衷。

Q7. 从主备升级到双活多活,首要设计难题是?

单选题 · mid

  • A.增加机房之间的网络带宽
  • B.增加每台服务器的内存容量
  • C.设计跨站同步与冲突处理← 正确答案
  • D.修改前端静态资源路径

答案:C。双活的关键是多个站点同时写入,同一笔数据可能被两地同时修改,必须设计跨站数据同步与冲突处理机制。加带宽、加内存、改静态资源都不解决“两边写同一笔账”的核心矛盾,就好比两家店同时记账却没有合并规则。

Q8. 某系统 RTO=10 分钟,该指标的正确解释是?

单选题 · hard

  • A.故障时最多丢失十分钟内数据
  • B.系统恢复服务最长需要十分钟← 正确答案
  • C.系统最长连续运行十分钟即宕机
  • D.数据备份周期严格为十分钟

答案:B。RTO 管“恢复服务要多快”,10 分钟意味着灾难发生后最长 10 分钟内恢复业务。A 是 RPO 的语义,C 把恢复时间误读为运行寿命,D 把目标曲解为固定备份周期。记住:RTO 是“多久修好”,RPO 是“丢多少不心疼”。

Q9. 下列属于 Active-Active 多活架构必备能力的有?

多选题 · mid

  • A.多站点同时对外提供读写← 正确答案
  • B.站点间实时同步或最终一致← 正确答案
  • C.站点故障时流量自动调度← 正确答案
  • D.每次切换依赖人工修改记录

答案:ABC。A 是多活的定义,B 是数据底座,C 是切换自动化,三者缺一不可。D 恰恰相反:多活依赖自动调度,人工改 DNS 记录既慢又易错,与“A 店冒烟顾客无感进 B 店”的目标背道而驰。

Q10. 防止脑裂的常见机制包括?

多选题 · extreme

  • A.引入仲裁节点参与投票← 正确答案
  • B.使用过半数的法定人数判定← 正确答案
  • C.故障节点执行隔离与降级← 正确答案
  • D.关闭所有节点的心跳检测

答案:ABC。仲裁投票、法定人数过半、故障隔离(fencing)是抗脑裂的三大标准手段:先限制“谁有资格当主”,再对不合法的旧主断电拉黑。D 说反了,心跳是探测分区的前提,关闭心跳等于主动制造脑裂,而不是防止脑裂。