4. 常见多活模式:同城双活、两地三中心、异地多活
多活的核心,说白了就是让多个数据中心同时承担业务流量,任何一个出故障,剩下的还能扛住。但这几种模式差别很大,我干了这么多年,发现不少团队一开始只盯着“多活”两个字,选型时踩了不少坑。
4.1 同城双活
同城双活,顾名思义——两个数据中心在同一个城市,物理距离通常几十公里以内。两边同时跑流量,互为主备,或者干脆都是主。
架构要点:
- 通过专线或裸光纤互联,延迟极低(一般小于2ms)
- 数据库层面常用同步复制或分布式存储(如MySQL Group Replication)
- 负载均衡层把流量分发到两个中心
我遇到过的一个案例: 某次机房A的交换机故障,业务自动切到机房B,但机房A的缓冲队列里还有一批写操作没刷盘。切换后业务正常,但数据对不上——这就是典型的同步没做彻底。后来我们强制所有写操作必须等待两个中心的确认才能返回成功,代价是写延迟增加了3~5ms,但再没出过问题。
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容忍度和故障隔离范围。
- 如果是金融、支付等强一致业务,老老实实同城双活 + 异地冷备(类似两地三中心但简化)
- 如果是互联网应用(社交、电商、内容),可以考虑最终一致,选异地多活
- 如果只是为满足监管“异地灾备”的要求,用两地三中心最稳定,但要做好半年一次的切换演练
你想想看,很多团队刚开始做多活时,都喜欢直接上异地多活,觉得最“高级”。但实际上,异地多活的运维复杂度可能是同城双活的5倍以上。我曾经在一个技术分享会上问过10个号称“已实现异地多活”的团队,结果其中7个还停留在“读写分离+备机”的阶段,真正的单元化拆分根本没做。