1. 多活架构概述:为什么需要多活,多活 vs 主备

1.1 从一次“本以为很稳”的故障说起

我记得十多年前,我刚带团队做第一套生产系统。当时公司业务增长快,老板拍板上了全套主备方案——一台主库、一台备库,外加两套应用服务器,备机常年跑着空转进程。所有人都觉得,“这够稳了吧?”

结果呢?有一次机房光缆被施工队挖断,主站点直接离线。我们手动切到备站,备机虽然能启动,但备库落后主库整整两小时的数据,丢了近万笔订单。老板在电话里吼,客户在群里骂,运维在机房里满头大汗——那晚,我彻底想明白了一件事:主备,不是高可用。

为什么需要多活?说白了,就是不想再经历那种“切过去了,系统却还是坏的”的绝望。

1.2 多活架构的核心驱动力

你想想看,现在的用户对可用性的容忍度有多低?页面卡3秒,用户就跑了;凌晨断服10分钟,早上就上热搜。单靠主备模式,已经扛不住了。

我个人习惯把多活的需求归结为三个字:真·连续。

  • 业务连续:任何一个站点挂了,流量秒级切到其他站点,用户无感知。
  • 数据连续:多个站点同时读写,数据实时一致或最终一致,不丢不偏。
  • 体验连续:用户无论从哪个站点接入,看到的都是同样的业务状态。

我在项目中遇到过更极端的场景:某次双十一大促,主站点流量冲到峰值,硬件过载直接宕机。因为做了多活,流量自动分散到另外两个站点,系统虽然慢了几秒,但全程没停。那天晚上,我睡了个安稳觉——因为我知道,多活不是“能不能用”的问题,而是“能不能扛”的问题。

1.3 多活 vs 主备:不只是数量的区别

很多人以为多活就是“多备几台机器”,其实完全不是。我见过不少团队,号称做了多活,实际上就是主备换了个名字——备机依然空闲,切换依然手动。这叫什么多活?这叫自欺欺人。

来看一张简单的对比表,你就明白了:

对比维度 主备架构 多活架构
可用性 切换期间有停机(分钟级) 故障时零或秒级切换
资源利用率 备机常年闲置,浪费严重 所有站点都在承载流量,利用率高
切换方式 手动或半自动,依赖运维 自动、无感、可灰度
数据一致性 主写备读或全主写,备库滞后 多写多读,数据实时/最终一致
横向扩展 只能纵向加硬件,扩展难 加站点即可水平扩展,弹性好
运维复杂度 低,但故障处理成本高 初期投入高,但长期自动化后成本可控

嗯,这里要注意:主备不是一无是处。对于预算有限、业务量小、对可用性要求不高的场景,主备依然有它的价值。但一旦你的业务体量上来,用户对“随时可用”有了期望,多活就是唯一的选择。

1.4 多活的“三层路由”模型

做多活,核心就是做路由。流量从哪里来,到哪里去,怎么分,怎么切——全得靠路由策略。我个人习惯把多活的流量路由分为三个层次:

  1. 全局路由层:DNS/GSLB,决定用户的流量去哪个站点。这是第一道防线。
  2. 应用路由层:网关/负载均衡,在同站点内把请求分到具体的服务实例。这是第二道精细控制。
  3. 数据路由层:数据库/缓存的分片策略,保证数据在多站点间正确流转。这是最难也最绕不开的一层。

下面这张图展示了我常用的多活路由拓扑概览,你可以对照着理解:

多活路由三层模型 全局路由层(DNS/GSLB) 站点 A(广州) 应用路由层(网关) 数据路由层(DB/缓存) 服务实例池 (订单/用户/支付) 站点 B(上海) 应用路由层(网关) 数据路由层(DB/缓存) 服务实例池 (订单/用户/支付) 数据同步(CDC/消息) 用户请求 关键技术点:健康检查 + 流量权重 + 数据拓扑感知
你想想看,为什么数据路由层要单独画出来?因为很多团队在应用层做得很好,一到数据层就翻车。我曾经在一个项目中,应用层切流量切得飞快,但数据库还是强依赖主库,结果流量到备站后,查不到用户数据——这就是典型的“路由断层”。

1.5 多活架构的两种主流模式

根据我走访多家互联网公司的经验,目前主流的部署模式就两种:同城双活和异地多活。它们在延迟、一致性、成本上差异很大。

模式 典型距离 延迟 一致性策略 适用场景
同城双活 10~50 km 亚毫秒级 强一致/最终一致混用 金融、高频交易、支付
异地多活 500~3000 km 几十~上百毫秒 最终一致+本地优先写 社交、电商、内容分发
我曾经踩过一个坑:异地多活中强求强一致。两个机房相距2000公里,网络抖动一下,写请求就卡住了,整个链路被拖死。后来我们改为“本地写+异步同步+冲突检测”,系统才真正活起来。记住:远距离下,强一致等于不可用。

1.6 小结:从主备到多活,到底变了什么?

我经常被问到:“我们现在的系统用主备挺稳的,为什么要转多活?”

我的回答很简单:主备解决的是“坏了能不能恢复”的问题,多活解决的是“坏了能不能继续”的问题。这两个目标,差了一个维度。

从运维视角看,主备是“被动等待”,多活是“主动防御”。从用户视角看,主备意味着“切完可能出错”,多活意味着“出错了也不用切”。

当然,转型需要代价。你需要重新设计路由策略、改造数据层、引入流量调度系统……这些我们在后面的章节会逐一深入。

嗯,先说到这里。记住一句话:多活不是一种技术选择,而是一种架构思维。想清楚了,再动手。