Prometheus实战教程 - Redis 监控

Prometheus 监控 Redis

一、架构说明

Redis 监控架构核心由 Redis 实例redis_exporter(Redis 指标采集器)、Consul(服务发现)、Prometheus(指标存储与查询)、Grafana(可视化展示)五部分组成:

  1. redis_exporter 部署在 Redis 节点(或可访问 Redis 的节点),通过 Redis 协议采集指标并暴露 HTTP 接口(默认 9121 端口);
  2. Redis 服务注册到 Consul,实现服务自动发现;
  3. Prometheus 通过 Consul 服务发现机制,自动抓取所有 Redis 实例的 exporter 指标;
  4. Grafana 对接 Prometheus,通过预制面板可视化 Redis 指标,并配置告警规则。

二、前置条件

  1. 已部署 Redis(单机/集群/哨兵模式均可),且 Redis 实例可被 redis_exporter 访问;
  2. 已部署 Consul 集群(或单节点),且 Prometheus 可访问 Consul;
  3. 已部署 Prometheus 服务,且配置文件可修改、服务可重启;
  4. 已部署 Grafana 服务,且可访问 Prometheus 数据源;
  5. 服务器具备基础的 Linux 操作权限(如创建用户、配置系统服务、执行 wget/curl 等);
  6. Redis 若开启密码认证,需提前准备认证密码;若为集群模式,需确保集群节点互通。

三、步骤 1:部署 redis_exporter(Redis 指标采集)

3.1 下载并安装 redis_exporter

推荐下载稳定版(以 v1.50.0 为例,可根据实际需求替换版本号):

# 创建安装目录
mkdir -p /data/monitor
cd /data/monitor

# 下载二进制包(适配 Linux amd64 架构)
wget https://github.com/oliver006/redis_exporter/releases/download/v1.80.0/redis_exporter-v1.80.0.linux-amd64.tar.gz

# 解压并移动可执行文件
tar -zxvf redis_exporter-v1.80.0.linux-amd64.tar.gz
mv redis_exporter-v1.80.0.linux-amd64  redis_exporter

# 验证安装(输出版本信息则成功)
redis_exporter --version

3.2 配置 Redis 授权(供 exporter 连接)

场景 1:Redis 无密码(仅测试环境)

无需额外授权,确保 redis_exporter 所在节点可访问 Redis 的 6379 端口即可。

场景 2:Redis 有密码认证

若 Redis 开启密码,无需创建专用用户(Redis 无用户体系,仅密码认证),只需确保 exporter 能通过密码连接:

# 登录 Redis 验证密码有效性(示例)
redis-cli -h <Redis_IP> -p 6379 -a <Redis_Password> ping
# 输出 PONG 则密码有效
场景 3:Redis 集群/哨兵模式

需确保 exporter 能访问集群所有节点(或哨兵节点),密码需与集群统一认证密码一致。

3.3 系统服务方式启动 redis exporter

创建 systemd 服务文件,确保 exporter 开机自启:

vim /etc/systemd/system/redis_exporter.service

服务文件内容:

[Unit]
Description=Redis Exporter for Prometheus
After=network.target

[Service]
User=root
Group=root
Type=simple
# 指定配置文件启动
ExecStart=/data/monitor/redis_exporter/redis_exporter --redis.addr redis://127.0.0.1:30017 --redis.password "trRxHw8Ugd" --namespace redis
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

启动并设置开机自启:

# 重新加载 systemd 配置
systemctl daemon-reload

# 启动服务
systemctl start redis_exporter

# 设置开机自启
systemctl enable redis_exporter

# 验证状态(输出 active (running) 则成功)
systemctl status redis_exporter

# 验证指标暴露(访问 9121 端口,输出指标则成功)
curl http://[IP]:9121/metrics

在这里插入图片描述

四、步骤 2:Redis 服务注册到 Consul

方式 1:手动注册(通过 Consul HTTP API)

适用于临时测试或少量实例,通过 curl 调用 Consul API 注册:

