第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)为例,部署步骤如下:
- 下载二进制或使用容器镜像
# 使用 Docker 运行(推荐)
docker run -d --name redis_exporter \
-p 9121:9121 \
-e REDIS_ADDR=redis://127.0.0.1:6379 \
oliver006/redis_exporter:latest
- 验证指标端点
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
- 注册为 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
- 配置 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
部署检查清单:
- Exporter 是否以非 root 用户运行(建议 prometheus 用户)
- 防火墙仅放通监控服务器 IP 到 Exporter 端口
- Redis ACL / Memcached SASL 已配置只读权限
- Prometheus job 中
scrape_interval设为 10~30s,避免过度查询