redis_exporter + Prometheus监控Redis: 指标采集、告警与远程抓取

前言

Redis承担缓存、分布式锁或限流等任务后,服务进程仍在运行,并不代表实例状态完全正常。内存持续增长、连接数接近上限、缓存命中率下降或主从同步异常,都可能在业务明显报错前逐渐出现。

redis_exporter可以读取Redis的运行信息,并将内存、连接、命令、持久化和网络等数据转换为Prometheus能够抓取的指标。Prometheus再按照固定周期保存这些数据,并通过PromQL和告警规则判断异常状态。

本文将部署redis_exporter并验证/metrics端点,随后安装Prometheus,配置指标抓取任务,再添加Redis宕机、内存使用率、连接数和复制状态等基础规则。

如果Prometheus与Redis不在同一个局域网,后续还会使用cpolar为redis_exporter的9121端口建立远程抓取入口。公开指标端点前,需要先确认抓取协议、任务标签和访问范围,避免监控数据被无关人员读取。

1.redis_exporter介绍

1.1 什么是redis_exporter?

redis_exporter 是一款开源、轻量、专为Redis设计的Prometheus指标采集导出工具,也是Prometheus生态中监控Redis的标准专属采集组件。

简单来说:Redis本身不支持Prometheus时序指标输出,redis_exporter就是中间翻译、采集、转发的适配器

它独立部署、无侵入、无需修改Redis源码和配置,兼容Redis单机、哨兵、集群、云托管Redis等几乎所有部署形态。

1.2 redis_exporter可以做什么

1.全维度采集Redis运行指标

持续抓取Redis实例的核心运行数据,覆盖运维排查、性能分析所需的全部维度:

  • 资源指标:内存使用、内存碎片率、最大内存限制、内存溢出情况
  • 连接指标:客户端连接数、阻塞连接、拒绝连接、空闲连接
  • 数据指标:Key总数、过期Key、删除Key、缓存命中率
  • 命令指标:各类Redis命令(GET/SET/DEL 等)调用次数、耗时、QPS
  • 持久化指标:RDB/AOF持久化状态、落盘耗时、失败次数
  • 网络指标:网络流入 / 流出流量、连接异常数
  • 集群 / 哨兵指标:集群节点状态、主从同步延迟、哨兵监控状态

2.协议转换,适配Prometheus

Redis输出的是原生运维信息,无法直接被Prometheus识别

redis_exporter的核心工作就是:

定时读取Redis INFO信息、统计数据 → 标准化转为Prometheus可识别的时序Metric指标 → 以 HTTP 接口暴露,供Prometheus定时拉取。

3.无侵入监控,部署简单

  • 无需停业务、无需改Redis配置、无需重启数据库
  • 单进程轻量运行,资源占用极低
  • 支持多实例批量监控、权限密码适配、tls加密连接

4.支撑可视化与告警

采集后的标准化指标,可对接Grafana实现可视化大屏,同时支持Prometheus配置告警规则,实现内存过载、连接打满、缓存失效、主从延迟过高、实例宕机等场景的自动预警。

2.安装redis_exporter

还没有redis的小伙伴可以参考这篇文章:零基础搭建缓存,Redis 完整安装部署实操教程

使用wget连接GitHub,下载该.tar.gz文件到当前目录(目录自定义/app/redis_exporter):

shell 复制代码
wget https://github.com/oliver006/redis_exporter/releases/download/v0.21.2/redis_exporter-v0.21.2.linux-amd64.tar.gz

解压该文件:

shell 复制代码
tar -zxvf redis_exporter-v0.21.2.linux-amd64.tar.gz

解压后启动,启动命令:

  • 如果redis设置有密码,启动命令
shell 复制代码
nohup ./redis_exporter -redis.addr 你的redis的ip:6379  -redis.password 密码  -web.listen-address :9121 &
  • redis没有密码,则启动命令
shell 复制代码
nohup ./redis_exporter -redis.addr 你的redis的ip:6379  -web.listen-address :9121 &
  • 如果redis和edis_exporter部署在同一服务器上可以把ip换成localhost启动:
shell 复制代码
nohup ./redis_exporter -redis.addr localhost:6379  -web.listen-address :9121 &

验证是否启动成功:

shell 复制代码
ps -ef|grep redis_exporter

启动后浏览器通过如下url可查看redis_exporter监控到的数据

bash 复制代码
http://服务器ip:9121/metrics

进入这个目录,使用systemctl管理redis_exporter:

shell 复制代码
vim /usr/lib/systemd/system/redis_exporter.service
shell 复制代码
[Unit]
Description=Redis Exporter for Prometheus
Documentation=https://github.com/oliver006/redis_exporter
After=network.target

[Service]
Type=simple
User=redis-exporter
Group=redis-exporter
ExecStart=/app/redis_exporter/redis_exporter \
    --redis.addr=redis://localhost:6379 \
    --web.listen-address=:9121 \
    --web.telemetry-path=/metrics
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
SyslogIdentifier=redis_exporter

