搭建Redis缓存监控大盘之前,需要先回答一个基础问题:到底要监控哪些数据。如果只盯着内存使用率,等到缓存雪崩发生时才会发现命中率早就异常。一个可用的监控大盘至少覆盖命令统计、内存消耗、客户端连接、阻塞与延迟、过期与淘汰五个维度。

一、从业务视角拆解Redis监控指标
Redis自身提供的INFO命令包含丰富字段,但监控大盘不能将所有指标全部铺开。建议先关注与业务故障直接相关的指标。内存维度可以看used_memory、maxmemory以及内存碎片率mem_fragmentation_ratio。当碎片率长期大于1.5时,重启实例可能比优化配置更有效。命中率维度通过keyspace_hits和keyspace_misses计算,低于90%就需要关注是否存在大量穿透或缓存设计不合理。
连接与性能维度更偏向实时性。connected_clients可以反映客户端连接是否堆积,instantaneous_ops_per_sec用于观察命令执行峰值。延迟类指标不易直接从INFO获得,需要借助redis-cli的latency监控或者exporter采集的延迟分位数。最后是过期与淘汰,expired_keys和evicted_keys两个指标必须同时看,前者是正常过期,后者是被maxmemory策略强制删除,如果evicted_keys持续增长,说明内存配额已经吃紧。
- 内存使用量与碎片率
- 命中率与未命中次数
- 已连接客户端数与每秒命令数
- 阻塞客户端数
- 过期键数与淘汰键数
二、使用redis_exporter采集多实例数据
在生产环境中,单个Redis exporter进程通常可以同时采集多个Redis实例,不需要每个实例单独部署一个exporter。部署时可以直接下载二进制文件,也可以使用容器方式运行。exporter的启动参数中可以指定多个Redis地址,中间用逗号分隔,密码不一致时可以使用单独的密码文件。
下面是一个启动示例,假设本机有两个Redis实例,端口分别是6379和6380,密码相同:
redis_exporter \ -redis.addr=redis://127.0.0.1:6379,redis://127.0.0.1:6380 \ -redis.password=yourpassword \ -web.listen-address=:9121
启动后访问http://127.0.0.1:9121/metrics可以看到所有以redis_开头的指标。需要注意,旧版本redis_exporter对多实例的标签区分并不友好,建议使用新版本并开启-check-keys之类的参数进行健康检查。若实例地址中包含特殊字符,可改为redis://[user]:[password]@host:port的形式,避免密码明文出现在进程参数中。
三、用Prometheus抓取并计算核心指标
Prometheus通过静态配置或服务发现方式从exporter拉取数据。最简单的配置是在prometheus.yml中增加一个job,把exporter地址写入targets。如果exporter部署在业务机之外,还需要注意网络策略允许Prometheus访问9121端口。
scrape_configs:
- job_name: 'redis'
static_configs:
- targets: ['10.0.0.12:9121']
labels:
env: 'production'
scrape_interval: 15s
数据进入Prometheus后,可以用PromQL灵活计算比率和趋势。例如每秒命令执行量写作rate(redis_commands_processed_total[5m]),命中率写作100 * (redis_keyspace_hits_total / (redis_keyspace_hits_total + redis_keyspace_misses_total))。内存碎片率可直接使用redis_mem_fragmentation_ratio,它的值接近1表示内存分配连续,大于1.5则需要关注。
如果需要在多实例之间做聚合,可以使用sum by (instance) (...)或者avg by (env) (...)。但要注意,不要对命中率这类比率指标直接取平均值,应该先求和的分子分母再相除,否则会扭曲真实命中情况。延迟分位指标则需要关注Prometheus的histogram类型,通过histogram_quantile(0.99, rate(redis_latency_seconds_bucket[5m]))得到99分位延迟。
四、Grafana大盘布局与告警落地
Grafana负责将Prometheus中的指标组织成可视化面板。大盘一般按业务模块划分行,第一行放全局状态卡片,第二行放内存和命中率趋势图,第三行放连接数、命令速率和延迟分位图,底部可以放置慢查询或阻塞客户端等明细。为了减少重复配置,可以在Dashboard中定义变量,比如$instance,这样所有面板会自动根据下拉框切换实例。
面板类型的选择没有固定标准,但时间序列图适合看趋势,Stat卡片适合看当前值,Gauge适合看容量水位。内存使用率面板可以使用单值仪表盘,将used_memory / maxmemory * 100作为查询结果,同时把阈值颜色设置为70%和85%。命中率面板建议使用时间序列图,并与未命中数叠加展示,这样能直观看到命中率下降时未命中请求是否同步增加。
告警规则建议在Grafana中直接配置,便于与面板阈值联动。例如当内存使用率超过85%持续5分钟触发告警,当单个实例命中率低于80%持续10分钟触发告警。为了避免告警风暴,同一组实例可以只发一条汇总通知。还可以结合predict_linear函数预测内存增长趋势,提前一天发出容量预警。