8.2.8 日志与慢查询配置优化
日志与慢查询配置优化#
日志与慢查询是定位 Redis 性能瓶颈与稳定性问题的关键手段。本节给出原理草图、配置示例、排错流程与练习,确保在性能与可观测性之间取得平衡。
原理草图:日志与慢查询的数据流#
1. 日志级别与输出方式(含示例与命令解释)#
- loglevel:
notice适合生产;排障时临时提升为verbose/debug。 - logfile:指定独立日志文件,便于轮转与归档。
- syslog:集中化日志管理可启用。
示例配置(/etc/redis/redis.conf):
# 生产建议:notice
loglevel notice
# 指定日志文件
logfile /var/log/redis/redis-server.log
# 如需接入系统日志再启用
# syslog-enabled yes
# syslog-ident redis
应用配置(无重启方式):
# 临时提升日志级别便于排障
redis-cli CONFIG SET loglevel verbose
# 排障完成后恢复
redis-cli CONFIG SET loglevel notice
2. 日志轮转与磁盘规划(含安装与配置)#
安装 logrotate(如未安装):
# Debian/Ubuntu
sudo apt-get update && sudo apt-get install -y logrotate
# CentOS/RHEL
sudo yum install -y logrotate
创建轮转策略(/etc/logrotate.d/redis):
/var/log/redis/redis-server.log {
daily
size 100M
rotate 14
missingok
compress
delaycompress
notifempty
copytruncate
create 0640 redis redis
postrotate
# 重新打开日志文件(若未用copytruncate可用信号)
/bin/kill -USR1 $(cat /var/run/redis_6379.pid 2>/dev/null) 2>/dev/null || true
endscript
}
验证轮转:
# 强制执行一次轮转查看效果
sudo logrotate -f /etc/logrotate.d/redis
# 查看新文件与压缩文件
ls -lh /var/log/redis/
3. 慢查询配置与阈值建议(含示例)#
- slowlog-log-slower-than:阈值(微秒),建议 10ms~50ms。
- slowlog-max-len:队列长度,建议 128~1024。
示例配置(/etc/redis/redis.conf):
slowlog-log-slower-than 10000
slowlog-max-len 256
在线调整并验证:
# 设置为 10ms
redis-cli CONFIG SET slowlog-log-slower-than 10000
redis-cli CONFIG SET slowlog-max-len 256
# 触发慢命令示例(示意:避免在生产执行 KEYS)
redis-cli DEBUG SLEEP 0.02
redis-cli slowlog get 5
4. 慢查询分析与常见优化(含命令与说明)#
查看慢查询:
redis-cli slowlog len
redis-cli slowlog get 10
关联命令统计:
redis-cli info commandstats
常见慢命令与应对:
- KEYS、SMEMBERS、ZRANGE 大范围扫描
→ 改为 SCAN 分页,或优化索引与数据模型
- 大键与热键
→ 拆分结构、分片、预聚合
示例:使用 SCAN 替代 KEYS
# 逐步扫描,避免阻塞
redis-cli --scan --pattern "user:*" | head -n 20
5. 排错流程(含命令解释)#
1)确认日志写入与权限
# 目录与权限
ls -ld /var/log/redis
ls -l /var/log/redis/redis-server.log
# 权限不当可修复
sudo chown -R redis:redis /var/log/redis
sudo chmod 0640 /var/log/redis/redis-server.log
2)确认日志级别与生效
redis-cli CONFIG GET loglevel
redis-cli CONFIG GET logfile
3)慢查询无记录排查
# 阈值过高会导致无记录
redis-cli CONFIG GET slowlog-log-slower-than
# 慢日志队列长度为0也会丢弃
redis-cli CONFIG GET slowlog-max-len
4)日志过大或磁盘告警
# 观察磁盘使用
df -h /var/log
# 临时清理并轮转
sudo logrotate -f /etc/logrotate.d/redis
6. 练习#
1)将日志级别从 notice 临时调整到 verbose,观察 1 分钟后恢复,并记录差异。
2)设置 slowlog-log-slower-than 5000,执行 DEBUG SLEEP 0.01,验证 slowlog 记录。
3)配置 logrotate 为每日轮转、保留 7 天,并强制执行一次轮转确认生效。
4)用 SCAN 替代 KEYS 获取 order:* 前 50 个 key,写出命令与结果截图(或输出)。