[Install]
WantedBy=multi-user.target

启动设置服务:

shell 复制代码
systemctl enable prometheus 
systemctl start prometheus
systemctl status prometheus

3.安装prometheus

通过以下命令创建一个用于存放Prometheus的目录 /app:

shell 复制代码
mkdir /app

进入到/app目录下:

shell 复制代码
cd /app

从prometheus官网下载压缩文件:https://prometheus.io/download/

下载适用于Linux系统的文件。

使用的是MobaXterm_Personal,这是一种功能强大的终端工具,常用于远程连接Linux服务器。

进入/app下面。

进入后点击这个"上传按钮",上传下载好的文件。

使用命令查看,我这里显示已经上传成功。

shell 复制代码
ls

给这个文件解压缩:

shell 复制代码
tar -xzvf prometheus-3.5.0.linux-amd64.tar.gz

将解压好的文件夹改一个名字,并删除原有的未解压文件(可以不删):

shell 复制代码
mv prometheus-3.5.0.linux-amd64 prometheus
rm -rf prometheus-3.5.0.linux-amd64.tar.gz

进入解压好并且改过名的prometheus目录下,查看它的版本。返回版本号代表安装成功!

shell 复制代码
cd /app/prometheus
./prometheus --version

创建prometheus 本地TSDB数据存储目录:

shell 复制代码
mkdir -p /var/lib/prometheus

进入这个目录,使用systemctl管理Prometheus:

shell 复制代码
vim /usr/lib/systemd/system/prometheus.service

写入:

shell 复制代码
[Unit]
Description=Prometheus
Documentation=https://prometheus.io/
After=network.target

[Service]
# Type设置为notify时,服务会不断重启
Type=simple
User=root
# --storage.tsdb.path是可选项,默认数据目录在运行目录的./dada目录中
ExecStart=/app/prometheus/prometheus --config.file=/app/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus --web.enable-lifecycle
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

启动设置服务:

shell 复制代码
systemctl enable prometheus 
systemctl start prometheus
systemctl status prometheus

ip+端口就可以进入prometheus啦:

shell 复制代码
ip:9200

4.配置prometheus监控redis_exporter

找到prometheus的配置文件,编辑添加如下内容:

shell 复制代码
vi prometheus.yml
shell 复制代码
      - targets: ["localhost:9121"]
        labels:
          app: "redis_exporter"

重启prometheus服务:

shell 复制代码
systemctl restart prometheus

使用浏览器Ip+9090打开promethues的页面:

我们可以看到成功的检测到了redis_exporter服务啦!

5.使用alertmanager配置redis_exporter告警

没有alertmanager的小伙伴可以参考这篇文章:告别宕机!零基础搭建服务器监控告警系统!小白也能学会!

配置redis告警。我这里举两个例子:

