redis_export使用

参考:redis_export官方下载源grafana-dashboards-redisredis-datasource

Redis Exporter 是 Prometheus 生态中核心的 Redis 监控工具,支持单机、主从、哨兵、Cluster 集群等多种部署模式,能采集连接数、内存使用率、命中率、键空间、集群状态等全量指标。

一、安装部署

1.1、环境准备

  1. 基础依赖:已部署 Prometheus(默认端口 9090,用于指标拉取存储)、Grafana(可选,默认端口 3000,用于可视化);
  2. Redis 环境:单机 / 集群实例可访问(开放默认端口 6379,集群需开放节点间通信端口);
  3. 网络连通性:
    • Redis Exporter 能访问目标 Redis 实例;
    • Prometheus 能访问 Redis Exporter(默认端口 9121)。

1.2、安装

  • 下载安装

    wget https://github.com/oliver006/redis_exporter/releases/download/v1.80.1/redis_exporter-v1.80.1.linux-amd64.tar.gz
    
    tar xf redis_exporter-v1.80.1.linux-amd64.tar.gz 
    mv redis_exporter-v1.80.1.linux-amd64 redis_exporter
    ls redis_exporter
    	LICENSE  README.md  redis_exporter
    
  • 核心启动参数说明

    参数 含义 默认值
    --redis.addr Redis 实例 / 集群入口地址 redis://localhost:6379
    --redis.password Redis 密码(如有)
    --web.listen-address Exporter 监听地址:端口 0.0.0.0:9121
    --redis.db 要监控的数据库(可指定多个) 0
    --cluster.enable 强制开启集群模式(v1.0+ 可自动识别) false
    --log.level 日志级别(info/warn/error) info
1.2.1、单机部署
  • 启动方式

    • 方式一: 二进制后台直接启动

      nohup /data/redis_exporter/redis_exporter \
        --redis.addr redis://192.168.1.10:6379 \
        --redis.password "Redis@123" \
        --web.listen-address 0.0.0.0:9121 \
        --redis.db 0 --redis.db 1 \  # 监控数据库 0 和 1
        --log.level info > /var/log/redis_exporter.log 2>&1 &
      
    • 方式二:systemctl <–推荐用这种

      cat > /etc/systemd/system/redis-exporter.service << EOF
      [Unit]
      Description=Redis Exporter for Prometheus
      After=network.target redis.service
      
      [Service]
      User=root
      Group=root
      ExecStart=/data/redis_exporter/redis_exporter \
        --redis.addr redis://服务器ip:6379 \
        --redis.password "密码" \
        --web.listen-address 0.0.0.0:9121
      Restart=always  # 异常自动重启
      RestartSec=5
      
      [Install]
      WantedBy=multi-user.target
      EOF
      
      • 启动并设置自启

        systemctl daemon-reload
        systemctl start redis-exporter
        systemctl enable redis-exporter
        systemctl status redis-exporter
        
    • 方式三: 容器启动

      docker run -d \
        --name redis-exporter-single \
        -p 9121:9121 \
        oliver006/redis_exporter:v1.65.0 \
        --redis.addr redis://192.168.1.10:6379 \
        --redis.password "Redis@123"
      
  • 验证是否正常

    [root@node1 prometheus]# curl -s http://10.4.50.164:9121/metrics | grep -E "redis_up|redis_db_keys"
    redis_db_keys{db="db0"} 28
    redis_db_keys{db="db1"} 0
    redis_up 1
    redis_uptime_in_seconds 791
    
  • Prometheus 配置采集

    scrape_configs:
      - job_name: "redis-single"
        static_configs:
          - targets: ["10.4.50.164:9121"]
            labels:
              app: "redisingle"
    
1.2.2、集群部署
  • redis集群安装

  • 地址准备

    服务器 IP 节点 1(端口) 节点 2(端口) 角色
    10.4.50.130 6379 6380 主 / 从
    10.4.50.137 6379 6380 主 / 从
    10.4.50.167 6379 6380 主 / 从
  • 启动

    # exporter安在10.4.50.130
    
    cat > /etc/systemd/system/redis-exporter-cluster.service << EOF
    [Unit]
    Description=Redis Exporter for Cluster
    After=network.target
    
    [Service]
    User=root
    Group=root
    ExecStart=/data/redis_exporter/redis_exporter \
      --redis.addr redis://集群内任意一台redis服务器地址:6379 \
      --redis.password "集群统一密码" \
      --web.listen-address 0.0.0.0:9121
    Restart=always
    RestartSec=5
    
    [Install]
    WantedBy=multi-user.target
    EOF
    
    • 服务启动

      systemctl daemon-reload
      systemctl start redis-exporter-cluster
      systemctl enable redis-exporter-cluster
      
  • 检查状态

    [root@node1 prometheus]# curl -s http://10.4.50.130:9121/metrics  | grep "redis_cluster_known_nodes"
    redis_cluster_known_nodes 6
    
  • prometheus.yml配置

    scrape_configs:
      - job_name: 'redis_exporter_targets'
        static_configs:
          - targets:
            - 10.4.50.130:9121
        metrics_path: /metrics
        relabel_configs:
          - source_labels: [__address__]
            target_label: __param_target
          - source_labels: [__param_target]
            target_label: instance
          - target_label: __address__
            replacement: 10.4.50.130:9121
    

