这是《Redis 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 本章按症状组织:连接失败、延迟飙升、内存告警、数据丢失、主从异常、Cluster 报错、缓存雪崩,给出排查路径和处置动作。
22.1 排查总原则
1. 先定影响面:单实例?单业务?全局?
2. 看时间线:变更、发布、活动、网络、磁盘;
3. 分层确认:客户端 -> 网络 -> Redis -> 系统 -> 架构;
4. 保留现场:INFO、SLOWLOG、CLIENT LIST、日志、指标;
5. 先恢复再根因:限流、降级、扩容、切流量。
万能命令:
PING
INFO all
SLOWLOG GET 20
CLIENT LIST
MEMORY DOCTOR
LATENCY DOCTOR
CONFIG GET *
22.2 连接失败
排查
telnet host 6379
redis-cli -h host -p 6379 ping
redis-cli -h host -p 26379 SENTINEL get-master-addr-by-name mymaster
确认:
- Redis 进程是否存活;
- bind/防火墙/安全组;
- 密码或 ACL;
- 客户端连接地址是否旧 Master;
maxclients是否达到上限;- 连接池是否耗尽。
关键指标
rejected_connections
connected_clients
maxclients
处置
临时:清理空闲连接、提高 maxclients、扩客户端池
长期:排查连接泄漏、规范化连接生命周期
22.3 延迟飙升
排查顺序
1. SLOWLOG 是否有慢命令
2. 是否大 key / HGETALL / SMEMBERS / KEYS
3. Lua 是否执行过长
4. QPS 与 CPU 是否突增
5. 网络 RTT 与重传
6. RDB fork / AOF fsync
7. 客户端 GC/池等待/序列化
快速定位
SLOWLOG GET 20
LATENCY DOCTOR
INFO stats
INFO persistence
CLIENT LIST
系统:
top -H -p $(pidof redis-server)
iostat -x 1
sar -n DEV 1
应急
停止危险命令来源
限流业务
切读流量到从节点
隔离热点业务
必要时重启前先保留现场与评估数据
22.4 内存告警
INFO memory
MEMORY STATS
MEMORY DOCTOR
确认:
used_memory 是否接近 maxmemory
evicted_keys 是否增长
是否存在 OOM command not allowed
碎片率是否异常
是否 BGSAVE/COW 导致 RSS 上涨
处理:
| 原因 | 动作 |
|---|---|
| 缓存自然增长 | 扩容或调 TTL |
| 大 key | 拆分/UNLINK |
| 僵尸 key | 生命周期清理 |
| 集中过期/淘汰 | 随机 TTL |
| 复制/客户端缓冲 | 治理慢消费者 |
| COW | 控制实例大小、加内存 |
22.5 数据丢失
可能原因
1. 未开启持久化且进程重启
2. 使用缓存淘汰策略,key 被驱逐
3. TTL 到期
4. 主从切换丢失异步复制数据
5. 误执行 FLUSHALL/DEL
6. 应用 bug 写错实例/DB
7. RDB/AOF 损坏或未恢复成功
确认
CONFIG GET appendonly
CONFIG GET save
CONFIG GET maxmemory-policy
INFO keyspace
INFO stats
MONITOR(短期小流量实例慎用)
检查客户端写入日志和业务请求 ID,不要只看 Redis。
恢复
有备份:新实例恢复 RDB/AOF -> 校验 -> 切流
无备份:从数据库/上游事件重建
业务必须幂等,避免重放造成重复副作用
22.6 主从复制异常
INFO replication
主节点:
connected_slaves 减少
slave offset 停滞
从节点:
master_link_status:down
master_sync_in_progress:1
master_repl_offset 停滞
常见原因:
- 网络抖动;
- backlog 太小导致全量同步;
- 从节点性能不足;
- 主节点输出缓冲超限断开;
- auth 配置错误;
- 大实例全量同步占满磁盘/网络。
处理:
修网络;
增大 repl-backlog-size;
错峰同步;
限制同时同步的 replica 数;
必要时重建从节点。
22.7 Sentinel 故障切换异常
排查:
SENTINEL masters
SENTINEL ckquorum mymaster
SENTINEL replicas mymaster
日志关注:
sdown master
odown master
+failover-state-begin
+switch-master
-failover-abort
常见问题:
| 问题 | 原因 |
|---|---|
| 不切主 | quorum/majority 不满足 |
| 反复切主 | 网络分区、超时配置过小 |
| 切主后丢数据 | 异步复制落后 |
| 客户端仍连旧主 | 未接入 Sentinel 事件 |
| 新 Master 不可写 | 只读配置/认证异常 |
22.8 Cluster 报错
CROSSSLOT
原因:多 key 操作的 key 不在同一槽。
处理:hash tag 或拆分请求。
MOVED 频繁
原因:槽归属变化、客户端拓扑未刷新。
处理:使用智能客户端,开启拓扑刷新。
CLUSTERDOWN
原因:槽未全覆盖、多数节点不可用、cluster-require-full-coverage=yes。
处理:
redis-cli --cluster check node:6379
redis-cli --cluster fix node:6379
迁移卡住
检查:
CLUSTER NODES
CLUSTER SLOTS
CLUSTER GETKEYSINSLOT slot count
处理:
确认源/目标节点存活
检查大 key
分批迁移
必要时 --cluster fix
22.9 缓存雪崩、击穿、穿透
详细设计见第 25 章。排查要点:
| 症状 | 常见原因 |
|---|---|
| DB QPS 突增,Redis miss 突增 | 大量 key 同时过期或 Redis 故障 |
| 单热点 key miss 导致 DB 压力 | 热点 key 失效 |
| 不存在 key 大量请求 | 攻击/爬虫/非法 ID |
应急:
接口限流
空值缓存
热点 key 逻辑过期
本地缓存兜底
DB 读写分离/扩容
22.10 事故复盘模板
影响:
开始/结束时间、请求量、失败量、业务影响
时间线:
告警时间、响应时间、动作时间、恢复时间
根因:
技术根因 + 流程根因
证据:
指标截图、SLOWLOG、配置快照、变更记录
修复:
立即修复 + 中期治理 + 长期防线
行动项:
负责人 + 截止时间 + 验收标准
本章小结
- 排查先定影响面和时间线,再分层确认;
- 延迟问题优先看慢命令、大 key、QPS、系统资源;
- 内存问题区分数据增长、淘汰、碎片、COW;
- 数据丢失要同时检查持久化、淘汰、TTL、误操作和复制;
- Cluster 报错先看槽状态与客户端重定向;
- 事故后必须把修复固化为监控、扫描和流程防线。
思考题
- Redis
PING正常但业务大量超时,下一步查什么? - 数据“丢失”但 Redis 未重启,有哪些可能性?
- 如何区分 Redis 慢、网络慢、客户端慢?