Skip to content

Redis 监控指标

Redis 监控是运维工作的重要组成部分,通过监控关键指标可以及时发现和解决 Redis 运行中的问题,确保 Redis 服务的稳定性和性能。本文档将详细介绍 Redis 监控指标的核心概念、主要指标类别、监控工具配置、最佳实践和常见问题。

核心概念

1. 监控目标

  • 实时性:及时获取 Redis 运行状态
  • 全面性:覆盖 Redis 各个方面的指标
  • 可告警性:基于指标设置合理的告警阈值
  • 可分析性:便于对历史数据进行分析和趋势预测
  • 可视化:通过图表直观展示 Redis 运行状态

2. 监控层级

  • 实例级监控:单 Redis 实例的运行状态
  • 集群级监控:Redis Cluster 或 Sentinel 集群的整体状态
  • 应用级监控:Redis 在应用中的使用情况
  • 系统级监控:Redis 所在服务器的系统资源使用情况

3. 监控频率

  • 核心指标:1-5 秒
  • 重要指标:10-30 秒
  • 一般指标:1-5 分钟
  • 系统指标:5-30 秒

主要指标类别

1. 性能指标

指标名称描述单位正常范围异常阈值监控工具
ops/sec每秒处理的命令数次/秒取决于业务> 最大处理能力redis-cli, Prometheus
latency命令执行延迟毫秒< 1ms> 10msredis-cli, Prometheus
hit rate缓存命中率%> 90%< 80%应用层统计
rejected connections拒绝的连接数0> 0redis-cli, Prometheus
expired keys每秒过期的键数次/秒取决于业务突增redis-cli, Prometheus
evicted keys每秒驱逐的键数次/秒0 (正常情况)> 0redis-cli, Prometheus

2. 内存指标

指标名称描述单位正常范围异常阈值监控工具
used_memoryRedis 使用的内存总量字节取决于配置> maxmemoryredis-cli, Prometheus
used_memory_rssRedis 占用的物理内存字节< used_memory * 1.5> used_memory * 2redis-cli, Prometheus
mem_fragmentation_ratio内存碎片率比率1.0-1.5> 1.5 或 < 1.0redis-cli, Prometheus
used_memory_dataset数据集占用的内存字节取决于业务-redis-cli, Prometheus
used_memory_overhead元数据占用的内存字节< used_memory * 0.3> used_memory * 0.5redis-cli, Prometheus
maxmemory配置的最大内存字节--redis-cli, Prometheus

3. 连接指标

指标名称描述单位正常范围异常阈值监控工具
connected_clients当前连接的客户端数< maxclients * 0.8> maxclients * 0.9redis-cli, Prometheus
client_longest_output_list客户端输出缓冲区最大长度< 1000> 10000redis-cli, Prometheus
client_biggest_input_buf客户端输入缓冲区最大大小字节< 1MB> 10MBredis-cli, Prometheus
blocked_clients被阻塞的客户端数取决于业务突增redis-cli, Prometheus

4. 复制指标

指标名称描述单位正常范围异常阈值监控工具
master_link_status主从连接状态-updownredis-cli, Prometheus
master_repl_offset主节点复制偏移量字节--redis-cli, Prometheus
slave_repl_offset从节点复制偏移量字节接近 master_repl_offset差距 > 1MBredis-cli, Prometheus
repl_backlog_active复制积压缓冲区是否活跃0/110redis-cli, Prometheus
repl_backlog_size复制积压缓冲区大小字节足够大过小redis-cli, Prometheus
repl_backlog_histlen复制积压缓冲区历史长度字节< repl_backlog_size= repl_backlog_sizeredis-cli, Prometheus

5. 持久化指标

指标名称描述单位正常范围异常阈值监控工具
rdb_bgsave_in_progressRDB 持久化是否进行中0/10 (正常)长时间为 1redis-cli, Prometheus
rdb_last_save_time上次 RDB 持久化时间时间戳最近超过配置间隔redis-cli, Prometheus
rdb_changes_since_last_save上次 RDB 后修改的键数< 触发阈值> 触发阈值redis-cli, Prometheus
aof_enabledAOF 是否启用0/110redis-cli, Prometheus
aof_rewrite_in_progressAOF 重写是否进行中0/10 (正常)长时间为 1redis-cli, Prometheus
aof_last_rewrite_time_sec上次 AOF 重写耗时< 300> 600redis-cli, Prometheus
aof_current_sizeAOF 文件当前大小字节取决于业务增长过快redis-cli, Prometheus

6. 集群指标