1.3、Grafana 可视化

  • 安装redis-datasouce

    • 查看配置文件

      vim /data/grafana/conf/defaults.ini 
      plugins = data/plugins    <--  手动安装的插件放到这目录下 /data/grafanadata/plugins
      
    • 使用 grafana-cli 工具从命令行安装 Redis

      [root@node1 bin]# ./grafana-cli plugins install redis-datasource
      。。。。
      ✔ Downloaded and extracted redis-datasource v2.2.0 zip successfully to /var/lib/grafana/plugins/redis-datasource
      
      # 由grafana-cli安装是直接放到Yum安装对应的路径,给它挪到/data/grafanadata/plugins
      [root@node1 bin]# ls /var/lib/grafana/plugins/redis-datasource/
      CHANGELOG.md              module.js                      redis-datasource_darwin_arm64
      
    • 无网的话下载

      wget https://storage.googleapis.com/plugins-community/redis-datasource/release/2.2.0/redis-datasource-2.2.0.zip
      
      # 解压放到 /data/grafanadata/plugins 下面
      
  • 添加数据源

    • 单机

      请添加图片描述

    • 集群

      请添加图片描述

      单机 地址: redis://ip:port <-- 填一个就行
      集群 地址: redis://ip:port,redis://ip:port...  , 按tomcat redis集群配置那样有几个填几个
      示例: redis://10.4.50.130:6379,redis://10.4.50.139:6379,redis://10.4.50.167:6379,redis://10.4.50.130:6380,redis://10.4.50.139:6380,redis://10.4.50.167:6380
      
    • 仪表板 – 有三个,找到 redis overview,很详细,展示基本上ok

      请添加图片描述

二、常用核心指标

2.1、命中率指标

  • 指标

    指标名称 说明 适用场景
    redis_keyspace_hits_total 累计键命中次数,反映缓存有效访问频次 Redis 作为缓存(应用缓存、接口缓存)
    redis_keyspace_misses_total 累计键未命中次数,反映无效缓存查询频次 缓存场景(需控制无效查询)
  • 示例

    # 1. 缓存命中率(核心!示例:判断是否低于 90% 阈值)
    redis_keyspace_hits_total / (redis_keyspace_hits_total + redis_keyspace_misses_total) < 0.9
    
    # 2. 5分钟内键命中次数增长(示例:监控短期命中趋势,低于 100 次可能缓存未被使用)
    increase(redis_keyspace_hits_total[5m]) < 100
    
    # 3. 5分钟内键未命中次数增长(示例:监控无效查询激增,超过 50 次告警)
    increase(redis_keyspace_misses_total[5m]) > 50
    

2.2、内存指标

  • 指标

    指标名称 说明 适用场景
    redis_memory_used_bytes Redis 实际使用内存(含数据、缓冲区) 所有场景,核心内存监控项
    redis_memory_rss_bytes 操作系统为 Redis 分配的物理内存(含内存碎片) 排查内存碎片、物理内存占用问题
    redis_mem_fragmentation_ratio 内存碎片率(操作系统分配内存 / 实际使用内存) 所有场景,避免碎片导致性能下降
    redis_evicted_keys_total 达到 maxmemory 后被驱逐的键数 缓存场景(需关注驱逐频率)、非缓存场景(应禁止)
    redis_memory_max_bytes Redis 配置的最大可用内存 所有场景,判断内存是否充足
  • 示例

    # 方案 1:使用 redis_memory_max_bytes(Exporter 支持时)
    redis_memory_used_bytes / redis_memory_max_bytes * 100 > 90
    
    # 方案 2:使用自定义静态指标(推荐,稳定)
    redis_memory_used_bytes / redis_config_maxmemory_bytes * 100 > 90
    
    # 方案 3:固定阈值(10GB 示例,快速临时用)
    redis_memory_used_bytes / 10737418240 * 100 > 90
    
    # 实际使用内存(超过 8GB 告警)
    redis_memory_used_bytes > 8 * 1024 * 1024 * 1024
    
    # 内存碎片率异常(>1.5 或 <1 告警)
    redis_mem_fragmentation_ratio > 1.5 or redis_mem_fragmentation_ratio < 1
    
    # 1分钟内驱逐键数(超过 20 次告警,缓存场景)
    increase(redis_evicted_keys_total[1m]) > 20
    

