2. 单点故障与冗余设计

聊容灾,第一个绕不开的词就是「单点故障」。

说白了,一个系统里只要有一个组件挂了,整个服务就瘫了——那这个组件就是单点。我见过太多团队,架构图画得漂漂亮亮,结果上线第一天,一个 Redis 节点宕机,全站 502。嗯,这就是典型的单点故障。

什么是单点故障?

单点故障(Single Point of Failure,SPOF)指的是系统中某个组件一旦失效,会导致整个系统不可用。它不一定是硬件,也可能是软件模块、网络链路,甚至是某个人——比如只有一个人会重启数据库。

核心判断标准: 这个组件挂了,业务还能不能跑?不能,它就是单点。

常见的单点故障场景

我梳理了几个我在项目中真实踩过的坑,你对照看看自己的系统有没有类似问题。

层级 典型单点 后果
硬件层 单台服务器、单块磁盘、单路电源 机器宕机,服务全挂
网络层 单交换机、单防火墙、单 DNS 网络隔离,请求进不来
数据层 单 MySQL 主库、单 Redis 数据写入失败,缓存雪崩
应用层 单实例微服务、单消息队列 请求堆积,业务中断
人员层 只有一个人会修某个组件 人请假,系统没人管

我曾经在一个风控项目里,把所有的规则引擎都部署在一台 4C8G 的机器上。结果半夜流量突增,CPU 打满,整个风控判断全部超时。那晚我一边重启一边骂自己——为什么不做冗余?

冗余设计原则

冗余不是堆机器,而是有策略地消除单点。我习惯把冗余设计分成三种模式,你根据业务场景选。

1. N+1 冗余

最基础的模式。系统需要 N 个节点才能承载流量,那就部署 N+1 个。多出来的那一个,平时不干活,或者只分担少量流量。

  • 适用场景: 对成本敏感,允许短时间切换
  • 典型例子: 3 台 Web 服务器扛 1000 QPS,部署 4 台
  • 我的经验: 我建议 N+1 的「+1」一定要做健康检查,否则它挂了你还不知道,等于没冗余
避坑指南: 我曾经 N+1 里那台备用机没接监控,结果主节点挂了,备用机也早就磁盘写满了。切换过去直接又崩了一次。所以冗余节点必须纳入监控体系。

2. Active-Active 双活

两个节点同时在线,都处理流量。任何一个挂了,另一个继续扛。这是我最喜欢的模式,因为资源利用率高。

  • 适用场景: 高并发、低延迟要求
  • 典型例子: 双活网关、双活缓存集群
  • 注意点: 数据一致性是最大挑战。两个节点同时写,冲突怎么处理?

你想想看,如果两个 Redis 同时写同一个 key,一个写 A,一个写 B,最后谁覆盖谁?所以双活通常需要「无状态」设计,或者用分布式锁兜底。

3. Active-Standby 主备

一个主节点干活,一个备节点等着。主挂了,备顶上。这种模式实现简单,但切换需要时间。

  • 适用场景: 数据库、有状态服务
  • 典型例子: MySQL 主从、Kubernetes 控制节点
  • 我的建议: 一定要做自动切换,别等人手动操作。人半夜反应慢,而且容易出错
⚠️ 重要提醒: Active-Standby 模式下,备机如果只同步不验证,数据可能已经损坏。我曾经遇到过主库 binlog 写坏,备库同步过去也是坏的。所以备库要定期做数据校验。

知识体系结构图

下面这张图帮你理清单点故障与冗余设计的核心逻辑。我习惯用这种图来给团队做培训,一目了然。

单点故障与冗余设计知识体系 单点故障 (SPOF) 常见场景 硬件 / 网络 / 数据 / 应用 冗余设计原则 N+1 / 双活 / 主备 单点故障特征 • 组件失效 = 系统不可用 • 无备份 / 无切换能力 • 常见于关键路径 • 监控盲区更容易出现 常见场景举例 • 单台 MySQL 主库 • 单实例微服务 • 单交换机 • 单 DNS 解析 冗余设计要点 • N+1:成本低,需监控 • 双活:高可用,一致性难 • 主备:实现简单,切换慢 • 所有节点都要纳入监控 核心思想:没有冗余的系统,本质上就是一场赌博

如何选择冗余策略?

我一般会问自己三个问题:

  1. 业务能接受多长的恢复时间? 秒级选双活,分钟级选主备,小时级选 N+1
  2. 数据一致性要求多高? 强一致性慎用双活,最终一致性可以大胆用
  3. 预算够不够? 双活成本最高,N+1 最省钱
我的习惯: 核心链路用双活,非核心链路用 N+1。比如风控的规则引擎我用双活,日志收集我用 N+1。这样既保证了关键业务的稳定性,又控制了成本。

最后说一句:冗余不是万能的。你做了双活,但两个节点都在同一个机房,一个地震全完蛋。所以冗余还要考虑「物理隔离」——这是下一层的话题了。


公众号:蓝海资料掘金营,微信deep3321