8.6.2 日志与慢查询分析

日志与慢查询分析#

Redis 日志与慢查询是定位性能瓶颈、异常抖动与热点问题的核心手段。本节给出日志与慢查询的原理草图、配置与采集示例、排错流程与练习,确保可直接落地。

原理草图:日志与慢查询流转#

文章图片

1. 日志类型与配置要点(含安装与配置示例)#

  • 运行日志(logfile):记录启动、故障、持久化、复制、集群状态变更等事件。
  • 慢查询日志(slowlog):记录执行耗时超过阈值的命令。
  • AOF/RDB 日志:AOF 重写、RDB 保存失败或延迟提示。
  • 客户端异常maxclientsOOMMISCONF 等告警信息。

安装 Redis(以 Debian/Ubuntu 为例)

sudo apt update
sudo apt install -y redis-server
redis-server -v

Redis 配置示例(/etc/redis/redis.conf)

# 运行日志
logfile /var/log/redis/redis-server.log
loglevel notice
syslog-enabled no

# 慢查询
slowlog-log-slower-than 5000      # 5ms 以上记录
slowlog-max-len 1024

# 额外:AOF 与 RDB 关键信息
appendonly yes
save 900 1
save 300 10

重启并验证

sudo systemctl restart redis-server
sudo systemctl status redis-server --no-pager
tail -n 5 /var/log/redis/redis-server.log

2. 日志采集与落盘规范(含 logrotate 示例)#

  • 集中化采集:推荐 Filebeat/Fluentd 输出到 ELK/ClickHouse。
  • 时间与时区一致:确保 NTP 同步,日志格式统一。
  • 日志切割:避免磁盘占满,优先 logrotate。

logrotate 配置示例(/etc/logrotate.d/redis)

/var/log/redis/redis-server.log {
  daily
  rotate 14
  size 100M
  compress
  missingok
  notifempty
  create 0640 redis redis
  postrotate
    systemctl kill -s USR1 redis-server >/dev/null 2>&1 || true
  endscript
}

命令解释
- rotate 14:保留 14 个轮转文件
- postrotate:发送 USR1 促使 Redis 重新打开日志文件

3. 慢查询机制与分析流程(含命令)#

采集流程
1) 设置阈值与队列长度
2) 定时拉取 SLOWLOG GET
3) 解析命令、耗时、发生时间
4) 关联业务请求与热点 key

常用命令

# 查看慢查询
redis-cli SLOWLOG GET 10

# 查看慢查询长度
redis-cli SLOWLOG LEN

# 清空慢查询
redis-cli SLOWLOG RESET

# 查看慢查询配置
redis-cli CONFIG GET slowlog*

输出示例(关键字段解释)

1) 1) (integer) 128
   2) (integer) 1715080502   # 时间戳
   3) (integer) 9234         # 执行时间(微秒)
   4) 1) "HGETALL"
      2) "user:profile:1001"

4. 典型日志分析场景(含排错流程与命令)#

场景 A:AOF 重写失败
- 日志:Background append only file rewriting terminated by error
- 排错步骤:

# 1) 检查磁盘空间
df -h

# 2) 检查目录权限
ls -ld /var/lib/redis

# 3) 检查 I/O 负载
iostat -x 1 3

# 4) 查看 Redis 运行状态
redis-cli INFO persistence

场景 B:复制频繁断连
- 日志:Connection with replica lostmaster <-> replica 断链
- 排错步骤:

# 1) 网络连通性
ping -c 3 <replica_ip>

# 2) 复制状态
redis-cli INFO replication

# 3) 复制积压缓冲
redis-cli CONFIG GET repl-backlog-size

场景 C:OOM 告警
- 日志:OOM command not allowed
- 排错步骤:

redis-cli INFO memory
redis-cli CONFIG GET maxmemory maxmemory-policy

5. 慢查询优化建议(含示例)#

  • 命令优化:避免大范围扫描与大 key 操作,优先 SCAN + 分页。
  • 数据结构优化:拆分大 key、细粒度存储。
  • 客户端优化:pipeline 降低 RTT,合理超时与连接池。

示例:用 SCAN 替代 KEYS

# 不推荐:阻塞所有请求
# redis-cli KEYS "user:*"

# 推荐:分页扫描
redis-cli --scan --pattern "user:*" | head -n 20

示例:Pipeline 降低 RTT(redis-cli)

# 生成 1000 条 SET 命令并批量执行
for i in $(seq 1 1000); do
  echo "SET user:$i value$i"
done | redis-cli --pipe

6. 运维清单与告警建议(含示例)#

  • 定期巡检慢查询数量与增长速率
  • 监控慢查询 TOP N 命令与 key 分布
  • 建立慢查询告警阈值(如 1 分钟内 > 50 条)
  • 关联应用日志快速定位业务热点

示例:定时拉取慢查询(crontab)

# 每 5 分钟拉取慢查询并落盘
*/5 * * * * redis-cli SLOWLOG GET 128 >> /var/log/redis/slowlog.dump

7. 练习与验证#

1) 练习 1:触发慢查询
- 设置阈值 1ms,并执行大范围 LRANGE

redis-cli CONFIG SET slowlog-log-slower-than 1000
redis-cli LPUSH list:big $(seq 1 50000)
redis-cli LRANGE list:big 0 49999
redis-cli SLOWLOG GET 3

2) 练习 2:日志切割验证
- 手动触发日志轮转并观察新日志文件写入

sudo logrotate -f /etc/logrotate.d/redis
tail -n 3 /var/log/redis/redis-server.log

3) 练习 3:排错演练
- 人为设置过低 maxmemory 并观察告警

redis-cli CONFIG SET maxmemory 10mb
redis-cli SET bigkey "$(head -c 20M /dev/zero | tr '\0' 'A')"
tail -n 5 /var/log/redis/redis-server.log

8. 输出与报表建议#

  • 周报:慢查询数量趋势、TOP 命令、TOP key
  • 月报:实例性能基线、慢查询分布、优化建议
  • 异常事件归档:故障日志、恢复操作、最终解决方案