2.3、连接与活动指标

  • 指标

    指标名称 说明 适用场景
    redis_connected_clients 当前连接的客户端数 所有场景,监控连接是否正常
    redis_config_maxclients Redis 允许的最大客户端连接数(Exporter 稳定暴露) 高并发场景,避免连接耗尽
    redis_rejected_connections_total 因连接数超限被拒绝的连接数 高并发场景,监控连接溢出
    redis_blocked_clients 因阻塞命令(BLPOP/BRPOP 等)被阻塞的客户端数 列表队列场景,避免消费阻塞
    redis_db_keys 某个数据库的键总数(按 db 标签区分) 所有场景,监控数据量增长
  • 示例

    # 1. 客户端连接数(示例:超过最大连接数的 80% 告警)
    redis_connected_clients > redis_config_maxclients * 0.8
    
    # 2. 客户端连接数(示例:低于 5 个,可能应用连接异常)
    redis_connected_clients < 5
    
    # 3. 1分钟内被拒绝的连接数(示例:出现被拒绝连接即告警)
    increase(redis_rejected_connections_total[1m]) > 0
    
    # 4. 被阻塞的客户端数(示例:超过 10 个,可能队列消费缓慢)
    redis_blocked_clients > 10
    
    # 全库总键数(求和计算)
    sum(redis_db_keys{instance="redis-single-6379"})  # 单机指定实例
    sum(redis_db_keys{redis_host="192.168.1.21"})    # 集群指定节点
    

2.4、持久化指标

  • 指标

    指标名称 说明 适用场景
    redis_rdb_last_save_timestamp_seconds 最后一次 RDB 持久化时间戳 启用 RDB 持久化的场景
    redis_aof_last_write_status AOF 最后一次写入状态(1 = 正常) 启用 AOF 持久化的场景
  • 示例

    # 1. RDB 备份缺失(示例:超过 24 小时未备份告警)
    time() - redis_rdb_last_save_timestamp_seconds > 24 * 60 * 60  # 24小时换算为秒
    
    # 2. AOF 写入失败(示例:AOF 写入状态异常即告警)
    redis_aof_last_write_status != 1
    

2.5、错误与异常指标

  • 指标

    指标名称 说明 适用场景
    redis_up Redis 实例连接状态(1 = 正常,0 = 下线) 所有场景,核心可用性指标
    redis_master_link_up 主从同步状态(1 = 正常,0 = 异常) 主从复制场景
  • 示例

    # 1. 实例下线(示例:实例连接失败即告警)
    redis_up == 0
    
    # 2. 主从同步失败(示例:主从同步状态异常即告警)  7.2.12没发现这个,先保留
    redis_master_link_up == 0
    

2.6、集群 / 主从专属指标

  • 指标

    指标名称 说明 适用场景
    redis_connected_slaves 主节点连接的从节点数 主从复制场景
    redis_cluster_nodes_total Cluster 集群总节点数 Redis Cluster 集群场景
    redis_cluster_slots_assigned 集群已分配槽位数量 Redis Cluster 集群场景
  • 示例

    # 1. 从节点数量异常(示例:主从集群预期 2 个从节点,实际不符则告警)
    redis_connected_slaves != 2
    
    # 2. 集群节点数量异常(示例:3主3从集群,总节点数不等于 6 则告警)  <-- 也没发现这个值
    redis_cluster_nodes_total != 6
    
    # 3. 集群槽位未全部分配(示例:槽位未分配满 16384 则告警)
    redis_cluster_slots_assigned != 16384
    

