Skip to content

微信支付 XConfig Redis 雪崩复盘

基本信息

  • 涉及系统:XConfig 及部分下游系统(XDC / XUC / XWatt

摘要

本次故障由三项因素叠加触发:

  • Redis 大 Key 架构遗留
  • 异常扩容
  • 无版本校验下的并发全量拉取

40 个实例同时拉取百 MB 级配置文件,产生数十 GB 级瞬时流量,导致 Redis Proxy 出口带宽被打满、CPU 负载飙升。随后 XConfig 请求超时并触发降级,造成首页白屏;下游(XDC/XWatt/XUC 等)因强依赖配置中心出现级联不可用。

当前已完成止血:版本校验、Gzip 压缩、大 Key 巡检、随机延迟(流量打散)等措施已上线。长期将通过 COS 迁移(Redis 仅存索引)从架构上消除大 Key 风险。

事件经过

时间事件说明/证据
11月28日功能发布发布跨模块配置“CFS → Redis”改造版本,将原文件内容以全量 JSON 形式存入 Redis。该设计在架构层面引入大对象存储,为后续故障埋下基础条件。
12月1日 15:00功能发布部署“HR 字段数据补充”功能,人员数据对象变大,进一步放大大 Key 风险。
12月1日 15:03异常事件监控出现“Redis Proxy 出流量限流”致命告警。
12月1日 16:46应用端超时开始日志密集告警:从 Redis 获取配置失败,系统回退到 DB 拉取。说明在带宽彻底打满前,网络已出现拥塞并触发应用层降级。
12月1日 16:51关键触发点XConfig 未上线版本实例数从 0 异常升至 40;Redis 内存阶梯式跳涨。多实例同时启动触发并发“配置预热”,出现惊群效应。
12月1日 16:47-18:07资源代偿Redis 出口带宽长期接近 100%,CPU 利用率显著升高。带宽饱和导致请求排队,CPU 主要消耗在序列化和网络 IO。
12月1日 17:45告警升级首次记录节点 CPU 提示,随后出现 Redis CPU 高使用率告警。
12月1日 19:17业务受损XConfig 页面白屏;下游 XDC/XWatt/XUC 等部分不可用;入流量异常波峰。下游重试与配置拉取进一步放大流量压力。
12月1日 20:00故障恢复扩容 XSOA,并重启 XConfig 以缩容异常实例;Redis 指标恢复正常。

原因分析

故障链路(Failure Chain)

  1. 大 Key 架构遗留
  2. 异常扩容产生 40 个实例
  3. 无版本校验,触发并发全量拉取大 Key
  4. Redis Proxy 带宽与 CPU 快速耗尽
  5. XConfig 降级,下游级联不可用

根本原因:Redis 大 Key(约 350MB)

  • 两类大 Key:113MB100MB,总量约 350MB
  • 单次读取占用大量带宽与 CPU
  • 结论:大 Key 是 Redis 无法承载并发访问的结构性根因

触发原因:异常扩容导致惊群

  • 单实例启动即执行全量配置拉取
  • 40 个实例同时预热,瞬时请求量数量级放大
  • 结论:并发预热将大 Key 风险放大到系统不可承受范围

放大原因:无版本校验的全量拉取策略

  • 客户端始终全量拉取,无增量、无跳过逻辑
  • 结论:版本校验缺失导致流量无法抑制,是故障放大的关键因素

附带因素:架构与流程防线缺失

  • 迁移阶段以成本优先,保留“文件整体入 Redis”模式
  • 未对带宽峰值、异常扩容、惊群场景进行容量评估
  • 缺少压缩、错峰、分片、安全阈值等防御机制

处理措施

措施描述预期效果Owner / 状态验收结果
版本校验拉取前对比 update_time,未变化则跳过常态带宽降低约 99%fishcui(已完成,12.2)扩容/重启带宽 ≤ 40%
Gzip 压缩写入压缩、读取解压数据量减少 80%+fishcui(已完成,12.2)Redis 出流量明显下降
移除不当兜底Redis 失败不再全量查库避免数据库雪崩ikunyang(已完成,12.1)DB QPS 稳定
随机延迟(流量打散)启动预热/定时任务前引入随机延迟,使实例错峰访问避免惊群峰值fishcui(已完成,12.2)扩容场景无明显流量峰值

如何规避

为避免同类故障再次发生,在软件开发生命周期各环节增加强制性机制。

设计阶段:架构评审红线

  • 所有涉及存储结构和缓存策略的变更必须进行容量评估
  • 峰值带宽超过节点规格 50% 的方案必须重构
  • 高风险变更必须通过 Design Review

开发阶段:工程防御机制

  • CI/CD 静态扫描禁止写入 >1MB Redis Value
  • Redis Client SDK 内置能力:
  • 自动压缩
  • 随机延迟(流量打散)
  • 大 Key 写入拦截
  • 版本校验

测试阶段:极端场景演练

  • 测试环境数据量需与生产一致

运维阶段:监控 + 熔断

  • Redis 带宽达到 70% 触发告警阈值

以点带面

服务边界需进一步明确

下游对 XConfig 的非必要依赖放大了故障影响。

规划方向:配置与人员数据职责彻底解耦,统一通过 XSOA / HR Gateway 获取。

评审流程需强化风险意识

涉及核心存储或大规模数据流改造,必须触发架构评审,不能仅依赖 Code Review。

大 Key 管控制度化

确立统一规范:Redis Value 超过 1MB 视为禁止写入。

防御性编程作为质量底线

压缩、错峰、版本校验、渐进加载需成为框架默认能力。

行动计划

行动项目标Owner / 状态验收标准
大 Key 巡检定期扫描,提前发现隐患fishcui(已完成)每周巡检报表
COS 迁移(核心)大文件直连 COS;Redis 存 URL/Hash,根治大 Keyikunyang(开发中)并发预热流量降至可控范围

架构最佳实践:Redis + COS 协同模式

核心原则

Redis 存索引(轻量),COS 存实体(重量),实现控制面与数据面解耦。

写入模式

  1. 文件上传 COS
  2. 返回 URL + Hash
  3. Redis 存储 {url, version, hash}

读取模式

  1. 从 Redis 获取元信息
  2. 校验本地缓存
  3. 若版本变更,从 COS 下载

优势

  • 扩容时不会对 Redis 形成流量冲击
  • 大文件由 COS/CDN 处理,不占用 Redis 带宽
  • 完全规避大 Key 风险

结语

本次故障由架构迁移遗留、异常并发启动、缺乏防御机制等多重因素叠加导致。当前已完成核心止血,正在推进结构性修复。后续将通过 COS 迁移、严控大 Key、强化流程治理,提升系统稳定性与可恢复性。

评论区

欢迎留言、补充或勘误。

xiaoba.blog