8.2.8 日志与慢查询配置优化

日志与慢查询配置优化#

日志与慢查询是定位 Redis 性能瓶颈与稳定性问题的关键手段。本节给出原理草图、配置示例、排错流程与练习,确保在性能与可观测性之间取得平衡。

原理草图:日志与慢查询的数据流#

文章图片

1. 日志级别与输出方式(含示例与命令解释)#

  • loglevelnotice 适合生产;排障时临时提升为 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

常见慢命令与应对:
- KEYSSMEMBERSZRANGE 大范围扫描
→ 改为 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,写出命令与结果截图(或输出)。