1. 课程导论:缓存穿透、击穿、雪崩与 gRPC 故障排查
在分布式系统与微服务架构中,Redis 作为高性能缓存层,与 gRPC 作为高效 RPC 通信框架,是保障系统低延迟、高吞吐的核心组件。然而,缓存层的异常(穿透、击穿、雪崩)与 gRPC 接口的故障(超时、熔断、负载不均)是 SRE 日常运维中最常见的“隐形杀手”。本章将系统梳理这些核心概念,建立统一的故障排查思维模型。
📌 核心目标: 理解三类缓存异常的触发条件与危害,掌握 gRPC 故障的典型表现与排查路径,为后续章节的实战演练打下理论基础。
1.1 缓存穿透、击穿、雪崩:概念与对比
这三类异常虽然都表现为“请求绕过缓存直达数据库”,但触发场景与影响范围截然不同。下表从定义、触发条件、影响范围、典型场景四个维度进行对比:
| 异常类型 | 定义 | 触发条件 | 影响范围 | 典型场景 |
|---|---|---|---|---|
| 缓存穿透 | 请求查询一个根本不存在的数据,缓存与数据库均无命中,每次请求都穿透到 DB。 | 恶意攻击(如遍历不存在的 ID)、业务逻辑漏洞(如查询已删除的数据)。 | 全局性:所有不存在的 key 都会触发 DB 查询。 | 刷单攻击、爬虫遍历不存在的商品 ID。 |
| 缓存击穿 | 一个热点 key 在缓存失效的瞬间,大量并发请求同时穿透到 DB。 | 热点 key 过期 + 高并发访问。 | 局部性:仅影响单个热点 key。 | 秒杀商品详情页、微博热搜词条。 |
| 缓存雪崩 | 大量 key 在同一时间或短时间内集中过期,导致请求全部落到 DB。 | 缓存设置相同的过期时间、Redis 实例宕机、缓存服务重启。 | 全局性:大面积缓存失效,DB 瞬间压力激增。 | 双十一零点大量商品缓存同时过期、Redis 集群故障。 |
💡 记忆口诀: 穿透是“查无此人”,击穿是“一人倒下万人踩”,雪崩是“集体阵亡”。
1.2 三类异常的排查思路与应对策略
针对不同的异常类型,SRE 需要采取差异化的排查与防御手段。以下为实战中常用的策略清单:
- 缓存穿透:
- 排查: 监控 DB 查询 QPS 与缓存命中率,分析请求日志中不存在的 key 分布。
- 应对: 布隆过滤器(Bloom Filter)前置拦截、缓存空对象(设置较短 TTL)、参数校验增强。
- 缓存击穿:
- 排查: 定位热点 key,观察其过期时间点前后的 DB 负载与响应延迟。
- 应对: 互斥锁(Mutex Key)保证单线程重建缓存、逻辑过期(不设置物理 TTL)、热点 key 永不过期 + 后台异步更新。
- 缓存雪崩:
- 排查: 检查 Redis 内存使用率、key 过期时间分布、DB 连接池与慢查询日志。
- 应对: 过期时间添加随机偏移量、多级缓存(本地缓存 + Redis)、Redis 高可用架构(哨兵/集群)、限流降级。
1.3 gRPC 接口故障的典型表现
gRPC 基于 HTTP/2 与 Protobuf,在微服务间通信中广泛使用。其故障表现与传统的 RESTful 接口有显著差异,SRE 需要关注以下典型场景:
- 连接超时(DeadlineExceeded): 客户端设置的 deadline 内未收到响应,通常由网络抖动、服务端处理过慢、连接池耗尽引起。
- 服务不可用(Unavailable): 目标服务未启动、负载均衡器无健康后端、gRPC 服务注册/发现失败。
- 资源耗尽(ResourceExhausted): 服务端并发流数超限、内存/CPU 打满、gRPC 的
max_concurrent_streams配置过小。 - 内部错误(Internal): Protobuf 序列化/反序列化失败、业务逻辑 panic、gRPC 拦截器异常。
- 熔断与降级: 客户端熔断器(如 Hystrix、Resilience4j)触发,请求被快速失败,避免级联故障。
⚠️ 注意: gRPC 的 HTTP/2 长连接特性使得“连接泄漏”成为常见问题。如果客户端未正确关闭流(Stream),服务端会持续占用内存,最终导致 OOM 或连接数耗尽。
1.4 gRPC 故障排查思路
面对 gRPC 接口故障,建议遵循“由外到内、分层排查”的原则。以下为标准化排查流程:
- 检查网络层: 使用
ping、traceroute、ss -tlnp确认网络连通性与端口监听状态。 - 检查服务发现: 确认 gRPC 目标地址在注册中心(如 Consul、etcd、K8s Service)中是否健康。
- 检查客户端配置: 核对
deadline、max_retries、load_balancing_policy等参数是否合理。 - 检查服务端指标: 查看 gRPC 内置的
grpc_server_handling_seconds、grpc_server_started_total、grpc_server_msg_received_total等 Prometheus 指标。 - 检查日志与链路追踪: 结合结构化日志(如 JSON 格式)与分布式追踪(如 Jaeger、Zipkin)定位慢调用或异常调用链。
- 检查熔断与限流: 确认客户端熔断器状态(OPEN/HALF_OPEN/CLOSED),服务端是否触发了限流(如
rate limiter)。