8.6.1 监控指标与告警体系设计

监控指标与告警体系设计#

本节目标是落地 Redis 监控指标与告警体系,从“采集—可视化—告警—处置”形成闭环,并通过示例完成安装、配置、验证、排错与练习。

原理草图(监控与告警链路)

文章图片

关键监控指标清单(示例命令采集)

# 采集 Redis INFO 指标(示例)
redis-cli -h 127.0.0.1 -p 6379 INFO | egrep 'used_memory:|mem_fragmentation_ratio:|instantaneous_ops_per_sec:|connected_clients:|repl_backlog_size:|master_repl_offset:|aof_last_write_status:|rdb_last_bgsave_status:'

# 查看慢查询数量与详情
redis-cli SLOWLOG LEN
redis-cli SLOWLOG GET 5

# 查看 keyspace 情况(库内 key 数与过期)
redis-cli INFO keyspace

安装与采集示例:Prometheus + Redis Exporter

# 1) 下载并启动 Redis Exporter(示例以 systemd 方式)
# 假设 Redis 地址为 127.0.0.1:6379
useradd -r -s /sbin/nologin redis_exporter
wget -O /usr/local/bin/redis_exporter https://github.com/oliver006/redis_exporter/releases/download/v1.55.0/redis_exporter-v1.55.0.linux-amd64
chmod +x /usr/local/bin/redis_exporter

cat >/etc/systemd/system/redis_exporter.service <<'EOF'
[Unit]
Description=Redis Exporter
After=network.target

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

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable --now redis_exporter

# 2) Prometheus 添加抓取任务
cat >>/etc/prometheus/prometheus.yml <<'EOF'
  - job_name: 'redis'
    static_configs:
      - targets: ['127.0.0.1:9121']
        labels:
          instance: 'redis-01'
EOF

systemctl restart prometheus

# 3) 验证 Exporter 是否可用
curl -s http://127.0.0.1:9121/metrics | head -n 10

告警规则示例(Prometheus Rules)

# /etc/prometheus/rules/redis.yml
groups:
- name: redis.rules
  rules:
  - alert: RedisDown
    expr: up{job="redis"} == 0
    for: 1m
    labels:
      severity: P1
    annotations:
      summary: "Redis 实例不可用"
      description: "实例 {{ $labels.instance }} 无响应超过 1 分钟"

  - alert: RedisMemoryHigh
    expr: redis_memory_used_bytes / redis_memory_max_bytes > 0.9
    for: 5m
    labels:
      severity: P2
    annotations:
      summary: "Redis 内存使用率高"
      description: "{{ $labels.instance }} 内存使用超过 90%"

  - alert: RedisReplicationLag
    expr: redis_master_link_down_since_seconds > 0 or redis_connected_slaves == 0
    for: 2m
    labels:
      severity: P1
    annotations:
      summary: "Redis 复制异常"
      description: "{{ $labels.instance }} 主从断链或无从库"

告警阈值落地示例(基线+阈值)

# 参考基线(示例命令:统计 5 分钟 OPS 平均值)
# 实际可由 PromQL 计算
redis-cli INFO stats | grep instantaneous_ops_per_sec

# 结合阈值
# 命中率 < 90% 预警;< 80% 高告警
# 内存 > 80% 预警;> 90% 高告警

Grafana 看板关键面板(建议)
- 性能:OPS、响应时间分位(p95/p99)、慢查询数量
- 容量:used_memory、rss、碎片率、key 数
- 高可用:主从延迟、复制偏移、故障转移次数
- 业务:热点 key、淘汰次数、命中率趋势

排错示例

# 1) Exporter 无数据
systemctl status redis_exporter
curl -s http://127.0.0.1:9121/metrics | grep redis_up
# 预期:redis_up 1

# 2) Prometheus 抓取失败
# 查看 targets 状态
curl -s http://127.0.0.1:9090/api/v1/targets | jq '.data.activeTargets[] | {job:.labels.job, health:.health, lastError:.lastError}'
# 预期:health 为 "up"

# 3) 告警不触发
# 确认规则加载
curl -s http://127.0.0.1:9090/api/v1/rules | jq '.data.groups[].name'
# 预期包含 redis.rules

# 4) Redis 复制异常排查
redis-cli INFO replication
# 关注:role, connected_slaves, master_link_status, master_last_io_seconds_ago

处置流程示例(命令闭环)

# 告警:内存使用 > 90%,先确认内存占用
redis-cli INFO memory | egrep 'used_memory:|maxmemory:|mem_fragmentation_ratio:'

# 临时措施:开启 TTL 或调高淘汰策略(谨慎)
redis-cli CONFIG SET maxmemory-policy allkeys-lru

# 若为大 key,排查并清理
redis-cli --bigkeys

# 验证:内存下降
redis-cli INFO memory | egrep 'used_memory:'

练习
1. 安装 redis_exporter,并在 Prometheus 中看到 redis_up=1
2. 编写一条告警规则:当 mem_fragmentation_ratio > 2.0 持续 3 分钟触发 P2。
3. 人为制造慢查询(如执行 DEBUG SLEEP 2),验证慢查询告警策略与 Grafana 变化。
4. 模拟主从断链(关闭从库),观察 connected_slaves 与告警触发情况。
5. 通过 redis-cli --bigkeys 找出最大 key,并设计对应的告警阈值。

命令解释要点
- redis-cli INFO:获取运行时指标,适合做指标采样与排查。
- SLOWLOG:查看慢命令,为延迟告警提供依据。
- redis_exporter:将 Redis 指标转换为 Prometheus 可抓取的格式。
- prometheus.yml:定义抓取目标与标签,影响后续分组与责任归属。
- rules/*.yml:告警规则逻辑,决定触发与分级。