外观
Redis 监控指标参考
Redis 监控指标是评估 Redis 服务性能、稳定性和健康状态的重要依据。本文档提供了 Redis 核心监控指标的详细参考,包括指标含义、单位、正常范围、监控建议和获取方式,帮助运维人员更好地监控和优化 Redis 服务。
指标分类
Redis 监控指标可以分为以下几大类:
- 性能指标:评估 Redis 服务的性能表现
- 内存指标:监控 Redis 内存使用情况
- 复制指标:监控主从复制状态
- 持久化指标:监控 RDB 和 AOF 持久化状态
- 客户端指标:监控客户端连接和请求情况
- 命令统计指标:统计 Redis 命令执行情况
- 服务器指标:监控 Redis 服务器自身状态
- 集群指标:监控 Redis Cluster 状态
性能指标
1. 命令执行性能
| 指标名称 | 指标类型 | 单位 | 含义 | 正常范围 | 监控建议 |
|---|---|---|---|---|---|
instantaneous_ops_per_sec | 性能 | 次/秒 | 每秒执行的命令数 | 根据业务需求而定,一般为数千到数万 | 监控峰值和趋势,突然下降可能表示服务异常 |
total_commands_processed | 累计 | 次 | 自启动以来处理的命令总数 | - | 用于计算长期平均 QPS |
total_connections_received | 累计 | 次 | 自启动以来接收的客户端连接总数 | - | 用于分析连接趋势 |
instantaneous_input_kbps | 网络 | KB/s | 每秒网络输入流量 | 根据业务需求而定 | 监控突发流量,避免网络瓶颈 |
instantaneous_output_kbps | 网络 | KB/s | 每秒网络输出流量 | 根据业务需求而定 | 监控突发流量,避免网络瓶颈 |
2. 延迟指标
| 指标名称 | 指标类型 | 单位 | 含义 | 正常范围 | 监控建议 |
|---|---|---|---|---|---|
latency | 性能 | 毫秒 | 命令执行延迟 | 一般 < 1 毫秒 | 使用 redis-cli --latency 命令监控,高延迟可能表示服务过载或存在慢查询 |
slowlog_log_slower_than | 配置 | 微秒 | 慢查询阈值 | 一般设置为 10000 微秒(10 毫秒) | 根据业务需求调整,监控慢查询日志 |
slowlog_max_len | 配置 | 条 | 慢查询日志最大长度 | 一般设置为 128-1024 条 | 确保有足够空间存储慢查询日志 |
内存指标
1. 内存使用情况
| 指标名称 | 指标类型 | 单位 | 含义 | 正常范围 | 监控建议 |
|---|---|---|---|---|---|
used_memory | 内存 | 字节 | Redis 分配器分配的内存总量 | 根据 maxmemory 配置而定 | 监控使用率,避免内存溢出 |
used_memory_rss | 内存 | 字节 | Redis 进程占用的物理内存总量 | 理想情况下接近 used_memory | used_memory_rss / used_memory 比值应 < 1.5,过高表示内存碎片严重 |
used_memory_peak | 内存 | 字节 | Redis 内存使用的峰值 | 根据 maxmemory 配置而定 | 监控峰值,评估内存增长趋势 |
used_memory_dataset | 内存 | 字节 | 数据占用的内存量 | 根据业务数据量而定 | 占 used_memory 的比例应 > 50%,否则可能存在内存碎片或内存泄漏 |
used_memory_lua | 内存 | 字节 | Lua 脚本引擎占用的内存 | 一般很小,< 1MB | 过大可能表示 Lua 脚本存在问题 |
mem_fragmentation_ratio | 内存 | 比值 | 内存碎片率(used_memory_rss / used_memory) | 1.0-1.5 | > 1.5 表示内存碎片严重,< 1.0 可能存在内存交换 |
2. 内存配置
| 指标名称 | 指标类型 | 单位 | 含义 | 正常范围 | 监控建议 |
|---|---|---|---|---|---|
maxmemory | 配置 | 字节 | Redis 最大使用内存 | 根据服务器内存配置而定 | 一般设置为服务器内存的 70%-80% |
maxmemory_policy | 配置 | 字符串 | 内存淘汰策略 | 根据业务需求而定 | 常见策略:allkeys-lru、volatile-lru、noeviction |
maxmemory_samples | 配置 | 个 | LRU 算法采样数量 | 一般为 5-10 | 影响 LRU 算法的准确性和性能 |
复制指标
1. 主节点复制状态
| 指标名称 | 指标类型 | 单位 | 含义 | 正常范围 | 监控建议 |
|---|---|---|---|---|---|
connected_slaves | 状态 | 个 | 连接的从节点数量 | 根据部署架构而定 | 与预期数量不符可能表示从节点故障 |
master_replid | 标识 | 字符串 | 主节点的唯一标识符 | - | 变化表示主节点重启或故障转移 |
master_repl_offset | 偏移量 | 字节 | 主节点的复制偏移量 | - | 用于与从节点偏移量比较,评估复制延迟 |
repl_backlog_active | 状态 | 布尔值 | 复制积压缓冲区是否激活 | 1(激活) | 0 表示未激活,可能导致频繁全量复制 |
repl_backlog_size | 配置 | 字节 | 复制积压缓冲区大小 | 一般为 1MB-10MB | 根据主节点写入量调整,避免频繁全量复制 |
repl_backlog_first_byte_offset | 偏移量 | 字节 | 复制积压缓冲区中第一个字节的偏移量 | - | 用于计算缓冲区覆盖范围 |
repl_backlog_histlen | 长度 | 字节 | 复制积压缓冲区中当前存储的字节数 | < repl_backlog_size | 接近 repl_backlog_size 表示缓冲区即将满 |
2. 从节点复制状态
| 指标名称 | 指标类型 | 单位 | 含义 | 正常范围 | 监控建议 |
|---|---|---|---|---|---|
role | 状态 | 字符串 | 节点角色(master/slave) | - | 用于确认节点角色 |
master_host | 配置 | 字符串 | 主节点 IP 地址 | - | 用于确认主从关系 |
master_port | 配置 | 端口 | 主节点端口 | - | 用于确认主从关系 |
master_link_status | 状态 | 字符串 | 主从连接状态(up/down) | up | down 表示主从连接断开 |
master_last_io_seconds_ago | 时间 | 秒 | 上次与主节点通信的时间 | < 10 秒 | > 30 秒表示主从连接可能存在问题 |
master_sync_in_progress | 状态 | 布尔值 | 是否正在进行主从同步 | 0(未进行) | 1 表示正在进行全量复制 |
slave_repl_offset | 偏移量 | 字节 | 从节点的复制偏移量 | 接近 master_repl_offset | 与 master_repl_offset 的差值表示复制延迟 |
slave_priority | 配置 | 整数 | 从节点优先级 | 1-100 | 用于故障转移时选择新主节点,值越小优先级越高 |
slave_read_only | 配置 | 布尔值 | 是否为只读模式 | 1(只读) | 从节点建议保持只读 |
master_sync_left_bytes | 同步 | 字节 | 全量复制剩余字节数 | - | 用于监控全量复制进度 |
持久化指标
1. RDB 持久化指标
| 指标名称 | 指标类型 | 单位 | 含义 | 正常范围 | 监控建议 |
|---|---|---|---|---|---|
rdb_last_save_time | 时间 | 时间戳 | 上次 RDB 保存的时间戳 | - | 用于检查 RDB 保存频率 |
rdb_changes_since_last_save | 计数 | 次 | 自上次 RDB 保存以来的写命令数 | 根据 save 配置而定 | 接近 save 配置阈值时可能触发 RDB 保存 |
rdb_bgsave_in_progress | 状态 | 布尔值 | 是否正在执行 BGSAVE 命令 | 0(未执行) | 1 表示正在执行 RDB 持久化 |
rdb_last_bgsave_status | 状态 | 字符串 | 上次 BGSAVE 命令的执行状态(ok/err) | ok | err 表示 RDB 持久化失败 |
rdb_last_bgsave_time_sec | 时间 | 秒 | 上次 BGSAVE 命令的执行时间 | < 300 秒 | 过长表示 RDB 持久化效率低 |
rdb_current_bgsave_time_sec | 时间 | 秒 | 当前 BGSAVE 命令的执行时间 | - | 用于监控正在进行的 RDB 持久化进度 |
2. AOF 持久化指标
| 指标名称 | 指标类型 | 单位 | 含义 | 正常范围 | 监控建议 |
|---|---|---|---|---|---|
aof_enabled | 状态 | 布尔值 | 是否启用 AOF 持久化 | 1(启用) | 建议生产环境启用 AOF |
aof_rewrite_in_progress | 状态 | 布尔值 | 是否正在执行 AOF 重写 | 0(未执行) | 1 表示正在执行 AOF 重写 |
aof_rewrite_scheduled | 状态 | 布尔值 | 是否计划执行 AOF 重写 | 0(无计划) | 1 表示 BGSAVE 完成后将执行 AOF 重写 |
aof_last_rewrite_time_sec | 时间 | 秒 | 上次 AOF 重写的执行时间 | < 300 秒 | 过长表示 AOF 重写效率低 |
aof_current_rewrite_time_sec | 时间 | 秒 | 当前 AOF 重写的执行时间 | - | 用于监控正在进行的 AOF 重写进度 |
aof_last_bgrewrite_status | 状态 | 字符串 | 上次 AOF 重写的执行状态(ok/err) | ok | err 表示 AOF 重写失败 |
aof_last_write_status | 状态 | 字符串 | 上次 AOF 写入的执行状态(ok/err) | ok | err 表示 AOF 写入失败 |
aof_current_size | 大小 | 字节 | 当前 AOF 文件大小 | 根据数据量而定 | 监控增长趋势,避免文件过大 |
aof_base_size | 大小 | 字节 | AOF 重写基准大小 | 根据数据量而定 | 用于计算 AOF 重写触发条件 |
aof_pending_rewrite | 状态 | 布尔值 | 是否有 AOF 重写等待执行 | 0(无) | 1 表示有 AOF 重写等待执行 |
aof_buffer_length | 大小 | 字节 | AOF 缓冲区长度 | 一般很小 | 过大表示 AOF 写入不及时 |
aof_rewrite_buffer_length | 大小 | 字节 | AOF 重写缓冲区长度 | 一般很小 | 过大表示 AOF 重写不及时 |
aof_pending_bio_fsync | 计数 | 个 | 等待执行 fsync 的 AOF 写操作数 | 0 | 过大表示 fsync 压力大 |
aof_delayed_fsync | 计数 | 次 | 延迟执行的 fsync 次数 | 0 | 非 0 表示 fsync 存在延迟 |
客户端指标
1. 客户端连接
| 指标名称 | 指标类型 | 单位 | 含义 | 正常范围 | 监控建议 |
|---|---|---|---|---|---|
connected_clients | 状态 | 个 | 当前连接的客户端数量 | < maxclients | 接近 maxclients 时可能导致新连接被拒绝 |
client_longest_output_list | 状态 | 个 | 输出缓冲区最长的客户端连接 | < 1000 | 过大可能表示客户端处理缓慢或存在大查询 |
client_biggest_input_buf | 状态 | 字节 | 输入缓冲区最大的客户端连接 | < 1MB | 过大可能表示客户端发送了大命令或存在网络问题 |
blocked_clients | 状态 | 个 | 被阻塞的客户端数量 | 一般为 0 | 非 0 表示存在阻塞命令(如 BLPOP、BRPOP 等) |
maxclients | 配置 | 个 | 最大客户端连接数 | 根据服务器配置而定 | 一般设置为 10000-50000 |
2. 客户端流量
| 指标名称 | 指标类型 | 单位 | 含义 | 正常范围 | 监控建议 |
|---|---|---|---|---|---|
total_net_input_bytes | 累计 | 字节 | 自启动以来的网络输入总量 | - | 用于计算长期平均输入流量 |
total_net_output_bytes | 累计 | 字节 | 自启动以来的网络输出总量 | - | 用于计算长期平均输出流量 |
命令统计指标
1. 命令执行统计
| 指标名称 | 指标类型 | 单位 | 含义 | 正常范围 | 监控建议 |
|---|---|---|---|---|---|
cmdstat_<command> | 统计 | 字典 | 特定命令的执行统计 | - | 用于分析命令使用情况和性能 |
total_commands_processed | 累计 | 次 | 自启动以来处理的命令总数 | - | 用于计算长期平均 QPS |
rejected_connections | 累计 | 次 | 被拒绝的客户端连接数 | 0 | 非 0 表示 maxclients 已达上限 |
expired_keys | 累计 | 次 | 自启动以来过期的键数 | - | 用于分析过期键频率 |
evicted_keys | 累计 | 次 | 自启动以来因内存不足被淘汰的键数 | 0 或少量 | 大量表示内存不足或淘汰策略不合理 |
keyspace_hits | 累计 | 次 | 键空间命中次数 | - | 用于计算缓存命中率 |
keyspace_misses | 累计 | 次 | 键空间未命中次数 | - | 用于计算缓存命中率 |
keyspace_hitrate | 性能 | 比值 | 缓存命中率(keyspace_hits / (keyspace_hits + keyspace_misses)) | > 0.8 | 过低可能表示缓存设计不合理或数据过期策略不当 |
服务器指标
1. 服务器基本信息
| 指标名称 | 指标类型 | 单位 | 含义 | 正常范围 | 监控建议 |
|---|---|---|---|---|---|
redis_version | 版本 | 字符串 | Redis 服务器版本 | - | 用于确认 Redis 版本,及时升级安全补丁 |
redis_git_sha1 | 标识 | 字符串 | Git 提交 SHA1 | - | 用于确认 Redis 具体版本 |
redis_git_dirty | 标识 | 整数 | Git 脏标志 | 0 | 1 表示代码有未提交修改 |
redis_build_id | 标识 | 字符串 | 构建 ID | - | 用于标识 Redis 构建版本 |
redis_mode | 模式 | 字符串 | Redis 运行模式(standalone/sentinel/cluster) | - | 用于确认 Redis 运行模式 |
os | 系统 | 字符串 | 操作系统类型 | - | 用于了解运行环境 |
arch_bits | 架构 | 位 | 操作系统架构 | 64 | 建议使用 64 位系统 |
multiplexing_api | 网络 | 字符串 | 网络多路复用 API | epoll/kqueue | 不同系统使用不同 API |
gcc_version | 编译 | 字符串 | 编译时使用的 GCC 版本 | - | 用于了解编译环境 |
process_id | 进程 | 整数 | Redis 进程 ID | - | 用于进程管理和监控 |
run_id | 标识 | 字符串 | Redis 实例唯一标识符 | - | 用于标识 Redis 实例,重启后变化 |
tcp_port | 端口 | 端口 | 监听的 TCP 端口 | 6379 | 用于确认监听端口 |
uptime_in_seconds | 运行 | 秒 | 自启动以来的运行时间 | - | 用于监控服务稳定性 |
uptime_in_days | 运行 | 天 | 自启动以来的运行天数 | - | 用于监控服务稳定性 |
hz | 配置 | Hz | Redis 内部调度频率 | 10 | 一般不需要修改 |
configured_hz | 配置 | Hz | 配置的调度频率 | 10 | 一般不需要修改 |
lru_clock | 时钟 | 秒 | LRU 时钟,每秒钟递增 | - | 用于 LRU 算法 |
2. CPU 使用率
| 指标名称 | 指标类型 | 单位 | 含义 | 正常范围 | 监控建议 |
|---|---|---|---|---|---|
used_cpu_sys | CPU | 秒 | 系统 CPU 时间 | - | 用于分析系统 CPU 开销 |
used_cpu_user | CPU | 秒 | 用户 CPU 时间 | - | 用于分析 Redis 进程 CPU 开销 |
used_cpu_sys_children | CPU | 秒 | 子进程系统 CPU 时间 | - | 主要用于 RDB 和 AOF 持久化 |
used_cpu_user_children | CPU | 秒 | 子进程用户 CPU 时间 | - | 主要用于 RDB 和 AOF 持久化 |
集群指标
1. 集群基本状态
| 指标名称 | 指标类型 | 单位 | 含义 | 正常范围 | 监控建议 |
|---|---|---|---|---|---|
cluster_enabled | 状态 | 布尔值 | 是否启用 Cluster 模式 | 1(启用) | 用于确认 Cluster 模式状态 |
cluster_state | 状态 | 字符串 | Cluster 状态(ok/fail) | ok | fail 表示 Cluster 不可用 |
cluster_slots_assigned | 状态 | 个 | 已分配的槽位数 | 16384 | 非 16384 表示槽位分配不完整 |
cluster_slots_ok | 状态 | 个 | 正常的槽位数 | 16384 | 非 16384 表示存在不可用槽位 |
cluster_slots_pfail | 状态 | 个 | 疑似故障的槽位数 | 0 | 非 0 表示存在疑似故障槽位 |
cluster_slots_fail | 状态 | 个 | 确认故障的槽位数 | 0 | 非 0 表示存在不可用槽位 |
cluster_known_nodes | 状态 | 个 | 已知的节点数 | 根据集群规模而定 | 与预期数量不符可能表示节点故障 |
cluster_size | 状态 | 个 | 集群主节点数 | 根据集群规模而定 | 与预期数量不符可能表示主节点故障 |
cluster_current_epoch | 状态 | 整数 | 当前 epoch | - | 用于 Cluster 故障转移 |
cluster_my_epoch | 状态 | 整数 | 本节点 epoch | - | 用于 Cluster 故障转移 |
cluster_stats_messages_sent | 累计 | 次 | 自启动以来发送的集群消息数 | - | 用于分析集群通信情况 |
cluster_stats_messages_received | 累计 | 次 | 自启动以来接收的集群消息数 | - | 用于分析集群通信情况 |
2. 节点状态
| 指标名称 | 指标类型 | 单位 | 含义 | 正常范围 | 监控建议 |
|---|---|---|---|---|---|
cluster_node_timeout | 配置 | 毫秒 | 节点超时时间 | 15000 | 用于 Cluster 故障检测 |
cluster_slave_validity_factor | 配置 | 倍数 | 从节点有效性因子 | 10 | 用于 Cluster 故障转移 |
cluster_migration_barrier | 配置 | 个 | 主节点最小从节点数 | 1 | 用于 Cluster 节点迁移 |
cluster_require_full_coverage | 配置 | 布尔值 | 是否要求槽位全覆盖 | 1 | 0 表示允许部分槽位不可用 |
cluster_allow_reads_when_down | 配置 | 布尔值 | Cluster 不可用时是否允许读操作 | 0 | 1 可能导致读取不一致数据 |
线程指标(Redis 6.0+)
1. IO 线程状态
| 指标名称 | 指标类型 | 单位 | 含义 | 正常范围 | 监控建议 |
|---|---|---|---|---|---|
io_threads | 配置 | 个 | IO 线程数量 | 1-CPU 核心数 | 根据 CPU 核心数调整,一般为核心数的一半 |
io_threads_do_reads | 配置 | 布尔值 | 是否在读取阶段使用 IO 线程 | 0 | 1 表示启用读取阶段多线程 |
io_threaded_reads_processed | 累计 | 次 | IO 线程处理的读取请求数 | - | 用于分析 IO 线程效率 |
io_threaded_writes_processed | 累计 | 次 | IO 线程处理的写入请求数 | - | 用于分析 IO 线程效率 |
指标获取方式
1. Redis 内置命令
INFO:获取 Redis 服务器信息,可指定 section(如INFO memory、INFO replication)INFO all:获取所有 Redis 服务器信息CONFIG GET:获取 Redis 配置参数slowlog get:获取慢查询日志CLIENT LIST:获取客户端连接列表CLUSTER INFO:获取 Cluster 信息CLUSTER NODES:获取 Cluster 节点信息
2. Redis Exporter
Redis Exporter 是 Prometheus 生态中的 Redis 监控指标采集工具,支持采集大部分 Redis 监控指标。
部署示例:
bash
docker run -d -p 9121:9121 redis/redis-exporter --redis.addr redis://localhost:63793. 监控平台集成
- Prometheus + Grafana:常用的监控组合,支持自定义仪表盘
- Datadog:提供 Redis 监控集成,支持自动发现和告警
- New Relic:提供 Redis 监控集成,支持分布式追踪
- Zabbix:支持 Redis 监控模板,可自定义监控项和告警规则
- Elasticsearch + Kibana:可用于监控 Redis 日志和指标
监控最佳实践
1. 指标选择
- 核心指标优先:重点监控对业务影响最大的指标,如 QPS、延迟、内存使用率、复制状态
- 分层监控:从不同维度监控 Redis,包括性能、内存、复制、持久化、客户端等
- 结合业务指标:将 Redis 监控指标与业务指标关联,更好地理解 Redis 对业务的影响
2. 告警设置
- 设置合理阈值:根据业务需求和历史数据设置告警阈值
- 分级告警:根据问题严重程度设置不同级别的告警(如警告、严重、紧急)
- 告警收敛:避免同一问题产生大量告警,设置告警抑制和分组
- 告警通知渠道:通过邮件、短信、即时通讯工具等多种渠道发送告警
3. 监控频率
- 实时监控:核心指标(如 QPS、延迟、内存使用率)建议每秒采集一次
- 定期监控:非核心指标(如持久化状态、命令统计)建议每分钟采集一次
- 趋势分析:长期存储监控数据,用于趋势分析和容量规划
4. 故障排查
- 关联分析:将不同指标关联分析,定位问题根因
- 日志分析:结合 Redis 日志进行故障排查
- 慢查询分析:定期分析慢查询日志,优化命令执行
- 性能分析:使用
redis-cli --latency、redis-cli --bigkeys等工具进行性能分析
常见问题(FAQ)
Q1: 如何选择需要监控的 Redis 指标?
A1: 选择监控指标需要考虑业务需求和 Redis 部署架构:
- 核心业务指标:QPS、延迟、内存使用率、复制状态
- 根据部署架构:
- 主从架构:重点监控复制状态、持久化状态
- Cluster 架构:重点监控集群状态、槽位状态
- 根据业务特点:
- 写入密集型:重点监控写入性能、持久化状态
- 读取密集型:重点监控读取性能、缓存命中率
Q2: 如何设置合理的告警阈值?
A2: 设置告警阈值的方法:
- 基于历史数据:分析历史数据,设置合理的阈值(如 95% 分位数)
- 基于业务需求:根据业务对 Redis 性能的要求设置阈值
- 分级设置:设置多级告警阈值(如警告 80%、严重 90%)
- 动态调整:根据业务变化和 Redis 负载变化动态调整阈值
Q3: 如何处理 Redis 监控数据?
A3: 处理 Redis 监控数据的方法:
- 实时监控:使用 Grafana 等工具进行实时监控和可视化
- 趋势分析:长期存储监控数据,用于趋势分析和容量规划
- 异常检测:使用机器学习算法进行异常检测,提前发现问题
- 告警通知:设置合理的告警规则,及时通知运维人员
Q4: 如何监控 Redis Cluster?
A4: 监控 Redis Cluster 的方法:
- 监控集群状态:
cluster_state、cluster_slots_ok、cluster_size - 监控节点状态:
cluster_known_nodes、节点健康状态 - 监控槽位状态:
cluster_slots_pfail、cluster_slots_fail - 监控集群通信:
cluster_stats_messages_sent、cluster_stats_messages_received - 使用 Cluster 专用监控工具:如 Redis Cluster Manager、Redis Insight
Q5: 如何监控 Redis 慢查询?
A5: 监控 Redis 慢查询的方法:
- 设置慢查询阈值:
slowlog_log_slower_than,一般设置为 10000 微秒 - 设置慢查询日志长度:
slowlog_max_len,一般设置为 128-1024 - 定期查看慢查询日志:使用
slowlog get命令或通过监控平台查看 - 分析慢查询原因:识别慢查询命令,优化数据结构或业务逻辑
- 设置慢查询告警:当慢查询数量超过阈值时触发告警
Q6: 如何监控 Redis 内存碎片?
A6: 监控 Redis 内存碎片的方法:
- 监控内存碎片率:
mem_fragmentation_ratio,理想范围 1.0-1.5 - 启用自动内存碎片整理:Redis 4.0+ 支持自动内存碎片整理
- 手动触发内存碎片整理:使用
MEMORY DEFRAG命令 - 定期重启 Redis:在维护窗口重启 Redis,彻底清理内存碎片
- 优化内存使用:减少频繁的键值对增删,使用合适的数据结构
