外观
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 | > 10ms | redis-cli, Prometheus |
| hit rate | 缓存命中率 | % | > 90% | < 80% | 应用层统计 |
| rejected connections | 拒绝的连接数 | 次 | 0 | > 0 | redis-cli, Prometheus |
| expired keys | 每秒过期的键数 | 次/秒 | 取决于业务 | 突增 | redis-cli, Prometheus |
| evicted keys | 每秒驱逐的键数 | 次/秒 | 0 (正常情况) | > 0 | redis-cli, Prometheus |
2. 内存指标
| 指标名称 | 描述 | 单位 | 正常范围 | 异常阈值 | 监控工具 |
|---|---|---|---|---|---|
| used_memory | Redis 使用的内存总量 | 字节 | 取决于配置 | > maxmemory | redis-cli, Prometheus |
| used_memory_rss | Redis 占用的物理内存 | 字节 | < used_memory * 1.5 | > used_memory * 2 | redis-cli, Prometheus |
| mem_fragmentation_ratio | 内存碎片率 | 比率 | 1.0-1.5 | > 1.5 或 < 1.0 | redis-cli, Prometheus |
| used_memory_dataset | 数据集占用的内存 | 字节 | 取决于业务 | - | redis-cli, Prometheus |
| used_memory_overhead | 元数据占用的内存 | 字节 | < used_memory * 0.3 | > used_memory * 0.5 | redis-cli, Prometheus |
| maxmemory | 配置的最大内存 | 字节 | - | - | redis-cli, Prometheus |
3. 连接指标
| 指标名称 | 描述 | 单位 | 正常范围 | 异常阈值 | 监控工具 |
|---|---|---|---|---|---|
| connected_clients | 当前连接的客户端数 | 个 | < maxclients * 0.8 | > maxclients * 0.9 | redis-cli, Prometheus |
| client_longest_output_list | 客户端输出缓冲区最大长度 | 个 | < 1000 | > 10000 | redis-cli, Prometheus |
| client_biggest_input_buf | 客户端输入缓冲区最大大小 | 字节 | < 1MB | > 10MB | redis-cli, Prometheus |
| blocked_clients | 被阻塞的客户端数 | 个 | 取决于业务 | 突增 | redis-cli, Prometheus |
4. 复制指标
| 指标名称 | 描述 | 单位 | 正常范围 | 异常阈值 | 监控工具 |
|---|---|---|---|---|---|
| master_link_status | 主从连接状态 | - | up | down | redis-cli, Prometheus |
| master_repl_offset | 主节点复制偏移量 | 字节 | - | - | redis-cli, Prometheus |
| slave_repl_offset | 从节点复制偏移量 | 字节 | 接近 master_repl_offset | 差距 > 1MB | redis-cli, Prometheus |
| repl_backlog_active | 复制积压缓冲区是否活跃 | 0/1 | 1 | 0 | redis-cli, Prometheus |
| repl_backlog_size | 复制积压缓冲区大小 | 字节 | 足够大 | 过小 | redis-cli, Prometheus |
| repl_backlog_histlen | 复制积压缓冲区历史长度 | 字节 | < repl_backlog_size | = repl_backlog_size | redis-cli, Prometheus |
5. 持久化指标
| 指标名称 | 描述 | 单位 | 正常范围 | 异常阈值 | 监控工具 |
|---|---|---|---|---|---|
| rdb_bgsave_in_progress | RDB 持久化是否进行中 | 0/1 | 0 (正常) | 长时间为 1 | redis-cli, Prometheus |
| rdb_last_save_time | 上次 RDB 持久化时间 | 时间戳 | 最近 | 超过配置间隔 | redis-cli, Prometheus |
| rdb_changes_since_last_save | 上次 RDB 后修改的键数 | 个 | < 触发阈值 | > 触发阈值 | redis-cli, Prometheus |
| aof_enabled | AOF 是否启用 | 0/1 | 1 | 0 | redis-cli, Prometheus |
| aof_rewrite_in_progress | AOF 重写是否进行中 | 0/1 | 0 (正常) | 长时间为 1 | redis-cli, Prometheus |
| aof_last_rewrite_time_sec | 上次 AOF 重写耗时 | 秒 | < 300 | > 600 | redis-cli, Prometheus |
| aof_current_size | AOF 文件当前大小 | 字节 | 取决于业务 | 增长过快 | redis-cli, Prometheus |
6. 集群指标
| 指标名称 | 描述 | 单位 | 正常范围 | 异常阈值 | 监控工具 |
|---|---|---|---|---|---|
| cluster_state | 集群状态 | - | ok | fail | redis-cli, Prometheus |
| cluster_slots_assigned | 已分配的槽位数 | 个 | 16384 | < 16384 | redis-cli, Prometheus |
| cluster_slots_ok | 正常的槽位数 | 个 | 16384 | < 16384 | redis-cli, Prometheus |
| cluster_slots_pfail | 可能失败的槽位数 | 个 | 0 | > 0 | redis-cli, Prometheus |
| cluster_slots_fail | 失败的槽位数 | 个 | 0 | > 0 | redis-cli, Prometheus |
| cluster_known_nodes | 集群中的节点数 | 个 | 预期数量 | 不一致 | redis-cli, Prometheus |
| cluster_size | 集群中的主节点数 | 个 | 预期数量 | 不一致 | redis-cli, Prometheus |
7. Sentinel 指标
| 指标名称 | 描述 | 单位 | 正常范围 | 异常阈值 | 监控工具 |
|---|---|---|---|---|---|
| sentinel_masters | 监控的主节点数 | 个 | 预期数量 | 不一致 | redis-cli, Prometheus |
| sentinel_tilt | 是否处于 tilt 状态 | 0/1 | 0 | 1 | redis-cli, Prometheus |
| sentinel_running_scripts | 正在运行的脚本数 | 个 | 0 | > 0 | redis-cli, Prometheus |
| sentinel_odown_master | 客观下线的主节点数 | 个 | 0 | > 0 | redis-cli, Prometheus |
| sentinel_sdown_master | 主观下线的主节点数 | 个 | 0 | > 0 | redis-cli, Prometheus |
8. 系统指标
| 指标名称 | 描述 | 单位 | 正常范围 | 异常阈值 | 监控工具 |
|---|---|---|---|---|---|
| cpu_usage | CPU 使用率 | % | < 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 配置
- 安装 Redis 监控面板(ID: 763)
- 配置 Prometheus 数据源
- 导入 Redis 监控模板
- 根据业务需求调整告警规则
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 clients3. 自定义监控脚本
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
当内存碎片率过高时,可以通过以下方法解决:
- 重启 Redis 实例(会导致业务中断)
- 调整 maxmemory 配置
- 优化数据结构,减少内存碎片
- 升级 Redis 版本,新版本对内存碎片管理有优化
Q2: 如何设置合理的 Redis 告警阈值?
A2: 设置合理的告警阈值需要考虑以下因素:
- 业务特点:不同业务对 Redis 性能和可用性的要求不同
- 历史数据:分析历史数据,了解正常范围
- 资源配置:根据 Redis 实例的资源配置设置阈值
- 告警分级:根据问题严重程度设置不同级别的阈值
- 逐步调整:先设置较宽松的阈值,然后根据实际情况逐步调整
Q3: 如何监控 Redis Cluster 集群?
A3: 监控 Redis Cluster 集群需要关注以下几个方面:
- 集群状态:cluster_state 指标,确保集群状态为 ok
- 槽位分配:cluster_slots_assigned 和 cluster_slots_ok 指标,确保所有槽位都已分配且正常
- 节点状态:监控每个节点的运行状态、内存使用、连接数等
- 复制状态:确保每个主节点都有足够的从节点,且复制正常
- 故障转移:监控集群的自动故障转移情况
Q4: 如何监控 Redis 持久化性能?
A4: 监控 Redis 持久化性能需要关注以下指标:
- RDB 持久化:rdb_bgsave_in_progress、rdb_last_save_time、rdb_changes_since_last_save
- AOF 持久化:aof_enabled、aof_rewrite_in_progress、aof_last_rewrite_time_sec、aof_current_size
- 持久化对性能的影响:监控持久化期间的 Redis 性能变化
- 持久化文件大小:监控 RDB 和 AOF 文件的大小变化
Q5: 如何监控 Redis 连接数?
A5: 监控 Redis 连接数需要关注以下指标:
- connected_clients:当前连接的客户端数
- maxclients:配置的最大客户端数
- rejected_connections:被拒绝的连接数
- client_longest_output_list:客户端输出缓冲区最大长度
- client_biggest_input_buf:客户端输入缓冲区最大大小
Q6: 如何监控 Redis 复制延迟?
A6: 监控 Redis 复制延迟需要关注以下指标:
- master_repl_offset:主节点复制偏移量
- slave_repl_offset:从节点复制偏移量
- 复制延迟计算:master_repl_offset - slave_repl_offset
- repl_backlog_size:复制积压缓冲区大小,确保足够大以容纳复制延迟
- repl_backlog_histlen:复制积压缓冲区历史长度
Q7: 如何监控 Redis 命令执行延迟?
A7: 监控 Redis 命令执行延迟可以通过以下方法:
- 使用
redis-cli --latency命令实时监控延迟 - 使用
redis-cli info stats查看 instantaneous_ops_per_sec 和 avg_ttl 等指标 - 在 Prometheus 中使用
redis_command_duration_seconds指标 - 配置 Grafana 面板展示延迟趋势
- 设置延迟告警阈值,当延迟超过阈值时触发告警
Q8: 如何监控 Redis 缓存命中率?
A8: Redis 本身没有直接提供缓存命中率指标,需要通过以下方法计算:
- 应用层计算:在应用中统计 Redis 命令的命中和未命中次数
- 使用 MONITOR 命令:通过监控 Redis 命令执行情况,统计命中率
- 使用 Redis 模块:如 RedisBloom 等模块提供命中率统计功能
- 基于 info stats:通过 keyspace_hits 和 keyspace_misses 指标计算:
hit_rate = keyspace_hits / (keyspace_hits + keyspace_misses) * 100%
