4. 常见多活模式:同城双活、两地三中心、异地多活

多活的核心,说白了就是让多个数据中心同时承担业务流量,任何一个出故障,剩下的还能扛住。但这几种模式差别很大,我干了这么多年,发现不少团队一开始只盯着“多活”两个字,选型时踩了不少坑。

4.1 同城双活

同城双活,顾名思义——两个数据中心在同一个城市,物理距离通常几十公里以内。两边同时跑流量,互为主备,或者干脆都是主。

架构要点:

  • 通过专线或裸光纤互联,延迟极低(一般小于2ms)
  • 数据库层面常用同步复制或分布式存储(如MySQL Group Replication)
  • 负载均衡层把流量分发到两个中心
我个人的做法: 同城双活最头疼的是数据一致性问题。我习惯在应用层做“写本地+异步复制”,但关键业务(比如支付)必须走同步写两个中心。否则一旦脑裂,两边数据对不上,恢复起来极其痛苦。

我遇到过的一个案例: 某次机房A的交换机故障,业务自动切到机房B,但机房A的缓冲队列里还有一批写操作没刷盘。切换后业务正常,但数据对不上——这就是典型的同步没做彻底。后来我们强制所有写操作必须等待两个中心的确认才能返回成功,代价是写延迟增加了3~5ms,但再没出过问题。

注意: 同城双活并非真正的异地容灾。如果整个城市发生大面积停电或地震,两个数据中心一起挂掉——这个模式救不了你。我曾经在2012年经历过一次城市级故障,所有同城方案全部失效,从那之后我开始认真考虑两地三中心。

4.2 两地三中心

两地三中心是上一代灾难恢复的经典方案:一个同城主中心(A)、一个同城备份中心(B)、一个异地灾备中心(C)。 平时A和B做双活或主备,C只做数据同步,不承载流量。只有A和B同时挂掉时,才会把流量切到C。

这个模式看起来漂亮,实际跑起来有很多讲究:

  • 异地C的数据通常是异步复制,RPO有可能达到分钟级甚至小时级
  • 切到C时,应用需要重新配置数据库连接、中间件路由等,切换时间(RTO)很难小于30分钟
  • 平时C几乎闲着,资源浪费严重
指标 同城双活 两地三中心
RPO 接近0(同步复制) 分钟级(异步复制)
RTO 秒级(自动切换) 30分钟以上(需人工干预)
成本 中(两个机房) 高(三个机房+专线)
适用场景 容灾级别要求高、成本敏感 满足监管要求、城市级故障

避坑指南: 我曾经主导一个两地三中心项目,方案设计时忽略了“仲裁节点”的存在。当A和B之间的网络中断时,两个中心都以为对方挂了,各自尝试接管——结果双脑裂,数据一塌糊涂。后来我们不得不引入一个独立的仲裁服务器(部署在第三个城市),用过半原则决定谁是主。这个教训让我养成一个习惯:任何多活方案,必须先画清楚脑裂时的决策树。

4.3 异地多活

异地多活是近几年流行的方案。多个数据中心分布在距离几百到上千公里的不同城市,每个中心都承载业务流量,数据通过异步复制或分片机制保持最终一致。

它的核心优势在于:

  • 真正的容灾: 一个城市出问题(地震、洪水、电力瘫痪),其他城市完全不受影响
  • 就近接入: 用户访问最近的数据中心,延迟更低
  • 资源利用率高: 所有中心都在干活,没有闲置资源

但代价也很明显:

  • 数据一致性难题: 跨地域延迟几十毫秒,强同步基本不可能,只能接受最终一致性
  • 流量调度复杂: 需要DNS流量调度或全局负载均衡,切换时可能造成会话丢失
  • 运维成本激增: 每个中心都要部署完整组件链,监控和排障复杂度指数上升

我个人的经验: 异地多活不是银弹。我见过一个团队把全量写操作都放到不同中心,结果因为数据冲突导致用户看到过期的金额。后来他们重新设计业务分区——比如用户按地域归属,每个中心只处理本区域用户的写请求,跨中心写走异步消息队列。这个改造花了半年,但效果立竿见影。

牢记一条纪律: 异地多活要求业务本身能容忍最终一致性。如果业务要求强一致性(比如银行转账、库存扣减),就别硬套异地多活。你想想看,用户在北京下单,你异步同步到上海,期间用户查询发现订单状态错乱——那体验多糟糕?我曾经就因为这个被产品经理追着骂了两周。

4.4 三种模式的对比决策

没有最好的模式,只有最适合的场景。下面这张图是我自己画的一个选型判断框架,核心维度就两个:RPO容忍度和故障隔离范围。

多活部署模式选型框架 同城双活 距离≤50km RPO≈0 RTO秒级 两地三中心 同城+异地 RPO分钟级 RTO>30min 异地多活 距离≥500km 完整单元化部署 选型决策因素 业务对RPO敏感 → 优先考虑同城双活 监管要求/城市级容灾 → 两地三中心 高并发/全球覆盖/能接受最终一致 → 异地多活
我的选型建议:
  • 如果是金融、支付等强一致业务,老老实实同城双活 + 异地冷备(类似两地三中心但简化)
  • 如果是互联网应用(社交、电商、内容),可以考虑最终一致,选异地多活
  • 如果只是为满足监管“异地灾备”的要求,用两地三中心最稳定,但要做好半年一次的切换演练

你想想看,很多团队刚开始做多活时,都喜欢直接上异地多活,觉得最“高级”。但实际上,异地多活的运维复杂度可能是同城双活的5倍以上。我曾经在一个技术分享会上问过10个号称“已实现异地多活”的团队,结果其中7个还停留在“读写分离+备机”的阶段,真正的单元化拆分根本没做。