Skip to content

Redis 故障排查工具 ​

Redis 故障排查是运维工作中的重要环节,掌握各种故障排查工具和方法可以快速定位和解决问题,减少服务不可用时间。本文档将详细介绍 Redis 故障排查的各种工具和方法。

内置命令 ​

1. INFO 命令 ​

INFO 命令用于获取 Redis 实例的详细信息,包括服务器状态、内存使用、客户端连接、复制状态、持久化状态等。

bash
# 获取所有信息
redis-cli INFO

# 获取特定部分的信息
redis-cli INFO memory
redis-cli INFO clients
redis-cli INFO replication
redis-cli INFO stats
redis-cli INFO persistence

2. MONITOR 命令 ​

MONITOR 命令用于实时监控 Redis 命令执行,它会打印出所有发送到 Redis 服务器的命令。

bash
# 启动监控
redis-cli MONITOR

# 监控并将输出保存到文件
redis-cli MONITOR > redis-monitor.log

# 监控指定时间(如 10 秒)
timeout 10 redis-cli MONITOR

3. SLOWLOG 命令 ​

SLOWLOG 命令用于查看慢查询日志,记录执行时间超过指定阈值的命令。

bash
# 获取慢查询日志
redis-cli SLOWLOG GET

# 获取指定数量的慢查询日志
redis-cli SLOWLOG GET 100

# 获取慢查询日志的长度
redis-cli SLOWLOG LEN

# 重置慢查询日志
redis-cli SLOWLOG RESET

4. MEMORY 命令 ​

MEMORY 命令用于查看和管理 Redis 内存使用。

bash
# 获取内存使用详情
redis-cli MEMORY STATS

# 获取特定键的内存使用
redis-cli MEMORY USAGE key

# 尝试释放内存碎片
redis-cli MEMORY PURGE

# 获取内存分配信息
redis-cli MEMORY MALLOC-STATS

5. CLIENT 命令 ​

CLIENT 命令用于管理客户端连接。

bash
# 查看客户端连接列表
redis-cli CLIENT LIST

# 查看当前客户端信息
redis-cli CLIENT INFO

# 关闭指定客户端连接
redis-cli CLIENT KILL <ip>:<port>
redis-cli CLIENT KILL ID <client-id>

# 设置客户端名称
redis-cli CLIENT SETNAME <name>

# 获取客户端名称
redis-cli CLIENT GETNAME

6. DEBUG 命令 ​

DEBUG 命令用于调试 Redis 实例。

bash
# 查看键的调试信息
redis-cli DEBUG OBJECT key

# 查看内存分配信息
redis-cli DEBUG MALLOC-STATS

# 重启 Redis 实例
redis-cli DEBUG RELOAD

# 模拟崩溃
redis-cli DEBUG SEGFAULT

7. CONFIG 命令 ​

CONFIG 命令用于查看和修改 Redis 配置。

bash
# 获取所有配置
redis-cli CONFIG GET *

# 获取特定配置
redis-cli CONFIG GET maxmemory
redis-cli CONFIG GET appendonly

# 修改配置
redis-cli CONFIG SET maxmemory 4gb
redis-cli CONFIG SET appendonly yes

# 保存配置到文件
redis-cli CONFIG REWRITE

8. CLUSTER 命令 ​

CLUSTER 命令用于管理 Redis Cluster。

bash
# 查看集群信息
redis-cli CLUSTER INFO

# 查看集群节点
redis-cli CLUSTER NODES

# 查看键所在的槽
redis-cli CLUSTER KEYSLOT key

# 查看槽对应的节点
redis-cli CLUSTER GETKEYSINSLOT <slot> <count>

# 手动故障转移
redis-cli CLUSTER FAILOVER

9. REPLICAOF 命令 ​

REPLICAOF 命令用于配置 Redis 实例作为其他实例的从节点,或停止复制。

bash
# 配置为从节点
redis-cli REPLICAOF <masterip> <masterport>

# 停止复制,成为主节点
redis-cli REPLICAOF NO ONE

10. BGSAVE 和 BGREWRITEAOF 命令 ​

BGSAVE 命令用于异步执行 RDB 持久化,BGREWRITEAOF 命令用于异步执行 AOF 重写。

bash
# 异步执行 RDB 持久化
redis-cli BGSAVE

# 异步执行 AOF 重写
redis-cli BGREWRITEAOF

# 查看持久化状态
redis-cli INFO persistence

第三方工具 ​

1. redis-cli ​

redis-cli 是 Redis 自带的命令行工具,用于与 Redis 实例进行交互。

bash
# 连接 Redis 实例
redis-cli -h <host> -p <port> -a <password>

# 执行命令
redis-cli -h <host> -p <port> SET key value
redis-cli -h <host> -p <port> GET key

