Redis 生产故障应急处理
应急处理原则
处理 Redis 生产故障时,遵循以下原则:
1. 先恢复,后排查 → 优先让业务可用
2. 最小化变更 → 一次只改一个参数
3. 保留现场 → 记录当前状态再操作
4. 安全优先 → 评估每个操作的风险
5. 沟通同步 → 告知受影响方
常见故障应急手册
故障一:Redis 进程挂掉
现象
- 应用端连接失败
- 主从全断
- 监控检测到进程消失
应急流程
# Step 1: 确认进程状态
ps aux | grep redis-server
systemctl status redis-server
# Step 2: 检查退出原因
dmesg | tail -20 # 检查 OOM Killer
tail -100 /var/log/redis/redis.log # 检查 Redis 日志
/var/log/syslog | tail -20 # 系统日志
# Step 3: 尝试启动
systemctl start redis-server
# Step 4: 验证恢复
redis-cli PING
redis-cli DBSIZE
redis-cli INFO replication
# Step 5: 如果无法启动,从备份恢复
cp /backup/redis/dump.rdb /var/lib/redis/
systemctl start redis-server
常见原因
- OOM Killer:check
dmesg | grep oom,调大内存或限流 - 段错误:check Redis 日志,可能需要升级版本
- 磁盘满:
df -h,清理磁盘或扩容
故障二:内存爆满
现象
- 写入报 OOM
- 活跃 key 被大量淘汰
- 应用层大量超时
应急流程
# Step 1: 确认状态
redis-cli INFO Memory | grep -E "used_memory_human|maxmemory_human|maxmemory_policy"
redis-clI INFO Stats | grep evicted_keys
# Step 2: 立即扩容(几分钟内解决)
redis-cli CONFIG SET maxmemory 12G
# Step 3: 检查淘汰策略,必要时调整
redis-clI CONFIG SET maxmemory-policy allkeys-lru
# Step 4: 查找并清理大 Key
redis-cli --bigkeys
redis-cli UNLINK "big:key:name" # 异步删除
# Step 5: 分析内存增长原因
redis-cli MEMORY STATS
故障三:响应急剧变慢
现象
- 所有命令响应时间从 1ms 变为 100ms+
- 应用层请求大面积超时
- CPU 使用率高
应急流程
# Step 1: 快速诊断
redis-cli SLOWLOG GET 10 # 检查慢查询
redis-cli INFO CPU # 检查 CPU
redis-clI INFO Stats # 检查统计
top -p $(pgrep -f redis-server) # 系统 CPU
# Step 2: 检查是否在持久化
redis-cli INFO Persistence | grep -E "rdb_bgsave_in_progress|aof_rewrite_in_progress"
# 如果是持久化导致 → 等到持久化完成
# Step 3: 检查大 Key
redis-cli --bigkeys
# Step 4: 如果是因为大 Key 阻塞
# 使用 UNLINK 替代 DEL 删除大 key
redis-clI UNLINK "problematic:key"
# Step 5: 降级措施
# 临时关闭持久化(风险操作)
redis-clI CONFIG SET save ""
redis-clI CONFIG SET appendonly no
故障四:主从复制中断
现象
- 从库数据落后
- 从库不提供读服务
- 主库负载升高
应急流程
# Step 1: 检查复制状态
redis-cli INFO replication
# master_link_status:down
# master_last_io_seconds_ago:300
# Step 2: 尝试重连
redis-cli SLAVEOF NO ONE
redis-cli SLAVEOF master-host 6379
# Step 3: 如果重连失败,检查网络
ping master-host
telnet master-host 6379
# Step 4: 检查复制积压缓冲区
# 如果 repl-backlog 太小,增大
redis-clI CONFIG SET repl-backlog-size 512mb
# Step 5: 紧急情况:从库丢失 → 重新全量同步
redis-cli SLAVEOF master-host 6379
故障五:哨兵脑裂(频繁切换)
现象
- 主库在短时间内多次切换
- 数据丢失或不一致
- 应用连接不稳定
应急流程
# Step 1: 确认状态
redis-cli -p 26379 SENTINEL MASTER mymaster
# Step 2: 临时增大判定时间
redis-cli -p 26379 SENTINEL SET mymaster down-after-milliseconds 60000
# Step 3: 检查网络和负载
# 临时停止非核心服务
# Step 4: 锁定主库地位(紧急情况)
# 在所有哨兵上执行临时禁用
for port in 26379 26380 26381; do
redis-cli -p $port SENTINEL SET mymaster failover-timeout 99999999
done
快速诊断命令汇总
# 30 秒内完成基础诊断
redis-cli PING
redis-cli INFO Server | grep uptime_in_seconds
redis-cli INFO Memory | grep -E "used_memory_human|maxmemory_human"
redis-clI INFO Clients | grep connected_clients
redis-clI INFO Stats | grep -E "evicted|rejected"
redis-clI INFO Persistence | grep -E "bgsave|rewrite"
redis-clI INFO Replication | grep master_link_status
redis-clI SLOWLOG GET 5
redis-clI --bigkeys
故障场景卡
| 故障 | 首要操作 | 次要操作 | 注意事项 |
|---|---|---|---|
| 进程挂 | 立即重启 | 检查日志 | 确认数据文件存在 |
| 内存满 | 增大 maxmemory | 调整淘汰策略 | 监控淘汰速率 |
| 响应慢 | 检查 SLOWLOG | 检查大 Key | 避免频繁 MONITOR |
| 复制中断 | 手动重连 | 检查网络 | 大实例全量同步慢 |
| 哨兵漂移 | 增大超时设置 | 检查网络 | 不要随意重置 |
| OOM | 改淘汰策略 | 清理数据 | nceviction 需评估 |
| 全量同步 | 等待完成 | 增大 repl-backlog | 监控带宽 |
恢复后的复盘
# 故障复盘模板
## 基本信息
- 时间:2026-05-18 16:00 - 16:30
- 影响范围:订单服务 30 分钟不可用
- 影响程度:P0 级故障
## 故障经过
1. 15:55 - 内存使用飙升至 95%
2. 16:00 - 写入开始报 OOM
3. 16:05 - 订单服务发现不可用
4. 16:10 - 扩容 maxmemory 至 12G
5. 16:15 - 服务恢复
6. 16:20 - 查找内存增长原因
...
## 根因分析
- 缓存未设置过期时间
- 没有监控告警
## 改进措施
- [ ] 所有缓存 key 增加 TTL
- [ ] 配置 80% 内存告警
- [ ] 设置 maxmemory-policy allkeys-lru
- [ ] 每周巡检大 Key
面试要点
- 先恢复后排查:第一时间让业务可用
- 应急三板斧:扩容、改策略、清理
- 保留现场:记录状态再操作,便于复盘
- 最小变更:一次改一个参数,避免引入新问题
- 沟通同步:运维不是一个人在战斗
- 事后复盘:找到根因,防止重复发生
- 准备 SOP:提前编写故障处理标准操作流程
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容