8.5.5 典型故障场景与恢复流程

本节围绕常见故障场景与可执行恢复流程展开,强调“先止损、再定位、后恢复、终复盘”的闭环,并配套可执行命令、排错步骤与练习。

原理草图:故障处理闭环与组件关系

文章图片

1. 实例不可用/进程崩溃#

症状:连接超时、NOAUTH/LOADING异常、应用报错。
止损:摘除流量(LB/应用开关),检查资源(CPU/内存/磁盘/句柄)。

定位命令(含解释)

# 1) 查看进程与端口
ps -ef | grep redis-server
ss -lntp | grep 6379  # 预期: 监听端口存在

# 2) 系统资源与OOM
dmesg | tail -n 50 | grep -i oom
free -h
df -h

# 3) Redis日志(默认路径示例)
tail -n 200 /var/log/redis/redis-server.log

恢复流程示例

# 停止大Key写入: 临时在应用侧降级/关闭写入
# 重启Redis服务(systemd安装示例)
sudo systemctl restart redis
sudo systemctl status redis

# 验证读写
redis-cli -h 127.0.0.1 -p 6379 ping         # 预期: PONG
redis-cli set healthcheck ok
redis-cli get healthcheck

排错补充
- 如果日志显示Loading长时间不结束,检查RDB/AOF文件大小与磁盘IO。
- 若NOAUTH,核对requirepassmasterauth配置。

练习
1) 故意停止Redis,按流程恢复并验证读写。
2) 用ulimit -n检查句柄限制,模拟连接数不足问题。


2. 内存耗尽/拒绝写入#

症状OOM command not allowed、写入失败、内存持续增长。
止损:启用降级、禁止大Key写入、临时扩容内存或切换实例。

定位命令

# 内存指标与碎片率
redis-cli info memory | egrep "used_memory_human|mem_fragmentation_ratio|maxmemory"

# 识别大Key
redis-cli --scan --pattern "*" | head -n 20
redis-cli memory usage big:key

# 查看删除策略
redis-cli config get maxmemory-policy

恢复流程示例

# 1) 异步删除大Key(UNLINK优先)
redis-cli unlink big:key

# 2) 调整内存与策略(临时修改)
redis-cli config set maxmemory 4gb
redis-cli config set maxmemory-policy allkeys-lru

# 3) 持久化保存配置(根据发行版路径)
sudo sed -i 's/^maxmemory .*/maxmemory 4gb/' /etc/redis/redis.conf
sudo sed -i 's/^maxmemory-policy .*/maxmemory-policy allkeys-lru/' /etc/redis/redis.conf
sudo systemctl restart redis

练习
- 创建一个大Key(如SET大JSON),用MEMORY USAGE观测变化,再用UNLINK删除。


3. 持久化失败/RDB或AOF损坏#

症状:启动报错、AOF重写失败、RDB加载失败。
止损:切换到从库或集群其他分片,避免继续写入损坏数据。

安装/工具说明
- redis-check-rdbredis-check-aof 通常随 redis-server 安装包提供。
- 若缺失,需安装对应Redis版本工具包。

定位命令

# 检查磁盘空间与权限
df -h /var/lib/redis
ls -l /var/lib/redis

# 查看持久化配置
redis-cli config get save
redis-cli config get appendonly

恢复流程示例

# RDB修复
redis-check-rdb /var/lib/redis/dump.rdb

# AOF修复
redis-check-aof --fix /var/lib/redis/appendonly.aof

# 若AOF严重损坏:临时禁用并启动
sudo sed -i 's/^appendonly yes/appendonly no/' /etc/redis/redis.conf
sudo systemctl restart redis

# 启动后重建AOF(再开启)
redis-cli config set appendonly yes
redis-cli bgrewriteaof

练习
- 人为截断AOF文件(备份后)并用redis-check-aof --fix修复。


4. 主从复制中断/延迟过大#

症状master_link_status:down、延迟秒级飙升。
止损:限制写入速率、避免大Key/批量写。