# 批量执行命令
redis-cli -h <host> -p <port> < commands.txt

# 统计命令执行时间
redis-cli -h <host> -p <port> --latency
redis-cli -h <host> -p <port> --latency-history

2. redis-benchmark ​

redis-benchmark 是 Redis 自带的基准测试工具,用于测试 Redis 实例的性能。

bash
# 基本性能测试
redis-benchmark -h <host> -p <port> -a <password>

# 测试特定命令
redis-benchmark -h <host> -p <port> -a <password> -t set,get,incr -n 100000 -q

# 测试不同并发数
redis-benchmark -h <host> -p <port> -a <password> -c 100 -n 100000

3. redis-check-rdb 和 redis-check-aof ​

redis-check-rdb 和 redis-check-aof 命令用于检查和修复 RDB 和 AOF 文件。

bash
# 检查 RDB 文件
redis-check-rdb /path/to/dump.rdb

# 修复 RDB 文件
redis-check-rdb --fix /path/to/dump.rdb

# 检查 AOF 文件
redis-check-aof /path/to/appendonly.aof

# 修复 AOF 文件
redis-check-aof --fix /path/to/appendonly.aof

4. redis-sentinel ​

redis-sentinel 是 Redis Sentinel 模式的管理工具,用于监控和管理 Redis 主从复制。

bash
# 启动 Sentinel
redis-sentinel /path/to/sentinel.conf

# 连接 Sentinel
redis-cli -h <host> -p <port> INFO sentinel

# 查看 Sentinel 监控的主节点
redis-cli -h <host> -p <port> SENTINEL masters

# 查看主节点的从节点
redis-cli -h <host> -p <port> SENTINEL replicas <master-name>

5. redis-trib.rb ​

redis-trib.rb 是 Redis Cluster 模式的管理工具,用于创建和管理 Redis Cluster。

bash
# 创建集群
redis-trib.rb create --replicas 1 <ip1>:<port1> <ip2>:<port2> <ip3>:<port3> <ip4>:<port4> <ip5>:<port5> <ip6>:<port6>

# 检查集群
redis-trib.rb check <ip>:<port>

# 增加节点
redis-trib.rb add-node <new-node-ip>:<new-node-port> <existing-node-ip>:<existing-node-port>

# 移除节点
redis-trib.rb del-node <ip>:<port> <node-id>

# 重新分配槽
redis-trib.rb reshard <ip>:<port>

6. redis-stat ​

redis-stat 是一个 Redis 监控工具,用于实时监控 Redis 实例的性能指标。

bash
# 安装 redis-stat
gem install redis-stat

# 监控 Redis 实例
redis-stat -h <host> -p <port> -a <password> 1 10

# 以 Web 方式监控
redis-stat -h <host> -p <port> -a <password> --server 63790

7. redis-faina ​

redis-faina 是 Facebook 开源的 Redis 分析工具,用于分析 Redis 命令执行情况。

bash
# 安装 redis-faina
git clone https://github.com/facebookarchive/redis-faina.git
cd redis-faina

# 分析 Redis 命令
redis-cli MONITOR | python redis-faina.py

# 分析历史日志
python redis-faina.py < redis-monitor.log

8. redis-cli --bigkeys ​

redis-cli --bigkeys 命令用于查找 Redis 中的大键。

bash
# 查找大键
redis-cli --bigkeys

# 查找大键并显示详细信息
redis-cli --bigkeys -i 0.1

监控和告警工具 ​

1. Prometheus + Grafana ​

Prometheus 是一个开源的监控系统,Grafana 是一个开源的数据可视化工具,两者结合可以实现 Redis 的全方位监控。

安装 Redis Exporter ​

Redis Exporter 用于将 Redis 指标导出为 Prometheus 格式。

bash
# 下载 Redis Exporter
wget https://github.com/oliver006/redis_exporter/releases/download/v1.45.0/redis_exporter-v1.45.0.linux-amd64.tar.gz

tar xzf redis_exporter-v1.45.0.linux-amd64.tar.gz
cd redis_exporter-v1.45.0.linux-amd64

# 启动 Redis Exporter
./redis_exporter --redis.addr redis://<host>:<port> --redis.password <password>

配置 Prometheus ​

在 Prometheus 配置文件中添加 Redis 目标:

yaml
scrape_configs:
  - job_name: 'redis'
    static_configs:
      - targets: ['<redis-exporter-host>:9121']

配置 Grafana ​

  1. 登录 Grafana 控制台
  2. 添加 Prometheus 数据源
  3. 导入 Redis 监控面板(如 ID 763 的 Redis Dashboard)

2. RedisInsight ​

RedisInsight 是 Redis 官方提供的可视化管理工具,支持 Redis 单机、主从、Sentinel 和 Cluster 模式。

