缓存命中率监控与优化指南 - 第3节
3.1 监控栈架构概述
一个完整的 Prometheus + Grafana 监控栈由四个层级组成:指标暴露层、采集存储层、查询计算层和可视化展示层。对于缓存监控场景,各层级职责如下:
| 层级 | 组件 | 职责 |
|---|---|---|
| 指标暴露 | Exporter(如 redis_exporter, memcached_exporter) | 连接被监控服务,抓取内部统计信息,转换为 Prometheus 格式的 HTTP 端点 |
| 采集存储 | Prometheus Server | 定期 Pull Exporter 的 /metrics 端点,存储时序数据并支持 PromQL 查询 |
| 查询计算 | PromQL + Recording Rules | 基于原始指标计算命中率、QPS、错误率等派生指标 |
| 可视化展示 | Grafana + DataSource | 连接 Prometheus 数据源,创建实时仪表盘,展示命中率趋势、热点 Key 分布、缓存容量水位 |
关键原则:Exporter 只负责指标格式转化,不负责计算;命中率等高阶指标应通过 PromQL 在 Prometheus 或 Grafana 层完成,避免在 Exporter 侧做聚合运算。
3.2 Exporter 安装与验证
3.2.1 安装 redis_exporter
# 1. 从 GitHub 下载二进制
wget https://github.com/oliver006/redis_exporter/releases/download/v1.55.0/redis_exporter-v1.55.0.linux-amd64.tar.gz
tar xzf redis_exporter-v1.55.0.linux-amd64.tar.gz
sudo mv redis_exporter /usr/local/bin/
# 2. 创建系统用户(安全隔离)
sudo useradd --no-create-home --shell /bin/false redis_exporter
# 3. 创建 Systemd 服务(指定 Redis 地址)
sudo tee /etc/systemd/system/redis_exporter.service <<'EOF'
[Unit]
Description=Redis Exporter for Prometheus
After=network.target
[Service]
User=redis_exporter
Group=redis_exporter
Type=simple
ExecStart=/usr/local/bin/redis_exporter \
--redis.addr=redis://127.0.0.1:6379 \
--web.listen-address=0.0.0.0:9121
[Install]
WantedBy=multi-user.target
EOF
# 4. 启动并验证
sudo systemctl daemon-reload
sudo systemctl enable --now redis_exporter
sudo systemctl status redis_exporter
⚠️ 安全注意:--web.listen-address 不要暴露到公网,建议绑定 127.0.0.1 或使用防火墙限制;--redis.addr 若需要认证,增加 --redis.password 参数,密码从文件读取更安全。
3.2.2 验证指标端点
# 抓取 /metrics 测试是否正常返回
curl -s http://127.0.0.1:9121/metrics | head -20
# 期待输出示例(包含 Redis 专属指标)
# HELP redis_uptime_in_seconds Uptime in seconds
# TYPE redis_uptime_in_seconds gauge
redis_uptime_in_seconds 62738
# HELP redis_memory_used_bytes Memory used by Redis
# TYPE redis_memory_used_bytes gauge
redis_memory_used_bytes 1.25e+08
# HELP redis_keyspace_hits_total Total number of key hits
# TYPE redis_keyspace_hits_total counter
redis_keyspace_hits_total 8942134
# HELP redis_keyspace_misses_total Total number of key misses
# TYPE redis_keyspace_misses_total counter
redis_keyspace_misses_total 123540
若 curl 无返回或返回 404,检查进程是否监听、端口是否被占用、防火墙策略。
3.3 Prometheus 指标采集配置
3.3.1 添加 Job 到 prometheus.yml
# 在 scrape_configs 下追加
scrape_configs:
- job_name: 'redis_cache'
static_configs:
- targets: ['127.0.0.1:9121']
scrape_interval: 15s # 缓存场景建议 10~30s
scrape_timeout: 10s
metrics_path: /metrics
# 可选标签:标识缓存实例
relabel_configs:
- source_labels: [__address__]
target_label: instance
replacement: 'cache-node-01'
| 参数 | 推荐值 | 说明 |
|---|---|---|
| scrape_interval | 10s ~ 30s | 缓存指标变化快,间隔太大会丢失峰值;间隔太小会增加 Prometheus 和 Exporter 负载 |
| scrape_timeout | 小于 scrape_interval | 超时应留余量,一般为 interval 的 2/3 |
| relabel_configs | 固定实例名 | 使 Grafana 标签清洁,避免 IP 地址暴露 |
3.3.2 检查采集是否成功
# 使用 promtool 验证配置
promtool check config prometheus.yml
# 在 Prometheus Web UI 的 Status → Targets 查看
# 期待 redis_cache job 的 State 为 "UP"
常见错误:若 Targets 显示 “DOWN”,执行 journalctl -u prometheus -n 50 排查网络连接或配置语法错误;检查 Exporter 的 /metrics 是否能被 Prometheus 所在主机 curl 通。
3.4 Grafana 仪表盘设计
3.4.1 添加 Prometheus 数据源
Grafana UI 路径: Configuration → Data Sources → Add data source → Prometheus
设置:
Name: Prometheus-Cache
URL: http://localhost:9090
Access: Server (默认)
Scrape interval: 15s # 与 Prometheus 一致
Timeout: 10s
点击 "Save & Test" 验证连接
3.4.2 创建缓存命中率仪表盘
| 面板 | PromQL 查询 | 可视化类型 | 用途 |
|---|---|---|---|
| 全局命中率 | sum(rate(redis_keyspace_hits_total[5m])) / (sum(rate(redis_keyspace_hits_total[5m])) + sum(rate(redis_keyspace_misses_total[5m]))) * 100 | Gauge + 时间序列 | 实时命中率百分比 |
| GET 请求速率 | rate(redis_commands_processed_total{cmd="get"}[1m]) | Bar Gauge | QPS 监控 |
| 内存占比 | redis_memory_used_bytes / redis_memory_max_bytes * 100 | Gauge | 缓存水位预警 |
| 过期/淘汰键 | rate(redis_expired_keys_total[1m]) 和 rate(redis_evicted_keys_total[1m]) | Time Series | 内存压力指标 |
3.4.3 面板变量与模板
在 Dashboard Settings 中定义变量 $instance,数据源 Query 使用 label_values(redis_instance_info, instance)。然后在每个面板的 PromQL 中引用:
# 使用模板变量切换实例
sum(rate(redis_keyspace_hits_total{instance="$instance"}[5m])) /
(sum(rate(redis_keyspace_hits_total{instance="$instance"}[5m])) +
sum(rate(redis_keyspace_misses_total{instance="$instance"}[5m]))) * 100
设计建议:命中率面板建议设置“阈值”:95% 以上为绿色(健康),90%~95% 为黄色(关注),低于 90% 为红色(告警);Grafana 的 Alert 功能可以配合每面板阈值触发通知。
3.5 常见错误与调试
| 现象 | 原因 | 解决 |
|---|---|---|
| Exporter 进程退出 | Redis 认证失败或连接超时 | 检查 --redis.password 是否正确,或使用 AUTH 测试 redis-cli |
| /metrics 输出空 | 版本过低或编译时未启用 metrics | 重新下载最新版,运行 redis_exporter --version 确认版本 |
| Grafana 面板无数据 | 时间范围太大 / 数据源 scrape_interval 不匹配 / PromQL 有语法错误 | 用 Prometheus Graph 页面单独执行 PromQL,缩小时间范围到 15m |
| 命中率异常跳变 | 窗口过小(如 1m)且请求量低 | 增加 rate 窗口到 5m 或 10m;使用 avg_over_time 平滑 |
3.6 性能与稳定性优化
- Exporter 端:限制
--web.max-connections=10防止 Prometheus 扫爆连接;使用--collector.hotkeys时注意对 Redis CPU 影响。 - Prometheus 端:scrape_interval 不要低于 5s;为高基数标签(如
cmd标签)开启metric_relabel_configs丢弃冗余标签。 - Grafana 端:避免大量“每查询”函数;对高频查询面板开启
cache插件;使用 Dashboard JSON Model 版本管理。 - 磁盘与内存:Prometheus 的 TSDB 建议保留 7~15 天;SSD 存储;配置
--storage.tsdb.retention.time和--storage.tsdb.retention.size双限制。
生产部署检查清单:使用非 root 运行 Exporter / 开启 Prometheus 的 --web.external-url 反向代理 / Grafana 启用 LDAP 或 OAuth / 所有组件通过 systemd 管理并加入监控告警。