指标名称描述单位正常范围异常阈值监控工具
cluster_state集群状态-okfailredis-cli, Prometheus
cluster_slots_assigned已分配的槽位数16384< 16384redis-cli, Prometheus
cluster_slots_ok正常的槽位数16384< 16384redis-cli, Prometheus
cluster_slots_pfail可能失败的槽位数0> 0redis-cli, Prometheus
cluster_slots_fail失败的槽位数0> 0redis-cli, Prometheus
cluster_known_nodes集群中的节点数预期数量不一致redis-cli, Prometheus
cluster_size集群中的主节点数预期数量不一致redis-cli, Prometheus

7. Sentinel 指标

指标名称描述单位正常范围异常阈值监控工具
sentinel_masters监控的主节点数预期数量不一致redis-cli, Prometheus
sentinel_tilt是否处于 tilt 状态0/101redis-cli, Prometheus
sentinel_running_scripts正在运行的脚本数0> 0redis-cli, Prometheus
sentinel_odown_master客观下线的主节点数0> 0redis-cli, Prometheus
sentinel_sdown_master主观下线的主节点数0> 0redis-cli, Prometheus

8. 系统指标

指标名称描述单位正常范围异常阈值监控工具
cpu_usageCPU 使用率%< 80%> 90%Prometheus, Node Exporter
mem_usage内存使用率%< 80%> 90%Prometheus, Node Exporter
disk_usage磁盘使用率%< 80%> 90%Prometheus, Node Exporter
network_in网络入流量字节/秒取决于业务突增Prometheus, Node Exporter
network_out网络出流量字节/秒取决于业务突增Prometheus, Node Exporter
disk_io_read磁盘读 IO字节/秒取决于业务突增Prometheus, Node Exporter
disk_io_write磁盘写 IO字节/秒取决于业务突增Prometheus, Node Exporter

监控工具配置

1. Redis Exporter + Prometheus + Grafana

1.1 Redis Exporter 配置

yaml
# redis_exporter.yml
redis_addr: redis://localhost:6379
redis_password: ""
redis_user: ""
namespace: redis
exporter_port: 9121
exporter_addr: 0.0.0.0
enable_redis_metrics: true
enable_go_metrics: true
check_keys: []
check_key_groups: []

1.2 Prometheus 配置

yaml
# prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'redis'
    static_configs:
      - targets: ['redis-exporter:9121']

1.3 Grafana 配置

  1. 安装 Redis 监控面板(ID: 763)
  2. 配置 Prometheus 数据源
  3. 导入 Redis 监控模板
  4. 根据业务需求调整告警规则

2. redis-cli 监控命令

bash
# 实时监控 Redis 关键指标
redis-cli --stat 1

# 查看内存使用情况
redis-cli info memory

# 查看复制状态
redis-cli info replication

# 查看持久化状态
redis-cli info persistence

# 查看集群状态
redis-cli cluster info

# 查看客户端连接
redis-cli info clients

3. 自定义监控脚本

bash
#!/bin/bash
# 简单的 Redis 监控脚本

REDIS_CLI="redis-cli"
HOST="localhost"
PORT="6379"

# 获取关键指标
USED_MEMORY=$($REDIS_CLI -h $HOST -p $PORT info memory | grep used_memory_human | awk -F: '{print $2}' | tr -d '[:space:]')
CONNECTED_CLIENTS=$($REDIS_CLI -h $HOST -p $PORT info clients | grep connected_clients | awk -F: '{print $2}' | tr -d '[:space:]')
OPS_SEC=$($REDIS_CLI -h $HOST -p $PORT info stats | grep instantaneous_ops_per_sec | awk -F: '{print $2}' | tr -d '[:space:]')

# 输出监控结果
echo "$(date +"%Y-%m-%d %H:%M:%S") Redis 监控:"
echo "  内存使用: $USED_MEMORY"
echo "  连接客户端数: $CONNECTED_CLIENTS"
echo "  每秒命令数: $OPS_SEC"

监控最佳实践

1. 指标选择

  • 核心指标优先:优先监控影响 Redis 稳定性和性能的核心指标
  • 业务相关指标:根据业务特点选择监控指标
  • 避免指标泛滥:选择关键指标,避免监控过多无用指标
  • 定期调整指标:根据业务变化定期调整监控指标

2. 告警配置

  • 合理设置阈值:根据业务特点和历史数据设置合理的告警阈值
  • 分级告警:根据问题严重程度设置不同级别的告警(警告、严重、紧急)
  • 告警收敛:设置合理的告警间隔,避免告警风暴
  • 告警通知渠道:配置多种告警通知渠道(邮件、短信、企业微信、Slack 等)
  • 告警测试:定期测试告警是否正常触发