bash
# 下载 RedisInsight
wget https://download.redis.io/redisinsight/redisinsight-linux64-latest.tar.gz

tar xzf redisinsight-linux64-latest.tar.gz
cd redisinsight-linux64-

# 启动 RedisInsight
./redisinsight

3. 第三方监控服务 ​

3.1 Datadog ​

Datadog 是一个云端监控平台,支持 Redis 监控。

  1. 安装 Datadog Agent
  2. 配置 Redis 集成
  3. 查看 Redis 监控面板

3.2 New Relic ​

New Relic 是一个应用性能监控平台,支持 Redis 监控。

  1. 安装 New Relic Agent
  2. 配置 Redis 集成
  3. 查看 Redis 监控面板

3.3 Zabbix ​

Zabbix 是一个开源的监控系统,支持 Redis 监控。

  1. 安装 Zabbix Server 和 Agent
  2. 导入 Redis 监控模板
  3. 配置 Redis 监控项

日志分析工具 ​

1. Redis 日志 ​

Redis 日志包含了服务器启动、命令执行、错误信息等重要信息,分析日志可以帮助定位问题。

bash
# 查看 Redis 日志
cat /var/log/redis/redis.log

# 实时查看 Redis 日志
tail -f /var/log/redis/redis.log

# 查看错误信息
grep -i error /var/log/redis/redis.log

# 查看警告信息
grep -i warning /var/log/redis/redis.log

2. 系统日志 ​

系统日志包含了 Redis 进程的启动、停止、OOM 等信息。

bash
# 查看系统日志
cat /var/log/syslog
cat /var/log/messages

# 查看 Redis 进程相关日志
grep -i redis /var/log/syslog

# 查看 OOM 相关日志
grep -i oom /var/log/syslog

常见故障场景及排查方法 ​

1. 连接超时 ​

症状:客户端连接 Redis 时出现超时错误。

排查方法:

  1. 检查 Redis 进程是否运行:

    bash
    ps -ef | grep redis-server
  2. 检查 Redis 端口是否开放:

    bash
    netstat -tlnp | grep 6379
    ss -tlnp | grep 6379
  3. 检查防火墙设置:

    bash
    # CentOS 7
    firewall-cmd --list-ports
    
    # Ubuntu
    iptables -L -n
  4. 检查网络连通性:

    bash
    ping <redis-host>
    telnet <redis-host> 6379
    nc -zv <redis-host> 6379
  5. 检查 Redis 配置:

    bash
    redis-cli CONFIG GET bind
    redis-cli CONFIG GET protected-mode

2. 内存不足 ​

症状:Redis 日志中出现 "OOM command not allowed when used memory > 'maxmemory'" 错误,写入命令执行失败。

排查方法:

  1. 检查内存使用情况:

    bash
    redis-cli INFO memory
  2. 查看内存碎片情况:

    bash
    redis-cli MEMORY STATS
  3. 查找大键:

    bash
    redis-cli --bigkeys
  4. 查看淘汰策略:

    bash
    redis-cli CONFIG GET maxmemory-policy
  5. 检查过期键数量:

    bash
    redis-cli INFO stats | grep expired_keys

3. 复制故障 ​

症状:主从复制中断,从节点无法同步主节点数据。

排查方法:

  1. 检查复制状态:

    bash
    redis-cli INFO replication
  2. 查看从节点日志:

    bash
    tail -f /var/log/redis/redis-slave.log
  3. 检查主节点和从节点的网络连通性:

    bash
    ping <master-host>
    telnet <master-host> 6379
  4. 检查主节点的复制配置:

    bash
    redis-cli CONFIG GET requirepass
    redis-cli CONFIG GET masterauth
  5. 检查从节点的复制配置:

    bash
    redis-cli CONFIG GET replicaof
    redis-cli CONFIG GET masterauth

4. 持久化故障 ​

症状:RDB 或 AOF 持久化失败,数据丢失风险增加。

排查方法:

  1. 检查持久化状态:

    bash
    redis-cli INFO persistence
  2. 查看持久化日志:

    bash
    tail -f /var/log/redis/redis.log | grep -i persistence
  3. 检查 RDB 文件:

    bash
    redis-check-rdb /path/to/dump.rdb
  4. 检查 AOF 文件:

    bash
    redis-check-aof /path/to/appendonly.aof
  5. 检查磁盘空间:

    bash
    df -h

5. 集群故障 ​

症状:Redis Cluster 状态异常,部分槽不可用,客户端无法访问数据。

