扩展2-redis_exporter使用
·
redis_export使用
参考:redis_export官方下载源,grafana-dashboards-redis,redis-datasource
Redis Exporter 是 Prometheus 生态中核心的 Redis 监控工具,支持单机、主从、哨兵、Cluster 集群等多种部署模式,能采集连接数、内存使用率、命中率、键空间、集群状态等全量指标。
一、安装部署
1.1、环境准备
- 基础依赖:已部署 Prometheus(默认端口 9090,用于指标拉取存储)、Grafana(可选,默认端口 3000,用于可视化);
- Redis 环境:单机 / 集群实例可访问(开放默认端口 6379,集群需开放节点间通信端口);
- 网络连通性:
- 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.addrRedis 实例 / 集群入口地址 redis://localhost:6379--redis.passwordRedis 密码(如有) 无 --web.listen-addressExporter 监听地址:端口 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、集群部署
-
地址准备
服务器 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.ymlrule_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的内存不足,请及时检查内存、数据"
更多推荐



所有评论(0)