Redis 生产故障应急处理

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
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容