4. Redis监控指标体系与异常检测

Redis 的故障很少以“进程崩溃”这种直白方式出现,更多时候表现为延迟升高、内存膨胀、主从延迟扩大、持久化阻塞或集群槽位失衡。要在这类“半故障”状态下快速定位,必须建立一套分层的指标体系,并让告警之间形成关联,而不是孤立地看某一个数字。本节把 Redis 监控拆成五类指标——性能、内存、持久化、复制、集群,并给出阈值设定思路与告警关联分析方法。

一、性能指标:先看延迟,再看吞吐

性能指标的核心是延迟与吞吐。延迟方面,redis-cli --latency 给出的是客户端视角的往返延迟,而 INFO latencystats(Redis 7.0+)提供命令级延迟直方图,能区分是整体慢还是某类命令慢。吞吐方面,instantaneous_ops_per_sec 反映当前 QPS,total_commands_processed 的增量则用于计算趋势。

阈值设定不能只看绝对值。经验上,P99 延迟超过 1ms 就应关注,超过 5ms 需告警;但若业务本身是批量写入,基线可能本就偏高。更稳妥的做法是“基线 + 偏离”:以近 7 天同时段 P99 为基线,偏离 3 倍触发告警。此外,rejected_connections 持续增长说明连接数触顶,blocked_clients 大于 0 说明有客户端在阻塞命令(如 BLPOP)上等待,这两项应设为“非零即告警”。

二、内存指标:used_memory 与碎片率要一起看

内存是 Redis 最敏感的维度。used_memory 是分配器实际分配量,used_memory_rss 是操作系统看到的常驻内存,两者差值反映碎片。mem_fragmentation_ratio = used_memory_rss / used_memory,正常在 1.0~1.5 之间;大于 1.5 说明碎片严重,小于 1 说明发生了 swap,后者更危险。

阈值建议:used_memory 达到 maxmemory 的 80% 预警、90% 严重告警;碎片率大于 1.5 预警,大于 2.0 建议执行 activedefrag yes 或安排重启。evicted_keys 一旦非零,说明已触发淘汰策略,必须结合业务判断是否可接受——若 key 不应被淘汰,则说明容量规划失败。mem_fragmentation_ratio < 1 时,应立刻检查 /proc/<pid>/smaps 或系统 swap 使用量。

三、持久化指标:RDB 与 AOF 的阻塞信号

持久化指标关注“是否阻塞主线程”。RDB 方面,rdb_last_bgsave_status 必须为 ok,rdb_last_bgsave_time_sec 突然增大说明数据量或磁盘变慢,rdb_changes_since_last_save 过大则意味着故障时丢失窗口大。AOF 方面,aof_last_bgrewrite_status 与 aof_last_write_status 必须为 ok;aof_rewrite_in_progress 长期为 1 说明重写卡住;aof_delayed_fsync 大于 0 表示 fsync 被延迟,通常由磁盘 IO 饱和引起。

阈值上,rdb_last_bgsave_time_sec 超过 60 秒应告警;aof_delayed_fsync 非零即告警;latest_fork_usec 超过 100ms 说明 fork 阻塞明显,需关注内存页表大小。这些指标往往与内存指标联动:内存越大,fork 越慢,持久化阻塞越严重。

四、复制指标:offset 差值是核心

复制健康度看三个量:master_repl_offset、slave_repl_offset(从库视角为 master_repl_offset)以及 master_link_status。master_link_status 必须为 up;master_link_down_since_seconds 大于 0 即告警。延迟用 master_repl_offset - slave_repl_offset 衡量,通常应小于 1MB,超过 10MB 需告警。

另一个关键指标是 repl_backlog_active 与 repl_backlog_size。若从库断连时间超过 backlog 覆盖范围,会触发全量同步,表现为 sync_full 增长。因此 sync_full 与 sync_partial_ok 的比值应长期稳定,全量同步频繁说明 backlog 过小或网络抖动。

五、集群指标:槽位、节点与迁移状态

集群模式额外关注:cluster_state 必须为 ok;cluster_slots_assigned 应为 16384;cluster_known_nodes 与预期节点数一致;cluster_slots_pfail、cluster_slots_fail 非零说明有槽位不可用。迁移过程中 migrating、importing 状态应短暂出现,长期存在说明迁移卡住。

六、告警关联分析:从单点告警到故障链

孤立告警容易误判。例如“内存使用率 90%”本身可能只是正常增长,但如果同时出现 evicted_keys 上升、latency P99 升高、blocked_clients 增加,就构成一条清晰的故障链:内存压力 → 淘汰 → 延迟升高 → 客户端阻塞。下图给出五类指标之间的关联路径与典型告警组合。

Redis 五类指标关联与告警链 指标 → 异常信号 → 关联告警组合 性能指标 P99 延迟 / QPS blocked_clients rejected_connections 内存指标 used_memory / maxmemory 碎片率 / evicted_keys swap 风险 持久化指标 bgsave 状态 / 耗时 aof_delayed_fsync latest_fork_usec 复制指标 link_status / offset 差 backlog / sync_full 全量同步频率 集群指标 cluster_state slots_fail / 迁移状态 known_nodes 告警关联分析区 故障链 A:内存压力型 used_memory↑ → evicted_keys↑ → P99↑ → blocked_clients↑ 故障链 B:持久化阻塞型 内存大 → fork 慢 → bgsave 超时 → 主线程卡顿 故障链 C:复制延迟型 网络抖动 → offset 差↑ → backlog 溢出 → sync_full↑ 故障链 D:集群失衡型 节点宕机 → slots_fail↑ → cluster_state≠ok → 请求失败 关联告警输出 内存+淘汰+延迟 → 扩容/调淘汰策略 复制+backlog → 调大 backlog

关联分析的价值在于把“多个孤立告警”压缩成“一条可解释的故障链”。例如当 used_memory 超过 80%、evicted_keys 持续增长、P99 延迟同步上升时,应优先怀疑内存不足导致的淘汰与延迟,而不是先去查网络。反之,若 master_link_status 为 down、sync_full 激增、repl_backlog_size 偏小,则应先调整 backlog 与网络,而非扩容内存。

阈值不是固定值。建议先用 redis-cli --latency-history 与 INFO all 采集 7 天基线,再按“基线 × 偏离系数”设定告警,避免业务高峰期误报。
当 mem_fragmentation_ratio < 1 时,说明 Redis 内存被换出到 swap,延迟会急剧恶化,必须立即检查系统 swap 与 maxmemory 配置,这比碎片率偏高更紧急。

最后,指标采集频率要与故障恢复目标匹配:核心指标(延迟、内存、复制状态)建议 10~15 秒一次,持久化与集群状态可 30 秒一次。所有指标应带实例标签与时间戳,便于在告警触发时回溯同一时间窗口内的其他指标,从而完成从“单点告警”到“故障链定位”的闭环。