*Redis 常见问题排查

*概述

本文档总结 Redis 使用过程中常见的问题及其排查方法,帮助开发者快速定位和解决问题。

*连接问题

*1. 无法连接 Redis

现象Could not connect to Redis at 127.0.0.1:6379: Connection refused

排查步骤

  1. 检查 Redis 服务是否启动: bash ps aux | grep redis systemctl status redis

  2. 检查端口是否监听: bash netstat -tlnp | grep 6379 ss -tlnp | grep 6379

  3. 检查防火墙设置: bash iptables -L | grep 6379 firewall-cmd --list-ports

  4. 检查配置文件绑定地址: bind 127.0.0.1 # 只允许本地连接 bind 0.0.0.0 # 允许所有连接

*2. 连接数过多

现象ERR max number of clients reached

解决方案

  1. 增加最大连接数: maxclients 20000

  2. 使用连接池管理连接

  3. 检查是否有连接泄漏

  4. 设置合理的超时时间: timeout 300 tcp-keepalive 60

*内存问题

*1. 内存不足

现象OOM command not allowed when used memory > 'maxmemory'

排查步骤

  1. 查看内存使用情况: INFO memory

  2. 查找大键: bash redis-cli --bigkeys

  3. 分析内存碎片: ``` INFO memory

    *查看 memfragmentationratio

解决方案

  1. 增加 maxmemory: maxmemory 8gb

  2. 设置淘汰策略: maxmemory-policy allkeys-lru

  3. 启用内存碎片整理(Redis 4.0+): activedefrag yes

  4. 优化数据结构,删除不必要的数据

*2. 内存碎片率高

现象mem_fragmentation_ratio 远大于 1

解决方案

  1. 重启 Redis 服务
  2. 启用主动碎片整理: activedefrag yes active-defrag-ignore-bytes 100mb active-defrag-threshold-lower 10

*性能问题

*1. 响应延迟高

排查步骤

  1. 检查慢查询日志: SLOWLOG GET 10

  2. 监控命令执行时间: redis-cli --latency

  3. 检查是否有阻塞命令:

  • KEYS *
  • FLUSHALL
  • FLUSHDB
  • DEBUG SEGFAULT

解决方案

  1. 使用 SCAN 替代 KEYS
  2. 避免在高峰期执行大操作
  3. 使用 Pipeline 减少网络往返
  4. 优化查询逻辑

*2. CPU 使用率高

排查步骤

  1. 检查是否有大量计算密集型操作
  2. 分析命令使用模式: INFO commandstats

解决方案

  1. 减少复杂计算
  2. 使用 Lua 脚本合并操作
  3. 考虑使用集群分散负载

*持久化问题

*1. RDB 保存失败

现象Background saving error

排查步骤

  1. 检查磁盘空间: bash df -h

  2. 检查目录权限: bash ls -ld /var/lib/redis

  3. 检查系统内存(fork 需要双倍内存): bash free -h cat /proc/sys/vm/overcommit_memory

解决方案

  1. 清理磁盘空间
  2. 修改目录权限: bash chown redis:redis /var/lib/redis

  3. 设置 overcommitmemory: ```bash echo 1 > /proc/sys/vm/overcommitmemory ```

*2. AOF 重写失败

现象Background AOF rewrite failed

排查步骤

  1. 检查磁盘空间
  2. 检查 AOF 文件大小: bash ls -lh /var/lib/redis/appendonly.aof

  3. 检查是否有大量写入

解决方案

  1. 增加磁盘空间
  2. 调整自动重写条件: auto-aof-rewrite-percentage 50 auto-aof-rewrite-min-size 64mb

  3. 手动触发重写: BGREWRITEAOF

*主从复制问题

*1. 复制中断

现象:从节点无法同步数据

排查步骤

  1. 检查主从连接: INFO replication

  2. 检查网络状况: bash ping 主节点IP

  3. 检查主节点日志

解决方案

  1. 检查网络配置
  2. 设置正确的 masterauth
  3. 重新配置复制: REPLICAOF 主节点IP 端口

*2. 复制延迟

现象:从节点数据明显落后于主节点

排查步骤

  1. 检查复制延迟: ``` INFO replication

    *查看 masterlastiosecondsago

  2. 检查网络带宽

  3. 检查主节点负载

解决方案

  1. 优化网络连接
  2. 减少主节点写入压力
  3. 考虑使用多个从节点分担读压力

*集群问题

*1. 集群节点故障

现象CLUSTERDOWN The cluster is down

排查步骤

  1. 检查节点状态: CLUSTER NODES

  2. 检查节点间连接

  3. 检查配置文件

解决方案

  1. 重启故障节点
  2. 重新加入集群: CLUSTER MEET 节点IP 端口

  3. 重新分配槽位: CLUSTER ADDSLOTS 槽位范围

*2. 数据迁移失败

现象MIGRATE 命令失败

排查步骤

  1. 检查目标节点状态
  2. 检查网络连接
  3. 检查键是否存在

解决方案

  1. 确保目标节点正常运行
  2. 使用 COPY 选项保留原键
  3. 分批迁移大数据量

*安全问题

*1. 未授权访问

现象NOAUTH Authentication required

解决方案

  1. 设置密码: requirepass your_password

  2. 使用 ACL(Redis 6.0+): ACL SETUSER username on >password ~* +@all

  3. 绑定指定 IP: bind 127.0.0.1 192.168.1.100

*2. 数据泄露

排查步骤

  1. 检查访问日志
  2. 检查网络配置
  3. 检查客户端权限

解决方案

  1. 启用 SSL/TLS
  2. 使用 VPN 或私有网络
  3. 定期审计访问权限

*总结

遇到问题时应遵循以下排查流程:

  1. 收集错误信息和日志
  2. 检查基本配置和连接
  3. 分析资源使用情况
  4. 逐步缩小问题范围
  5. 应用解决方案并验证

建议定期备份数据,保持配置文档更新,以便快速恢复和排查问题。