# 注册 Redis 服务(替换以下参数)
curl http://192.168.37.40:8500/v1/agent/service/register -X PUT -i -H "Content-Type:application/json" -H "X-Consul-Token: f5cc7d96-ba0f-0501-4252-903e059514bb" -d '{
  "ID": "redis-192.168.37.21:30017",  
  "Name": "redis-exporter",
  "Tags": [
    "redis-exporter",
    "dev"
  ],
  "Address": "192.168.37.21",
  "Port": 9121,
  "EnableTagOverride": false,
  "Check": {
    "DeregisterCriticalServiceAfter": "90m",
    "HTTP": "http://192.168.37.21:9121/metrics",
    "Interval": "10s",
    "timeout": "2s"
  }
}'

验证服务注册结果

访问 Consul Web UI(http://<Consul_IP>:8500),在「Services」页面查看 redis 服务状态为「Passing」;或通过 API 验证:

curl http://<Consul_IP>:8500/v1/catalog/service/redis
# 输出包含 Redis 服务信息则注册成功

在这里插入图片描述

五、步骤 3:Prometheus 配置 Consul 服务发现

5.1 编辑 Prometheus 配置文件(prometheus.yml)

修改 Prometheus 主配置文件,添加 Consul 服务发现配置:

vim /etc/prometheus/prometheus.yml

scrape_configs 节点下添加 Redis 采集配置:

scrape_configs:
  # 原有配置(如 Prometheus 自身监控)保留
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

# 新增 Redis 采集配置(通过 Consul 发现)
  - job_name: "redis-exporter"
    consul_sd_configs:
      - server: "192.168.37.40:8500"  # Consul 地址
        token: f5cc7d96-ba0f-0501-4252-903e059514bb
        services: ["redis-exporter"]         # 匹配 Consul 中注册的服务名称
    relabel_configs:
      # 添加自定义标签,便于区分实例
      - source_labels: ["__meta_consul_service_id"]
        target_label: "redis_instance"

5.2 验证 Prometheus 配置并重启

# 验证配置文件语法(无报错则有效)
promtool check config /etc/prometheus/prometheus.yml

# 重启 Prometheus 服务
systemctl restart prometheus

# 验证服务状态
systemctl status prometheus

5.3 确认服务发现结果

访问 Prometheus Web UI(http://<Prometheus_IP>:9090):

  1. 进入「Status」→「Targets」页面;
  2. 找到 redis job,查看目标列表中是否包含 Redis 实例的 exporter 地址,且状态为「UP」。

在这里插入图片描述

六、步骤 4:可视化监控(Grafana)

6.1 导入 Redis 监控面板

  1. 登录 Grafana Web UI(默认 http://<Grafana_IP>:3000,账号密码 admin/admin);
  2. 进入「Dashboards」→「Import」;
  3. 输入官方推荐的 Redis 面板 ID:11835(Redis Dashboard for Prometheus),或 763(基础 Redis 监控);
  4. 选择已配置的 Prometheus 数据源,点击「Import」完成导入;
  5. 导入后即可看到 Redis 各项指标的可视化图表(如内存使用、连接数、命中率、命令执行量等)。

在这里插入图片描述

七、Redis 监控指标

八、告警

告警规则(Prometheus 配置)

在 Prometheus 配置目录创建 Redis 告警规则文件 redis_alerts.yml

groups:
- name: redis_alerts
  rules:
  # Redis-exporter 实例不可以
  - alert: RedisExporterDown  # 告警名称
    expr: |
      # 核心表达式:检测 Consul 发现的 Redis-exporter 实例状态为 DOWN
      up{job="redis-exporter"} == 0
      # 或备选表达式(不依赖 Consul,直接检测指标):
      # absent(redis_uptime_in_seconds)
    for: 30s  # 持续30秒DOWN才触发(避免抖动)
    labels:
      severity: critical  # 告警级别
      service: redis
    annotations:
      summary: "Redis-exporter 进程停止运行"
      description: "实例 {{ $labels.instance }} 的 Redis-exporter 已停止(持续30秒),请立即检查!"

  # Redis 实例不可用
  - alert: RedisDown
    expr: redis_up == 0
    for: 20s
    labels:
      severity: critical
    annotations:
      summary: "Redis 实例不可用 ({{ $labels.instance }})"
      description: "Redis 实例已下线超过 10 秒,请检查实例状态。"

  # 当前连接数超过最大连接数的80%
  - alert: RedisConnectionsHigh
    expr: |
      redis_connected_clients > (redis_max_clients * 0.8)
    for: 1m  # 持续1分钟触发,过滤瞬时峰值
    labels:
      severity: warning
      service: redis
      alert_type: connection_limit
    annotations:
      summary: "Redis连接数接近上限 ({{ $labels.instance }})"
      description: |
        "Redis实例 {{ $labels.instance }} 当前连接数 {{ $value | humanize }} 
        已超过最大连接数的80%"

  # 连接数5分钟内增长超过200%
  - alert: RedisConnectionsRapidGrowth
    expr: |
      # 核心逻辑:当前值 / 5分钟前的值 > 3(增长200%)
      redis_connected_clients / (redis_connected_clients offset 5m) > 3
      # 保护条件:排除当前连接数为0或5分钟前连接数为0的情况,避免除零错误
      and redis_connected_clients > 0
      and (redis_connected_clients offset 5m) > 0
    for: 2m  # 持续2分钟触发,过滤短期抖动
    labels:
      severity: critical
      service: redis
      alert_type: connection_growth
    annotations:
      summary: "Redis连接数5分钟内激增 ({{ $labels.instance }})"
      description: |
        "Redis实例 {{ $labels.instance }} 连接数5分钟内增长超过200%。"

  # 内存使用率高
  - alert: RedisMemoryUsageHigh  # 告警规则名称
    expr: |
      100 * (
        redis_memory_used_bytes 
        / 
        (redis_memory_max_bytes > 0)  # 排除max内存为0的情况,避免除零错误
      ) > 85  # 内存使用率阈值,可根据实际情况调整(建议85%-90%)
    for: 3m  # 持续5分钟超过阈值才触发告警,避免瞬时波动
    labels:
      severity: warning  # 告警级别(warning/critical)
      service: redis     # 服务标签,便于分类
      category: memory   # 告警类别
    annotations:
      summary: "Redis 内存使用率过高 [{{ $labels.instance }}]"  # 告警摘要
      description: |
        "Redis 实例 {{ $labels.instance }} 内存使用率超过 85% (当前值: {{ $value | humanize }})"


  # 5. 慢查询数增加
  - alert: RedisSlowQueriesIncreased
    expr: increase(redis_slowlog_length[5m]) > 0
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "Redis 慢查询数增加 ({{ $labels.instance }})"
      description: "过去 5 分钟内新增慢查询 {{ $value }} 条,请检查慢查询日志。"

prometheus.yml 中引入告警规则文件:

rule_files:
  - "redis_alerts.yml"
  # 其他告警规则文件...

重启 Prometheus 使告警规则生效。

压测和告警验证

  1. 压测工具:使用 redis-benchmark 模拟高并发访问,验证性能指标和告警:
# 模拟 100 并发,执行 10 万次 SET 命令
redis-benchmark -h <Redis_IP> -p 6379 -a <Redis_Password> -c 100 -n 100000 -d 1024
  1. 告警验证

告警通知实现 - 邮件 + 钉钉 + 自定义告警模板

总结

  1. Redis 监控核心是通过 redis_exporter 采集指标,结合 Consul 实现服务自动发现,Prometheus 存储指标,Grafana 可视化;
  2. 必监控指标包括可用性(redis_up)、内存使用率、缓存命中率、主从同步状态,需针对这些指标配置告警;
  3. 不同部署模式(单机/集群/哨兵)需关注差异化指标,集群需重点监控 redis_cluster_state,哨兵需关注监控的主节点数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值