shell 复制代码
groups:
  - name: redis-alerts
    rules:
      # Redis 实例宕机(Exporter 无响应)
      - alert: RedisDown
        expr: up{job="redis"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Redis instance down"
          description: "Redis instance {{ $labels.instance }} is down for more than 1 minute."

      # Redis 内存使用率过高(>85%)
      - alert: RedisMemoryHigh
        expr: redis_memory_used_bytes{job="redis"} / redis_memory_max_bytes{job="redis"} > 0.85
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "Redis memory usage high"
          description: "Redis instance {{ $labels.instance }} memory usage is above 85% (current value: {{ $value | humanizePercentage }})."

      # Redis 连接数接近上限(>90%)
      - alert: RedisTooManyConnections
        expr: redis_connected_clients{job="redis"} / redis_config_maxclients{job="redis"} > 0.9
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "Redis too many connections"
          description: "Redis instance {{ $labels.instance }} has too many clients ({{ $value | humanizePercentage }} of max)."

      # Redis 主从复制延迟(仅适用于主从架构)
      - alert: RedisReplicationLag
        expr: redis_slave_info{master_link_status="down", job="redis"} == 1
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Redis replication broken"
          description: "Redis slave {{ $labels.instance }} lost connection to master."

编辑为7.yml,接下来配置prometheus告警:

进入prometheus配置文件:

找到prometheus的配置文件,编辑添加如下内容:

shell 复制代码
vi prometheus.yml
shell 复制代码
rule_files:
  -  "/app/prometheus/7.yml"

重启prometheus服务:

shell 复制代码
systemctl restart prometheus

使用浏览器Ip+9090打开promethues的页面:

可以看到,我们设置好的告警就出来啦!

那么问题来了,倘若我想监控朋友的redis,但是我们不在一个局域网,怎么办?别急cpolar来帮助你!

6.安装cpolar内网穿透工具

cpolar 可以将你本地电脑中的服务(如 SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。

❤️以下是安装cpolar步骤:

使用一键脚本安装命令:

shell 复制代码
sudo curl https://get.cpolar.sh | sh

安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)

shell 复制代码
sudo systemctl status cpolar

Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【ip:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:

打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。

7.配置公网地址

登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理------创建隧道:

  • 隧道名称:可自定义,本例使用了:redis_exporter,注意不要与已有的隧道名称重复

  • 协议:http

  • 本地地址:9121

  • 域名类型:随机域名

  • 地区:选择China Top

创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用地址访问。

访问成功。

8.将本redis_exporter暴露给Prometheus进行远程抓取

Prometheus可以通过这个公网地址a214e29.r2.cpolar.top访问到运行在本地9105端口的redis_exporter服务,从而抓取系统指标。

shell 复制代码
      - targets: ["a214e29.r2.cpolar.top"]
        labels:
          app: "redis_exporter"

抓取成功!

9.保留固定公网地址

使用cpolar为其配置二级子域名,该地址为固定地址,不会随机变化。

点击左侧的预留,选择保留二级子域名,地区选择china Top,然后设置一个二级子域名名称,我这里演示使用的是redis,大家可以自定义。填写备注信息,点击保留。

登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理------隧道列表,找到所要配置的隧道redis_exporter,点击右侧的编辑

修改隧道信息,将保留成功的二级子域名配置到隧道中

  • 域名类型:选择二级子域名
  • Sub Domain:填写保留成功的二级子域名
  • 地区: China Top

点击更新

更新完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的二级子域名名称。

最后,我们使用固定的公网地址在任意设备的浏览器中访问,可以看到成功访问本地部署的页面,这样一个永久不会变化的二级子域名公网网址即设置好了。

结尾

完成以上配置后,redis_exporter已经可以从Redis读取运行信息,并通过9121端口输出Prometheus格式的指标。Prometheus添加对应抓取任务后,可以持续保存这些数据,并在查询页面中检查目标是否处于正常状态。

告警规则能够根据指标表达式计算Redis宕机、内存使用率过高、连接数接近上限和主从连接异常等状态。不过,规则进入Firing状态不等于通知已经成功发送。

本文只展示了rule_files配置,没有完整配置Prometheus连接Alertmanager的地址,也没有设置通知路由和接收渠道。需要收到邮件、钉钉或其他通知时,还应继续完成Alertmanager服务、alerting配置及通知模板。

配置规则前,应先统一Prometheus任务名称与标签。正文抓取配置使用了app="redis_exporter",而告警表达式筛选的是job="redis",两者不一致时,相关规则可能无法匹配指标。

内存使用率规则也需要考虑Redis未设置maxmemory的情况。如果最大内存指标为0,不应直接作为除数。主从复制相关指标则需要根据当前redis_exporter实际输出的指标名和标签重新确认。

通过cpolar公开9121端口后,异地Prometheus可以抓取本地redis_exporter指标。使用HTTPS公网地址时,需要在抓取任务中明确设置正确的scheme、目标端口和metrics_path,不能只替换一个域名后默认所有配置都会生效。

redis_exporter的/metrics端点通常没有独立登录认证。虽然其中一般不包含Redis具体数据值,但仍可能暴露版本、内存、连接、Key数量和复制拓扑等运行信息,因此固定地址不应作为普通网页公开分享。

正式运行前,还应检查systemd中的redis_exporter执行路径,并创建对应的运行用户。Redis需要密码时,不建议把密码长期直接写在命令历史和公开配置中,应限制服务文件读取权限,并使用权限受限的Redis监控账号。

Prometheus长期保存时序数据会持续占用磁盘。除了监控Redis本身,还需要设置合理的数据保留周期,检查Prometheus存储目录容量,并备份抓取配置、规则文件和Alertmanager配置。

这套方案能够建立Redis监控的基础链路,但可观测性还需要结合Grafana展示、通知送达测试和故障演练。只有实际停止Redis、制造连接或复制异常,并验证指标、规则和通知全部生效,才能确认整套监控链路可以用于持续运行。

相关推荐
凡尘——雨落凡尘18 小时前
PHP 线上十大隐形故障复盘:90% 的网站卡顿、502、雪崩,都是这些细节导致的
redis·nginx·php·session
一水20 小时前
Redis实战:一个AI工作流系统里的五个应用场景,从传参到限流的完整链路
数据库·redis·wpf
鹿角片ljp1 天前
Redis 深度复习:从入门到面试通关
数据库·redis·面试
网教盟人才服务平台1 天前
Redis Key集中过期引发的流量雪崩实战解析
数据库·redis·缓存
Linux运维技术栈1 天前
业务不停机、数据零丢失:Redis / RabbitMQ / Elasticsearch 三大核心中间件升级改造集群无缝平滑迁移
redis·elasticsearch·rabbitmq
_oP_i1 天前
Another Redis Desktop Manager更新
数据库·redis·缓存
小林ixn1 天前
Redis 实战避坑指南:从缓存击穿到高可用,一文全搞定
redis·后端
dllmayday1 天前
Bootstrap三开关样式
前端·javascript·bootstrap
CryptoPP1 天前
韩国股市数据源对接实战:从KOSPI到KOSDAQ的实时行情接入方案
数据库·redis·缓存·金融·区块链