事故现场通常不会先报出故障名称,它只留下一条曲线、一组分叉或一片过分安静的大盘。这里把全书病历按症状形状重新归组,让你从看见的证据反查可能的机理;每张卡还标了第 16 章总检用的机制轴——放大 / 一致性 / 单点,作为第二条查找路径。
值班时,先按你在大盘上看到的形状找到下面六组,再在组内逐条核对症状文字。形状负责缩小搜索面,机理、易发场景与上下游证据负责确认诊断;不要只凭一根曲线直接开药。每张卡末尾还有一行机制轴标签——放大类 / 一致性类 / 单点类,那是第 16 章总检用的第二轴:形状回答“我看见了什么”,机制回答“该动哪一族处方、游戏日先打哪一类”。
形状只负责把嫌疑范围缩小到几个候选,不负责宣判。下表按你正在看的是哪块面板分组:同一组里的候选必须能在同一块面板上长成同一个样子,否则谈不上鉴别——一根时间轴上的尖刺、一张按分片切开的直方图、一笔对不平的业务账,是三块不同的面板,不能混在一组。每个候选配一条下一步证据,写清本卡该看到什么、看到别的该转向谁:证据若排除不了同组里至少一个候选,就还不算证据。本表不新增病历卡编号,只把已有的卡按「怎么排除」重排一遍。
| 你在看的面板 | 候选诊断 | 下一步证据 · 本卡该看到什么 → 否则转向谁 |
|---|---|---|
| 大盘平坦 聚合 RED 与基础设施曲线全绿,业务侧却有工单或账差 | 只是「聚合」看起来平坦,局部子集在报错(No.15 灰色故障) | 把错误率与延迟按实例、分区、可用区、版本、租户切片。本卡:某个子集显著偏离、其余正常,而且这些请求确实失败了。若切片后各子集都干净、请求全部成功只是结果不对 → 不是 No.15,转去做下面两行的对账。 |
| 同一实体两处存储的值不同(No.03 双写不一致) | 抽样同一 key,比较缓存里的值与 DB 里的版本号/更新时间。本卡:同一实体在两处的值不同,差异出现在最近一次写之后,且每一处内部自洽。若缓存与 DB 一致、业务台账却缺一条或多一条 → 转向 No.12。 | |
| 同一事件被处理了 0 次或 ≥2 次(No.12 消息丢失与重复) | 用同一幂等键/消息 id 做三方对账:发送记录、broker 投递记录、消费结果。本卡:处理次数 ≠ 1(0 次是丢失,≥2 次是重复),而单条存储内部值是自洽的。若三方次数都是 1、只是缓存与 DB 值不同 → 转向 No.03。 | |
| 时间轴尖刺 末端 QPS 或错误率的时间曲线,尖起又回落 | 真实入口尖峰:开售、推送、热搜 | 把入口 QPS 与尖刺时刻叠在同一条时间轴上。本卡:入口与末端同一时刻、同一比例尖起。若入口曲线平稳、只有末端尖起 → 放大发生在系统内部,转向 No.05 / No.08。 |
| 一个热点 key 过期后的并发回源(No.05 缓存击穿) | 查尖刺窗口内的慢查询/回源日志。本卡:请求集中在同一个 key,该 key 的 miss 计数在同一秒跳升并与它的 TTL 到期对齐,尖刺前后这个 key 落到 DB 的量接近 0。若同一 key 在尖刺之外也持续高频落 DB → 那是持续热点,不是击穿,转向 No.10 的下钻;若落到 DB 的是大量不同的、查不到结果的 key → 转向 No.04;若尖刺里是很多不同 key、来自同一批客户端 → 转向 No.08。 | |
| 一批等待者同刻醒来(No.08 惊群效应) | 看尖刺是否以固定周期重复,周期是否等于统一超时、固定 backoff 或定时任务间隔。本卡:周期性,每次尖刺内请求分散在很多 key、但发起时间挤在同一毫秒级窗口。若只出现一次、且集中在一个 key → 转向 No.05。 | |
| 写后立刻读到旧值的毛刺(No.02 主从复制延迟) | 把错误率毛刺与复制延迟曲线、批量写入时刻叠在一起。本卡:报错的都是刚写完立刻读、且打到副本的请求,DB 上没有并发回源的尖刺,副本追平后自愈。若毛刺伴随 DB QPS 尖起、报错的不限于刚写过的 key → 转向 No.05。 | |
| 单调爬升 末端负载或队列长度的时间曲线只升不落 | 真实新流量涌入,容量确实不够了 | 看入口 QPS/DAU 是否与末端指标同步、同比例上涨。本卡:入口先涨、末端跟涨。若入口平稳、只有末端在涨 → 多出来的负载是系统自己造的,转向 No.07 / No.11。 |
| 重试放大(No.07 重试风暴) | 把入口 QPS、末端 QPS 与重试计数放在同一条时间轴。本卡:入口平稳,末端 QPS 与重试计数同步爬升。若末端处理速率已贴顶不动、涨的只是排队长度 → 转向 No.11。 | |
| 消费速率长期低于生产速率(No.11 消息积压) | 看 backlog 与 oldest-message-age 是否同向上涨、消费曲线是否长期压在生产曲线之下。本卡:末端消费速率是平的(已到上限),涨的是欠债;暂停生产后 backlog 以消费速率线性下降。若末端速率本身还在往上爬 → 转向 No.07。 | |
| 切片不对称 按分片 / 可用区 / 实例切开的直方图,一根柱子偏离其余——不是时间轴 | 一片被打热(No.10 热点分片) | 偏离的维度是负载:单片 QPS、CPU 或慢查询显著高。算最热 ÷ 平均,第 8 章的判据是大于 3;再下钻到 key,看是否少数 key 或某个场次贡献了大头。若最热 ÷ 平均在 3 以内、或偏离的不是负载而是错误率 → 转向 No.15。 |
| 一片坏了但负载正常(No.15 灰色故障) | 偏离的维度是错误率或延迟,而该子集的负载与其他子集持平甚至更低;把它摘流后用户报错立即消失。若摘流后热度只是转移到另一片 → 转向 No.10。 | |
| 并发写者 业务台账:同一订单被扣两次、库存为负、同一键两条互相矛盾的记录;大盘往往平静 | 两个进程同时进入临界区(No.13 分布式锁失效) | 查锁服务日志与临界区日志。本卡:两个 owner 的持有区间重叠(后者 acquire 早于前者 release),或旧 fencing token 在新 token 之后仍写入成功。只看到 TTL 到期或续租失败不算——那只是嫌疑,没有重叠 owner 就排除不了 No.12。若临界区里始终只有一个 owner、重复来自同一条消息被投递两次 → 转向 No.12。 |
| 同一条消息被投递两次(No.12 消息重复) | 查 broker 的重投计数与消费者 ack 超时日志。本卡:同一 message-id 被投递 ≥2 次,两次执行是同一条消息,中间隔着一次消费超时或重启。若两次执行来自两条不同请求、同时进入临界区 → 转向 No.13。 | |
| 时间戳裁决出了错误顺序(No.17 时钟漂移) | 把冲突两条记录的写入时间戳与业务因果顺序对比,并看节点时钟偏差监控。本卡:时间戳顺序与因果顺序矛盾(取消带着比支付更早的时间),偏差超过租约或合并规则的安全裕量。若时间戳顺序自洽、只是执行了两次 → 转向 No.12 / No.13。 | |
| 两地各自当主(No.14 脑裂) | 看两地在同一时段是否都有写入成功日志。本卡:同一业务键出现两条互不继承的版本线,各自在自己的机房成功,复制恢复时冲突集中暴露。若只有一个机房在写、冲突发生在单集群内 → 转向 No.13。 |
形状告诉你“看见了什么”,机制告诉你“该动哪一族处方”。第 16 章的收官总检把全书病历归成三种体质,这里把它接到图鉴上:每张卡末尾的「机制轴」一行标着它属于哪一类,本表是反向索引——从体质出发,找到同类的全部卡。同一张卡只在下面六个形状组里出现一次,这里只放指针。
| 体质 | 共同机理 | 处方族 | 卡片 |
|---|---|---|---|
| 放大类 | 小触发在系统内部长成比自身大得多的负载:并发回源、逐层重试、同步唤醒、沿依赖传播、按时间累积欠债、触发消失后仍自我供能。 | 切断放大边:互斥回源、单一重试责任层与预算、jitter、舱壁与熔断、入口限流与慢放量。 | No.04 缓存穿透 · No.05 缓存击穿 · No.06 缓存雪崩 · No.07 重试风暴 · No.08 惊群效应 · No.09 级联故障 · No.11 消息积压 · No.16 亚稳态故障 |
| 一致性类 | 同一份事实在时间或故障中被复制成两个版本:主与从、缓存与 DB、生产与消费、两个持有者、两个主、两只时钟。 | 让真相可仲裁:写后读主与确认中语义、补偿与对账、幂等键与死信、fencing token 与持有者校验、多数派与单调版本。 | No.02 主从复制延迟 · No.03 缓存与 DB 双写不一致 · No.12 消息丢失与重复 · No.13 分布式锁失效 · No.14 脑裂 · No.17 时钟漂移 |
| 单点类 | 一处共享闸门或一个被钉住的子集先耗尽,其余节点的余量无法接力;灰色故障是它的局部型——坏的不是负载,是被路由钉住的那个子集。 | 打散与隔离:限并发与获取超时、按下游容量定池、热点隔离与二次打散、按切片观测并摘流。 | No.01 连接池耗尽 · No.10 热点分片 · No.15 灰色故障 |
这三类在第 16 章各对应一种游戏日实验与一种“证明没留后遗症”的方式:第 16 章 · 3 病历卡总检 →
指标垂直跳变,一眼可见:资源突然贴顶、保护层突然失效,或调用链从局部异常快速塌成全局不可用。
瞬时脉冲,回落快:故障证据只在短窗口里出现,必须把尖刺与 TTL、写高峰、重试周期、进程停顿或故障切换对齐。
单调恶化,不自愈:先找到让斜率持续为正的反馈环或净流入,再谈扩容、重启和恢复时间。
展开章节:第 9 章 · 消息队列——削峰填谷
缓慢劣化,容易被忽视:日常大盘可能只比昨天差一点,直到一次流量上升把长期累积的余量吃完。
监控看不见,只有工单或对账能发现:基础设施曲线平稳,不代表业务结果正确;这组故障要靠主动比对制造可观测证据。
展开章节:第 9 章 · 消息队列——削峰填谷
展开章节:附录新增 · 互链 第 13 章微服务拆分 / 第 14 章可观测性
不是变差,是变得不一致:集群平均值可能健康,真正的证据藏在分片差、双线版本或互相矛盾的时间轴里。
展开章节:第 8 章 · 分库分表——以及热点分片
展开章节:第 15 章 · 异地多活——以及脑裂
展开章节:附录新增 · 互链 第 15 章异地多活与脑裂