定位命令

# 主库
redis-cli info replication

# 从库
redis-cli -h SLAVE_IP info replication

# 网络与带宽
ping -c 5 MASTER_IP
iperf3 -c MASTER_IP -p 5201

恢复流程示例

# 从库重新同步(谨慎操作,会触发全量同步)
redis-cli -h SLAVE_IP replicaof MASTER_IP 6379

# 调整复制缓冲区(临时)
redis-cli config set repl-backlog-size 512mb

练习
- 在高写入场景下观察master_repl_offsetslave_repl_offset差异。


5. 哨兵误判/频繁主从切换#

症状:无明显故障但多次故障转移。
止损:临时提高quorum或关闭自动故障转移。

哨兵配置示例(/etc/redis/sentinel.conf)

sentinel monitor mymaster 10.0.0.10 6379 2
sentinel down-after-milliseconds mymaster 8000
sentinel failover-timeout mymaster 60000

定位命令

redis-cli -p 26379 sentinel masters
redis-cli -p 26379 sentinel slaves mymaster

恢复流程示例

# 临时提高quorum(降低误判)
redis-cli -p 26379 sentinel set mymaster quorum 3

# 统一时钟
timedatectl status
sudo systemctl restart chronyd

练习
- 人为制造网络抖动(限速/丢包)观察哨兵状态变化。


6. Cluster 槽位异常/脑裂#

症状CLUSTERDOWN、槽位缺失、MOVED/ASK频繁。
止损:切换读写到健康分片或降级缓存。

原理草图:Cluster槽位与节点

文章图片

定位命令

redis-cli -c -h NODE_IP cluster info
redis-cli -c -h NODE_IP cluster nodes

恢复流程示例

# 自动修复槽位
redis-cli --cluster fix 10.0.0.11:6379

# 重新分片(示例)
redis-cli --cluster reshard 10.0.0.11:6379
# 按提示输入slot数量、源节点、目标节点

练习
- 删除一个节点的槽位映射(测试环境),用--cluster fix恢复。


7. 热Key/慢查询导致延迟飙升#

症状:CPU高、延迟上升、slowlog增长。
止损:热点降级、限流或读写分离。

定位命令

redis-cli slowlog get 10
redis-cli slowlog len
# 注意: MONITOR仅短时使用,可能影响性能
redis-cli monitor

恢复流程示例

# 设置慢查询阈值(微秒)
redis-cli config set slowlog-log-slower-than 10000
redis-cli config set slowlog-max-len 128

练习
- 构造KEYS *操作,观察slowlog记录与延迟变化。


8. 连接数耗尽/连接风暴#

症状max number of clients reached
止损:限制新连接、快速恢复连接池。

定位命令

redis-cli info clients | egrep "connected_clients|blocked_clients"
redis-cli client list | head -n 5

恢复流程示例

# 扩大Redis连接上限
redis-cli config set maxclients 20000

# 提升系统句柄
sudo sed -i 's/^#\?DefaultLimitNOFILE.*/DefaultLimitNOFILE=65535/' /etc/systemd/system.conf
sudo systemctl daemon-reload
sudo systemctl restart redis

练习
- 使用redis-benchmark -c 20000 -n 100000模拟连接压力(测试环境)。


统一恢复与验证清单#

验证命令(示例)

redis-cli ping                 # 预期: PONG
redis-cli info replication     # 预期: master_link_status:up
redis-cli info stats | egrep "instantaneous_ops_per_sec|total_connections_received"

回滚策略
- 备份优先级:最近备份RDB/AOF > 从库 > 集群副本。
- 恢复后进行业务一致性校验(关键Key抽样比对)。

复盘输出模板
- 故障根因:
- 影响范围与时长:
- 临时措施与永久措施:
- 告警阈值调整:
- 自动化改进:

综合练习
1) 模拟AOF损坏并修复。
2) 设置maxmemorymaxmemory-policy,观察淘汰行为。
3) 在哨兵环境触发一次故障转移,验证业务切换。