redis集群慢响应监控不能只看slowlog,因其仅记录已发生的慢命令、默认仅存128条、无客户端ip及耗时分布,无法支撑毫秒级主动告警。

Redis集群慢响应监控为什么不能只看 slowlog?
因为 slowlog 只记录已发生的慢命令,且默认只存 128 条、不带客户端 IP 和耗时分布统计,无法支撑毫秒级主动告警。真实生产中,你更需要的是:某节点 latency_ms 连续 3 次 >50ms,或某 slot 迁移延迟突增这类可量化、可聚合、可下钻的指标。
Redis-exporter 的 redis_exporter 启动参数关键项
直接用默认配置跑 redis_exporter 会漏掉集群核心指标——它默认只连单实例,不自动发现集群拓扑。必须显式启用集群模式并控制采集粒度:
- 加
--redis.cluster.enabled=true,否则redis_cluster_up始终为 0,所有集群维度指标(如redis_cluster_stats_keys_per_slot)全为空 - 设
--redis.password=xxx或--redis.file=/path/to/auth.conf,集群中任意节点密码不一致会导致部分节点采集失败,报错ERR invalid password - 调低
--web.telemetry-path="/metrics"并配合反向代理做鉴权,避免暴露/metrics接口 - 禁用冗余指标:加
--skip-metrics=redis_memory_used_human,redis_connected_clients(这些字符串型指标拉取慢、存储膨胀快)
Prometheus 中如何写毫秒级慢响应告警规则
别直接用 redis_cmdstat_*_calls 除以 redis_cmdstat_*_usec 算平均延迟——这是累计值,瞬时抖动会被平滑掉。正确做法是盯住直方图分位数和瞬时延迟采集点:
- 用
histogram_quantile(0.99, sum(rate(redis_cmdstat_get_bucket[1m])) by (le)) > 100抓 P99 GET 命令超 100ms - 对集群整体延迟敏感场景,用
max(redis_instance_info{job="redis-cluster"}) by (instance) * on(instance) group_left() avg_over_time(redis_latency_ms[30s]) > 80—— 先通过redis_instance_info确保只查真实存活节点,再叠加 30 秒窗口延迟均值,避免毛刺误报 - 注意
redis_latency_ms是 exporter 主动执行INFO latency得到的,若 Redis 配置了latency-monitor-threshold 0,该指标恒为 0
Grafana 面板里怎么定位慢响应源头
光看「集群平均延迟」没意义。必须拆到节点 + 命令 + 时间窗口三级下钻:
- 第一层用变量
$instance过滤具体节点,确认是单点异常还是扩散性问题 - 第二层查
rate(redis_cmdstat_set_usec[5m]) / rate(redis_cmdstat_set_calls[5m]),对比set和hset的实际耗时,常发现序列化大 hash 导致hset毛刺远高于set - 第三层打开
redis_slowlog_length面板,结合redis_slowlog_last_id查最近慢日志 ID,再用redis-cli -h $host SLOWLOG GET 10手动捞原始命令——exporter 不上报慢日志内容,这步必须人工补位
真正难的不是采集,是区分「Redis 自身阻塞」(如 bgsave fork 耗时)和「客户端驱动层堆积」(如 Jedis 连接池满导致请求排队)。这两类在指标上都表现为延迟升高,但处置路径完全不同。