排查方法:

  1. 检查集群状态:

    bash
    redis-cli CLUSTER INFO
  2. 查看集群节点:

    bash
    redis-cli CLUSTER NODES
  3. 检查槽分配情况:

    bash
    redis-cli CLUSTER SLOTS
  4. 检查节点日志:

    bash
    tail -f /var/log/redis/redis-cluster.log
  5. 使用 redis-cli --cluster 检查集群:

    bash
    redis-cli --cluster check <ip>:<port>

最佳实践 ​

1. 建立完善的监控和告警机制 ​

  • 监控 Redis 关键指标:内存使用率、CPU 使用率、连接数、命中率、慢查询等
  • 设置合理的告警阈值:内存使用率 > 80%、连接数 > 8000、慢查询数量突增等
  • 确保告警能够及时通知到相关人员

2. 定期备份数据 ​

  • 配置合理的持久化策略
  • 定期备份 RDB 和 AOF 文件
  • 测试备份的恢复流程

3. 定期进行故障演练 ​

  • 模拟各种故障场景:主节点故障、从节点故障、网络分区等
  • 测试故障转移和恢复流程
  • 记录演练过程和结果,持续优化

4. 合理配置 Redis ​

  • 根据业务需求配置内存、持久化、复制等参数
  • 启用必要的安全措施:密码认证、SSL/TLS 等
  • 优化 Redis 配置,提高性能和稳定性

5. 建立完善的故障排查流程 ​

  • 制定详细的故障排查步骤
  • 记录故障排查过程和结果
  • 定期总结故障案例,分享经验

常见问题(FAQ) ​

Q1: 如何快速定位 Redis 性能问题? ​

A1: 可以通过以下步骤快速定位 Redis 性能问题:

  1. 检查慢查询日志:

    bash
    redis-cli SLOWLOG GET 100
  2. 监控命令执行情况:

    bash
    redis-cli MONITOR | head -n 100
  3. 查看命令统计:

    bash
    redis-cli INFO commandstats
  4. 检查内存使用情况:

    bash
    redis-cli INFO memory
  5. 检查客户端连接:

    bash
    redis-cli CLIENT LIST | wc -l

Q2: 如何处理 Redis 大键? ​

A2: 可以通过以下方式处理 Redis 大键:

  1. 识别大键:

    bash
    redis-cli --bigkeys
  2. 删除大键:

    bash
    # 使用 UNLINK 命令异步删除大键
    redis-cli UNLINK large_key
  3. 拆分大键:将大键拆分为多个小键

  4. 优化大键数据结构:根据业务需求选择更适合的数据结构

Q3: 如何处理 Redis 内存碎片? ​

A3: 可以通过以下方式处理 Redis 内存碎片:

  1. 启用内存碎片整理:

    bash
    redis-cli CONFIG SET activedefrag yes
  2. 手动内存碎片整理:

    bash
    redis-cli MEMORY PURGE
  3. 重启 Redis 实例:对于严重的内存碎片问题,重启 Redis 实例是最有效的解决方法

Q4: 如何处理 Redis 连接数过多的问题? ​

A4: 可以通过以下方式处理 Redis 连接数过多的问题:

  1. 检查连接数:

    bash
    redis-cli INFO clients | grep connected_clients
  2. 检查连接来源:

    bash
    redis-cli CLIENT LIST | awk -F' ' '{print $2}' | sort | uniq -c
  3. 优化客户端连接池:调整客户端连接池参数,减少连接数

  4. 限制连接数:

    bash
    redis-cli CONFIG SET maxclients 10000
  5. 关闭空闲连接:

    bash
    redis-cli CLIENT KILL IDLE 3600

Q5: 如何处理 Redis 持久化失败的问题? ​

A5: 可以通过以下方式处理 Redis 持久化失败的问题:

  1. 检查持久化状态:

    bash
    redis-cli INFO persistence
  2. 查看日志:

    bash
    tail -f /var/log/redis/redis.log | grep -i error
  3. 检查磁盘空间:

    bash
    df -h
  4. 检查文件权限:

    bash
    ls -l /path/to/redis/data/
  5. 修复 AOF 文件:

    bash
    redis-check-aof --fix /path/to/appendonly.aof

Q6: 如何处理 Redis 集群故障? ​

A6: 可以通过以下方式处理 Redis 集群故障:

  1. 检查集群状态:

    bash
    redis-cli --cluster check <ip>:<port>
  2. 查看集群节点:

    bash
    redis-cli CLUSTER NODES
  3. 修复槽分配:

    bash
    redis-cli --cluster fix <ip>:<port>
  4. 手动故障转移:

    bash
    redis-cli CLUSTER FAILOVER
  5. 添加或移除节点:

    bash
    redis-cli --cluster add-node <new-node-ip>:<new-node-port> <existing-node-ip>:<existing-node-port>
    redis-cli --cluster del-node <ip>:<port> <node-id>