三、prometheus

  • /data/prometheus/conf/prometheus.yml

    rule_files:
       - "/data/prometheus/rules/redis_alter.yml"
    
    scrape_configs:
      - job_name: "redis-single"
        static_configs:
          - targets: ["10.4.50.164:9121"]
            labels:
              app: "redisingle"
      - job_name: 'redis-cluster'
        static_configs:
          - targets:
            - 10.4.50.130:9121
        metrics_path: /metrics
        relabel_configs:
          - source_labels: [__address__]
            target_label: __param_target
          - source_labels: [__param_target]
            target_label: instance
          - target_label: __address__
            replacement: 10.4.50.130:9121
    
  • 加好之后:

    [root@node1 prometheus]# ./promtool check config prometheus.yml 
    Checking /data/prometheus/rules/redis_alter.yml
      SUCCESS: 11 rules found
    
  • /data/prometheus/rules/redis_alter.yml

    /data/prometheus/rules/redis_alter.yml
    groups:
      - name: redis_alert
        rules:
          - alert: RedisDown
            expr: redis_up == 0
            for: 5m
            labels:
              severity: critical
            annotations:
              title: "Redis is down {{ $labels.instance }}"
              description: "Redis is down {{ $labels.instance }}"
          - alert: redis RDB备份未完成
            expr: time() - redis_rdb_last_save_timestamp_seconds > 24 * 60 * 60
            for: 5m
            labels:
              severity: critical
            annotations:
              summary: "Redis RDB 备份缺失"
              description: "已超过 24 小时未执行 RDB 备份,故障时可能丢失大量数据。建议:检查持久化配置、手动触发备份(BGSAVE)、排查备份失败原因。"
    
          - alert: redis AOF 写入失败
            expr: redis_aof_enabled == 1 and redis_aof_last_write_status != 1
            for: 5m
            labels:
              severity: critical
            annotations:
              summary: "Redis AOF 写入失败"
              description: "AOF 持久化已启用(redis_aof_enabled=1),1分钟内出现 {{ $value }} 次写入错误。数据安全性无法保障,建议:检查磁盘空间、文件权限、Redis 进程状态或 AOF 日志(appendonly.aof)。"
    
          - alert: "内存使用大于95%"
            expr: redis_memory_used_bytes / redis_total_system_memory_bytes * 100 > 95
            for: 5m
            labels:
              severity: WARN
            annotations:
              description: "Redis 当前节点 {{ $labels.instance }} 内存已使用 {{ $value }}%"
    
          - alert: "内存异常"
            expr: redis_mem_fragmentation_ratio < 1
            for: 5m
            labels:
              severity: WARN
            annotations:
              description: "Redis 当前节点 {{ $labels.instance }} redis内存可用内存不足,请减少key或增加内存"
    
          - alert: "内存异常"
            expr: redis_mem_fragmentation_ratio > 100
            for: 5m
            labels:
              severity: ERROR
            annotations:
              description: "Redis 当前节点 {{ $labels.instance }} 内存碎片过大, 当前: {{ $value}}, 处理"
    
          - alert: "redis连接被拒绝"
            expr: increase(redis_rejected_connections_total[1m]) > 10
            for: 5m
            labels:
              severity: WARN
              alert_type: "连接被拒绝"
            annotations:
              description: "redis 一些服务连接 {{ $labels.instance }} 被拒绝: 查看文档"
    
          - alert: "redis主节点缺失"
            expr: count(redis_instance_info{role="master"}) == 0
            for: 5m
            labels:
              severity: WARN
              alert_type: "redis主节点缺失"
              alert_host: "{{ reReplaceAll \":(.*)\" \"\" $labels.instance }}"
            annotations:
              summary: "{{ reReplaceAll \":(.*)\" \"\" $labels.instance }} redis主节点缺失"
              description: "{{ reReplaceAll \":(.*)\" \"\" $labels.instance }} 主节点丢失5分钟"
    
          - alert: "redis连接数过多"
            expr: redis_connected_clients{instance=~"redis://.*"} > redis_config_maxclients{instance=~"redis://.*"} * 0.95
            for: 5m
            labels:
              severity: ERROR
              alert_type: "连接数过多"
              alert_host: "{{ reReplaceAll \":(.*)\" \"\" $labels.instance }}"
            annotations:
              description: "主机: {{ $labels.instance }} 当前连接数: {{ $value }}, 连接总数达到总量的95%,请立即检查"
    
          - alert: "redis连接故障"
            expr: irate(redis_blocked_clients{job="redis_exporter_targets"}[5m]) > 3
            for: 5m
            labels:
              severity: WARN
              alert_host: "{{ reReplaceAll \":(.*)\" \"\" $labels.instance }}"
            annotations:
              description: "当前: {{ $labels.alert_host }} 5分钟内阻塞进程大于 3, 请检查连接服务是否异常"
    
          - alert: "redis低命中率效率低下"
            expr: redis_keyspace_hits_total / (redis_keyspace_hits_total + redis_keyspace_misses_total) > 0.95
            for: 5m
            labels:
              severity: ERROR
              alert_host: "{{ reReplaceAll \":(.*)\" \"\" $labels.instance }}"
            annotations:
              description: "当前: {{ $labels.alert_host }} 命中率低下原因: 数据到期和分配给Redis的内存不足,请及时检查内存、数据"
    
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