1. 多活架构概述:为什么需要多活,多活 vs 主备
1.1 从一次“本以为很稳”的故障说起
我记得十多年前,我刚带团队做第一套生产系统。当时公司业务增长快,老板拍板上了全套主备方案——一台主库、一台备库,外加两套应用服务器,备机常年跑着空转进程。所有人都觉得,“这够稳了吧?”
结果呢?有一次机房光缆被施工队挖断,主站点直接离线。我们手动切到备站,备机虽然能启动,但备库落后主库整整两小时的数据,丢了近万笔订单。老板在电话里吼,客户在群里骂,运维在机房里满头大汗——那晚,我彻底想明白了一件事:主备,不是高可用。
1.2 多活架构的核心驱动力
你想想看,现在的用户对可用性的容忍度有多低?页面卡3秒,用户就跑了;凌晨断服10分钟,早上就上热搜。单靠主备模式,已经扛不住了。
我个人习惯把多活的需求归结为三个字:真·连续。
- 业务连续:任何一个站点挂了,流量秒级切到其他站点,用户无感知。
- 数据连续:多个站点同时读写,数据实时一致或最终一致,不丢不偏。
- 体验连续:用户无论从哪个站点接入,看到的都是同样的业务状态。
我在项目中遇到过更极端的场景:某次双十一大促,主站点流量冲到峰值,硬件过载直接宕机。因为做了多活,流量自动分散到另外两个站点,系统虽然慢了几秒,但全程没停。那天晚上,我睡了个安稳觉——因为我知道,多活不是“能不能用”的问题,而是“能不能扛”的问题。
1.3 多活 vs 主备:不只是数量的区别
很多人以为多活就是“多备几台机器”,其实完全不是。我见过不少团队,号称做了多活,实际上就是主备换了个名字——备机依然空闲,切换依然手动。这叫什么多活?这叫自欺欺人。
来看一张简单的对比表,你就明白了:
| 对比维度 | 主备架构 | 多活架构 |
|---|---|---|
| 可用性 | 切换期间有停机(分钟级) | 故障时零或秒级切换 |
| 资源利用率 | 备机常年闲置,浪费严重 | 所有站点都在承载流量,利用率高 |
| 切换方式 | 手动或半自动,依赖运维 | 自动、无感、可灰度 |
| 数据一致性 | 主写备读或全主写,备库滞后 | 多写多读,数据实时/最终一致 |
| 横向扩展 | 只能纵向加硬件,扩展难 | 加站点即可水平扩展,弹性好 |
| 运维复杂度 | 低,但故障处理成本高 | 初期投入高,但长期自动化后成本可控 |
嗯,这里要注意:主备不是一无是处。对于预算有限、业务量小、对可用性要求不高的场景,主备依然有它的价值。但一旦你的业务体量上来,用户对“随时可用”有了期望,多活就是唯一的选择。
1.4 多活的“三层路由”模型
做多活,核心就是做路由。流量从哪里来,到哪里去,怎么分,怎么切——全得靠路由策略。我个人习惯把多活的流量路由分为三个层次:
- 全局路由层:DNS/GSLB,决定用户的流量去哪个站点。这是第一道防线。
- 应用路由层:网关/负载均衡,在同站点内把请求分到具体的服务实例。这是第二道精细控制。
- 数据路由层:数据库/缓存的分片策略,保证数据在多站点间正确流转。这是最难也最绕不开的一层。
下面这张图展示了我常用的多活路由拓扑概览,你可以对照着理解:
1.5 多活架构的两种主流模式
根据我走访多家互联网公司的经验,目前主流的部署模式就两种:同城双活和异地多活。它们在延迟、一致性、成本上差异很大。
| 模式 | 典型距离 | 延迟 | 一致性策略 | 适用场景 |
|---|---|---|---|---|
| 同城双活 | 10~50 km | 亚毫秒级 | 强一致/最终一致混用 | 金融、高频交易、支付 |
| 异地多活 | 500~3000 km | 几十~上百毫秒 | 最终一致+本地优先写 | 社交、电商、内容分发 |
1.6 小结:从主备到多活,到底变了什么?
我经常被问到:“我们现在的系统用主备挺稳的,为什么要转多活?”
我的回答很简单:主备解决的是“坏了能不能恢复”的问题,多活解决的是“坏了能不能继续”的问题。这两个目标,差了一个维度。
从运维视角看,主备是“被动等待”,多活是“主动防御”。从用户视角看,主备意味着“切完可能出错”,多活意味着“出错了也不用切”。
当然,转型需要代价。你需要重新设计路由策略、改造数据层、引入流量调度系统……这些我们在后面的章节会逐一深入。
嗯,先说到这里。记住一句话:多活不是一种技术选择,而是一种架构思维。想清楚了,再动手。