外观
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 persistence2. MONITOR 命令
MONITOR 命令用于实时监控 Redis 命令执行,它会打印出所有发送到 Redis 服务器的命令。
bash
# 启动监控
redis-cli MONITOR
# 监控并将输出保存到文件
redis-cli MONITOR > redis-monitor.log
# 监控指定时间(如 10 秒)
timeout 10 redis-cli MONITOR3. SLOWLOG 命令
SLOWLOG 命令用于查看慢查询日志,记录执行时间超过指定阈值的命令。
bash
# 获取慢查询日志
redis-cli SLOWLOG GET
# 获取指定数量的慢查询日志
redis-cli SLOWLOG GET 100
# 获取慢查询日志的长度
redis-cli SLOWLOG LEN
# 重置慢查询日志
redis-cli SLOWLOG RESET4. MEMORY 命令
MEMORY 命令用于查看和管理 Redis 内存使用。
bash
# 获取内存使用详情
redis-cli MEMORY STATS
# 获取特定键的内存使用
redis-cli MEMORY USAGE key
# 尝试释放内存碎片
redis-cli MEMORY PURGE
# 获取内存分配信息
redis-cli MEMORY MALLOC-STATS5. 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 GETNAME6. DEBUG 命令
DEBUG 命令用于调试 Redis 实例。
bash
# 查看键的调试信息
redis-cli DEBUG OBJECT key
# 查看内存分配信息
redis-cli DEBUG MALLOC-STATS
# 重启 Redis 实例
redis-cli DEBUG RELOAD
# 模拟崩溃
redis-cli DEBUG SEGFAULT7. 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 REWRITE8. 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 FAILOVER9. REPLICAOF 命令
REPLICAOF 命令用于配置 Redis 实例作为其他实例的从节点,或停止复制。
bash
# 配置为从节点
redis-cli REPLICAOF <masterip> <masterport>
# 停止复制,成为主节点
redis-cli REPLICAOF NO ONE10. 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-history2. 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 1000003. 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.aof4. 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 637907. 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.log8. 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
- 登录 Grafana 控制台
- 添加 Prometheus 数据源
- 导入 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
./redisinsight3. 第三方监控服务
3.1 Datadog
Datadog 是一个云端监控平台,支持 Redis 监控。
- 安装 Datadog Agent
- 配置 Redis 集成
- 查看 Redis 监控面板
3.2 New Relic
New Relic 是一个应用性能监控平台,支持 Redis 监控。
- 安装 New Relic Agent
- 配置 Redis 集成
- 查看 Redis 监控面板
3.3 Zabbix
Zabbix 是一个开源的监控系统,支持 Redis 监控。
- 安装 Zabbix Server 和 Agent
- 导入 Redis 监控模板
- 配置 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.log2. 系统日志
系统日志包含了 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 时出现超时错误。
排查方法:
检查 Redis 进程是否运行:
bashps -ef | grep redis-server检查 Redis 端口是否开放:
bashnetstat -tlnp | grep 6379 ss -tlnp | grep 6379检查防火墙设置:
bash# CentOS 7 firewall-cmd --list-ports # Ubuntu iptables -L -n检查网络连通性:
bashping <redis-host> telnet <redis-host> 6379 nc -zv <redis-host> 6379检查 Redis 配置:
bashredis-cli CONFIG GET bind redis-cli CONFIG GET protected-mode
2. 内存不足
症状:Redis 日志中出现 "OOM command not allowed when used memory > 'maxmemory'" 错误,写入命令执行失败。
排查方法:
检查内存使用情况:
bashredis-cli INFO memory查看内存碎片情况:
bashredis-cli MEMORY STATS查找大键:
bashredis-cli --bigkeys查看淘汰策略:
bashredis-cli CONFIG GET maxmemory-policy检查过期键数量:
bashredis-cli INFO stats | grep expired_keys
3. 复制故障
症状:主从复制中断,从节点无法同步主节点数据。
排查方法:
检查复制状态:
bashredis-cli INFO replication查看从节点日志:
bashtail -f /var/log/redis/redis-slave.log检查主节点和从节点的网络连通性:
bashping <master-host> telnet <master-host> 6379检查主节点的复制配置:
bashredis-cli CONFIG GET requirepass redis-cli CONFIG GET masterauth检查从节点的复制配置:
bashredis-cli CONFIG GET replicaof redis-cli CONFIG GET masterauth
4. 持久化故障
症状:RDB 或 AOF 持久化失败,数据丢失风险增加。
排查方法:
检查持久化状态:
bashredis-cli INFO persistence查看持久化日志:
bashtail -f /var/log/redis/redis.log | grep -i persistence检查 RDB 文件:
bashredis-check-rdb /path/to/dump.rdb检查 AOF 文件:
bashredis-check-aof /path/to/appendonly.aof检查磁盘空间:
bashdf -h
5. 集群故障
症状:Redis Cluster 状态异常,部分槽不可用,客户端无法访问数据。
排查方法:
检查集群状态:
bashredis-cli CLUSTER INFO查看集群节点:
bashredis-cli CLUSTER NODES检查槽分配情况:
bashredis-cli CLUSTER SLOTS检查节点日志:
bashtail -f /var/log/redis/redis-cluster.log使用 redis-cli --cluster 检查集群:
bashredis-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 性能问题:
检查慢查询日志:
bashredis-cli SLOWLOG GET 100监控命令执行情况:
bashredis-cli MONITOR | head -n 100查看命令统计:
bashredis-cli INFO commandstats检查内存使用情况:
bashredis-cli INFO memory检查客户端连接:
bashredis-cli CLIENT LIST | wc -l
Q2: 如何处理 Redis 大键?
A2: 可以通过以下方式处理 Redis 大键:
识别大键:
bashredis-cli --bigkeys删除大键:
bash# 使用 UNLINK 命令异步删除大键 redis-cli UNLINK large_key拆分大键:将大键拆分为多个小键
优化大键数据结构:根据业务需求选择更适合的数据结构
Q3: 如何处理 Redis 内存碎片?
A3: 可以通过以下方式处理 Redis 内存碎片:
启用内存碎片整理:
bashredis-cli CONFIG SET activedefrag yes手动内存碎片整理:
bashredis-cli MEMORY PURGE重启 Redis 实例:对于严重的内存碎片问题,重启 Redis 实例是最有效的解决方法
Q4: 如何处理 Redis 连接数过多的问题?
A4: 可以通过以下方式处理 Redis 连接数过多的问题:
检查连接数:
bashredis-cli INFO clients | grep connected_clients检查连接来源:
bashredis-cli CLIENT LIST | awk -F' ' '{print $2}' | sort | uniq -c优化客户端连接池:调整客户端连接池参数,减少连接数
限制连接数:
bashredis-cli CONFIG SET maxclients 10000关闭空闲连接:
bashredis-cli CLIENT KILL IDLE 3600
Q5: 如何处理 Redis 持久化失败的问题?
A5: 可以通过以下方式处理 Redis 持久化失败的问题:
检查持久化状态:
bashredis-cli INFO persistence查看日志:
bashtail -f /var/log/redis/redis.log | grep -i error检查磁盘空间:
bashdf -h检查文件权限:
bashls -l /path/to/redis/data/修复 AOF 文件:
bashredis-check-aof --fix /path/to/appendonly.aof
Q6: 如何处理 Redis 集群故障?
A6: 可以通过以下方式处理 Redis 集群故障:
检查集群状态:
bashredis-cli --cluster check <ip>:<port>查看集群节点:
bashredis-cli CLUSTER NODES修复槽分配:
bashredis-cli --cluster fix <ip>:<port>手动故障转移:
bashredis-cli CLUSTER FAILOVER添加或移除节点:
bashredis-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>
