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-rdbredis-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>