3. 监控数据管理

  • 数据保留策略:根据需求设置合理的数据保留时间
  • 数据采样:对长期历史数据进行采样,减少存储开销
  • 数据备份:定期备份重要的监控数据
  • 数据分析:定期分析监控数据,发现潜在问题和优化点

4. 监控系统维护

  • 监控系统高可用:确保监控系统本身的高可用性
  • 定期更新监控工具:及时更新监控工具版本,获取新功能和 bug 修复
  • 监控系统性能:监控监控系统本身的性能,避免成为瓶颈
  • 文档化:对监控配置、告警规则和处理流程进行文档化

常见问题(FAQ)

Q1: 如何判断 Redis 内存碎片率过高?

A1: Redis 内存碎片率(mem_fragmentation_ratio)是一个重要指标,用于衡量 Redis 内存使用的效率。

  • 正常范围:1.0 - 1.5
  • 需要关注:1.5 - 2.0
  • 严重问题:> 2.0

当内存碎片率过高时,可以通过以下方法解决:

  1. 重启 Redis 实例(会导致业务中断)
  2. 调整 maxmemory 配置
  3. 优化数据结构,减少内存碎片
  4. 升级 Redis 版本,新版本对内存碎片管理有优化

Q2: 如何设置合理的 Redis 告警阈值?

A2: 设置合理的告警阈值需要考虑以下因素:

  1. 业务特点:不同业务对 Redis 性能和可用性的要求不同
  2. 历史数据:分析历史数据,了解正常范围
  3. 资源配置:根据 Redis 实例的资源配置设置阈值
  4. 告警分级:根据问题严重程度设置不同级别的阈值
  5. 逐步调整:先设置较宽松的阈值,然后根据实际情况逐步调整

Q3: 如何监控 Redis Cluster 集群?

A3: 监控 Redis Cluster 集群需要关注以下几个方面:

  1. 集群状态:cluster_state 指标,确保集群状态为 ok
  2. 槽位分配:cluster_slots_assigned 和 cluster_slots_ok 指标,确保所有槽位都已分配且正常
  3. 节点状态:监控每个节点的运行状态、内存使用、连接数等
  4. 复制状态:确保每个主节点都有足够的从节点,且复制正常
  5. 故障转移:监控集群的自动故障转移情况

Q4: 如何监控 Redis 持久化性能?

A4: 监控 Redis 持久化性能需要关注以下指标:

  1. RDB 持久化:rdb_bgsave_in_progress、rdb_last_save_time、rdb_changes_since_last_save
  2. AOF 持久化:aof_enabled、aof_rewrite_in_progress、aof_last_rewrite_time_sec、aof_current_size
  3. 持久化对性能的影响:监控持久化期间的 Redis 性能变化
  4. 持久化文件大小:监控 RDB 和 AOF 文件的大小变化

Q5: 如何监控 Redis 连接数?

A5: 监控 Redis 连接数需要关注以下指标:

  1. connected_clients:当前连接的客户端数
  2. maxclients:配置的最大客户端数
  3. rejected_connections:被拒绝的连接数
  4. client_longest_output_list:客户端输出缓冲区最大长度
  5. client_biggest_input_buf:客户端输入缓冲区最大大小

Q6: 如何监控 Redis 复制延迟?

A6: 监控 Redis 复制延迟需要关注以下指标:

  1. master_repl_offset:主节点复制偏移量
  2. slave_repl_offset:从节点复制偏移量
  3. 复制延迟计算:master_repl_offset - slave_repl_offset
  4. repl_backlog_size:复制积压缓冲区大小,确保足够大以容纳复制延迟
  5. repl_backlog_histlen:复制积压缓冲区历史长度

Q7: 如何监控 Redis 命令执行延迟?

A7: 监控 Redis 命令执行延迟可以通过以下方法:

  1. 使用 redis-cli --latency 命令实时监控延迟
  2. 使用 redis-cli info stats 查看 instantaneous_ops_per_sec 和 avg_ttl 等指标
  3. 在 Prometheus 中使用 redis_command_duration_seconds 指标
  4. 配置 Grafana 面板展示延迟趋势
  5. 设置延迟告警阈值,当延迟超过阈值时触发告警

Q8: 如何监控 Redis 缓存命中率?

A8: Redis 本身没有直接提供缓存命中率指标,需要通过以下方法计算:

  1. 应用层计算:在应用中统计 Redis 命令的命中和未命中次数
  2. 使用 MONITOR 命令:通过监控 Redis 命令执行情况,统计命中率
  3. 使用 Redis 模块:如 RedisBloom 等模块提供命中率统计功能
  4. 基于 info stats:通过 keyspace_hits 和 keyspace_misses 指标计算:
    hit_rate = keyspace_hits / (keyspace_hits + keyspace_misses) * 100%