第2章 监控工具选型与部署

缓存命中率监控的第一步是选择正确的工具。不同的缓存系统提供了原生命令或接口用于获取运行时状态,而针对大规模集群场景则需要统一的指标采集层(如 Prometheus Exporter)。本章对三组常用工具进行对比,并给出部署流程与权限配置的最佳实践。

2.1 常用工具对比

下表从数据获取方式、核心指标、适用场景、部署复杂度四个维度对比 Redis INFO、Memcached stats 和 Prometheus Exporter。

对比维度 Redis INFO Memcached stats Prometheus Exporter
获取方式 通过 INFO 命令获取文本输出 通过 stats 命令获取文本输出 HTTP 端点暴露 Prometheus 格式指标
核心命中率指标 keyspace_hits、keyspace_misses get_hits、get_misses 对应 Exporter 转换后的 *hits_total、*misses_total
适用场景 单机/哨兵/集群调试、Ad-hoc 查询 单机 Memcached 实例监控 大规模集群、长期存储、告警集成
部署复杂度 内置,无需额外组件 内置,无需额外组件 需部署 Exporter 进程;可搭配 Prometheus + Grafana
优缺点 轻量、实时;不适合历史趋势分析 简单;无持久化、无聚合 标准化、可扩展;额外资源消耗
选型建议: 开发/测试环境可使用原生命令快速验证;生产环境推荐 Prometheus Exporter 统一采集,以便在 Grafana 中绘制历史命中率曲线。

2.2 部署流程

2.2.1 Redis INFO 命令使用

Redis 自带的 INFO 命令无需安装额外组件,通过 redis-cli 直接执行即可。

# 连接到 Redis 并获取所有统计信息
redis-cli -h 127.0.0.1 -p 6379 INFO

# 只查看 Keyspace 部分(包含命中/未命中)
redis-cli INFO keyspace

# 输出示例
# Keyspace
db0:keys=1254,expires=89,avg_ttl=3600000

# 命中率相关字段在 Stats 部分
redis-cli INFO stats
# Stats
# total_connections_received:1500
# total_commands_processed:45000
# keyspace_hits:12000
# keyspace_misses:800
# ...

若需定时采集,可编写 Shell 脚本结合 cron 或 systemd timer 执行。

2.2.2 Memcached stats 命令使用

通过 telnet 或 nc 发送 stats 命令获取统计信息。

# 直连 Memcached 并获取 stats
echo -e "stats\nquit" | nc 127.0.0.1 11211

# 输出示例
# STAT pid 1234
# STAT uptime 86400
# STAT get_hits 50000
# STAT get_misses 2000
# STAT cmd_get 52000
# STAT cmd_set 10000
# ...

建议使用 memcached-tool 或自定义 Python 脚本解析输出并写入时序数据库。

2.2.3 Prometheus Exporter 部署

以 Redis Exporter(oliver006/redis_exporter)为例,部署步骤如下:

  1. 下载二进制或使用容器镜像
# 使用 Docker 运行(推荐)
docker run -d --name redis_exporter \
  -p 9121:9121 \
  -e REDIS_ADDR=redis://127.0.0.1:6379 \
  oliver006/redis_exporter:latest
  1. 验证指标端点
curl http://127.0.0.1:9121/metrics | grep -E "redis_keyspace_hits|redis_keyspace_misses"

# 输出示例
# redis_keyspace_hits_total 12000
# redis_keyspace_misses_total 800
  1. 注册为 systemd 服务(二进制部署)
[Unit]
Description=Redis Exporter
After=network.target

[Service]
ExecStart=/usr/local/bin/redis_exporter \
  --redis.addr redis://127.0.0.1:6379 \
  --web.listen-address :9121
Restart=always
User=prometheus

[Install]
WantedBy=multi-user.target
  1. 配置 Prometheus 抓取 在 prometheus.yml 中添加 job:
scrape_configs:
  - job_name: 'redis'
    static_configs:
      - targets: ['192.168.1.10:9121']
注意: Memcached Exporter 类似(prometheus/memcached_exporter),默认监听端口 9150。请确保 Exporter 与 Prometheus 网络互通,且端口未被防火墙拦截。

2.3 权限配置

监控工具应遵循最小权限原则,避免因暴露管理接口导致安全风险。

2.3.1 Redis 权限

  • 创建只读用户:
# 在 redis.conf 或通过 ACL SETUSER 创建
ACL SETUSER monitor on >your_secure_password +@read +info ~*

Exporter 连接时使用该用户:

--redis.password your_secure_password
  • 绑定内网地址,设置 bind 127.0.0.1 或内网 IP。
  • 启用 TLS:tls-port 6379,Exporter 使用 --redis.tls 参数。

2.3.2 Memcached 权限

  • SASL 认证(需编译时启用 --enable-sasl):
# 启动时指定
memcached -S -u memcache

# 客户端需提供用户名密码(Exporter 支持 SASL 参数)
  • 通过防火墙限制 11211 端口仅允许监控服务器访问。

2.3.3 Prometheus Exporter 安全

  • Exporter 本身不提供认证,建议通过反向代理(如 Nginx)添加 Basic Auth 或使用 Prometheus 的 scrape_config 中的 basic_auth。
  • 监听回环地址或内网地址,避免暴露到公网。
# 修改 Exporter 监听地址
--web.listen-address 127.0.0.1:9121
监控工具部署架构图 Redis / Memcached 缓存服务实例 INFO / stats 原生命令采集 Prometheus Exporter redis_exporter/memcached_exporter Prometheus Server scrape /metrics 脚本推送 / Pushgateway Grafana 可视化 & 告警 生产选型: Exporter + Prometheus
部署检查清单:
  • Exporter 是否以非 root 用户运行(建议 prometheus 用户)
  • 防火墙仅放通监控服务器 IP 到 Exporter 端口
  • Redis ACL / Memcached SASL 已配置只读权限
  • Prometheus job 中 scrape_interval 设为 10~30s,避免过度查询