8.6.2 日志与慢查询分析
日志与慢查询分析#
Redis 日志与慢查询是定位性能瓶颈、异常抖动与热点问题的核心手段。本节给出日志与慢查询的原理草图、配置与采集示例、排错流程与练习,确保可直接落地。
原理草图:日志与慢查询流转#
1. 日志类型与配置要点(含安装与配置示例)#
- 运行日志(logfile):记录启动、故障、持久化、复制、集群状态变更等事件。
- 慢查询日志(slowlog):记录执行耗时超过阈值的命令。
- AOF/RDB 日志:AOF 重写、RDB 保存失败或延迟提示。
- 客户端异常:
maxclients、OOM、MISCONF等告警信息。
安装 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 lost 或 master <-> 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
- 月报:实例性能基线、慢查询分布、优化建议
- 异常事件归档:故障日志、恢复操作、最终解决方案