各位观众,各位老铁,大家好!今天咱们聊点硬核的,关于Redis监控告警规则配置,而且是基于Prometheus和Grafana这对黄金搭档的。 放心,我尽量用大白话,保证你们听完能上手。
一、为啥要监控Redis?不监控会怎样?
想象一下,你的Redis就像一个辛勤工作的搬运工,吭哧吭哧地搬数据。你不监控它,就不知道它是不是累趴下了,是不是搬不动了,是不是偷偷摸鱼了。
不监控的后果?轻则用户体验下降,应用卡顿;重则数据丢失,业务崩溃。 别跟我说你的Redis永远不会出问题,墨菲定律了解一下?
二、Prometheus + Grafana:监控界的神雕侠侣
-
Prometheus: 负责收集数据,像一个勤劳的记者,定期采访Redis,问它各种问题,然后把答案记录下来。
-
Grafana: 负责展示数据,像一个厉害的PPT高手,把Prometheus收集到的数据,以各种酷炫的图表形式展示出来,让你一目了然。
三、准备工作:环境搭建
- Redis: 这个不用多说,装好你的Redis服务器。
- Prometheus: 下载、安装、配置,让它能连接到你的Redis。
- Grafana: 下载、安装,然后连接到你的Prometheus数据源。
- Redis Exporter: 这个很重要,它是一个桥梁,负责把Redis的内部数据转换成Prometheus能理解的格式。
四、Redis Exporter:数据采集的秘密武器
Redis Exporter 就像一个翻译,把Redis的“火星语”翻译成Prometheus能懂的“地球语”。
-
下载 Redis Exporter:
可以从官方GitHub仓库下载预编译好的二进制文件:https://github.com/oliver006/redis_exporter
-
运行 Redis Exporter:
./redis_exporter -redis.addr redis://your_redis_host:6379
-redis.addr
:指定Redis的连接地址。- 还可以设置密码、超时时间等参数,具体看官方文档。
-
配置 Prometheus:
让Prometheus知道去哪里找Redis Exporter。# prometheus.yml scrape_configs: - job_name: 'redis' static_configs: - targets: ['your_redis_exporter_host:9184'] # Redis Exporter 的地址
job_name
:随便起个名字,方便识别。targets
:Redis Exporter 的地址和端口,默认端口是9184。
-
重启 Prometheus:
让配置生效。 -
验证:
打开Prometheus的Web界面,输入redis_up
,如果能看到结果,说明配置成功了。
五、Prometheus告警规则:让机器自动报警
Prometheus的告警规则是基于PromQL(Prometheus Query Language)的。PromQL是一种查询语言,可以用来查询Prometheus收集到的数据。
告警规则定义在 prometheus.yml
配置文件中,或者单独的规则文件中,通过 rule_files
配置项引入。
一个告警规则的基本结构如下:
groups:
- name: redis_alerts
rules:
- alert: RedisDown
expr: redis_up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Redis instance is down"
description: "Redis instance {{ $labels.instance }} is down for more than 1 minute."
groups
: 告警规则的分组,可以把相关的告警规则放在同一个组里。name
: 组的名字。rules
: 告警规则列表。alert
: 告警的名称,随便起,但要有意义。expr
: PromQL表达式,用于判断是否触发告警。for
: 持续时间,只有当表达式的结果持续为真超过这个时间,才会触发告警。labels
: 标签,可以用来对告警进行分类和过滤。annotations
: 注释,用于提供告警的详细信息。summary
:告警的简短描述。description
:告警的详细描述,可以使用模板变量,例如{{ $labels.instance }}
表示Redis实例的地址。
下面是一些常用的Redis告警规则,附带PromQL表达式:
告警名称 | PromQL表达式 | 说明 |
---|---|---|
RedisDown | redis_up == 0 |
Redis 实例宕机 |
RedisMemoryHigh | redis_memory_used_percent > 80 |
Redis 内存使用率超过 80% |
RedisCPUHigh | rate(process_cpu_seconds_total{job="redis"}[5m]) > 0.8 |
Redis CPU 使用率超过 80% (注意 process_cpu_seconds_total 指标可能需要根据你的环境进行调整,如果你的exporter采集的是系统级别的CPU指标,请替换为对应的指标) |
RedisConnectionsHigh | redis_connected_clients > 1000 |
Redis 连接数超过 1000 |
RedisRejectedConnections | increase(redis_rejected_connections_total[5m]) > 0 |
Redis 拒绝连接 (表示服务器已经达到了最大连接数限制) |
RedisSlowlogTooMany | increase(redis_commands_duration_seconds_count{quantile="0.99"}[5m]) > 10 |
Redis 慢查询数量过多 (这个表达式统计了 5 分钟内 99 分位数的命令执行时长,超过 10 个命令,表示慢查询过多。你需要根据你的业务情况调整 quantile 和阈值) |
RedisReplicationLagHigh | redis_replication_lag > 60 |
Redis 主从复制延迟超过 60 秒 |
RedisPersistenceFailing | redis_rdb_bgsave_last_status != 0 or redis_aof_rewrite_last_status != 0 |
Redis RDB 或 AOF 持久化失败 (注意,这只是一个简单的判断,实际情况可能需要根据你的持久化策略进行调整。例如,如果你的Redis没有配置AOF,那么只需要检查 redis_rdb_bgsave_last_status 即可) |
例子:告警Redis内存使用率过高
groups:
- name: redis_alerts
rules:
- alert: RedisMemoryHigh
expr: redis_memory_used_percent > 80
for: 5m
labels:
severity: warning
annotations:
summary: "Redis memory usage is high"
description: "Redis instance {{ $labels.instance }} memory usage is above 80% for more than 5 minutes."
这个规则的意思是:如果Redis的内存使用率持续超过80% 5分钟,就触发一个警告,告警级别是warning,告警信息包含Redis实例的地址。
六、Alertmanager:告警信息的处理中心
Alertmanager负责接收Prometheus发来的告警信息,然后根据配置的规则,把告警信息发送给相应的接收者,例如邮件、短信、Slack等等。
-
下载 Alertmanager:
同样从官方网站下载。 -
配置 Alertmanager:
# alertmanager.yml global: resolve_timeout: 5m route: group_by: ['alertname'] group_wait: 30s group_interval: 5m repeat_interval: 12h receiver: 'web.hook' receivers: - name: 'web.hook' webhook_configs: - url: 'http://your_webhook_server:8080/alerts'
global
:全局配置,例如告警恢复的超时时间。route
:路由配置,用于把告警信息发送给不同的接收者。group_by
:按照哪些标签对告警信息进行分组。group_wait
:等待多久才发送分组的告警信息。group_interval
:发送分组的告警信息的时间间隔。repeat_interval
:重复发送告警信息的时间间隔。receiver
:接收者的名字。
receivers
:接收者配置,定义告警信息发送到哪里。webhook_configs
:通过 Webhook 发送告警信息,你需要自己实现一个 Webhook 服务器来接收告警信息。
-
配置 Prometheus:
让 Prometheus 知道把告警信息发送给 Alertmanager。# prometheus.yml alerting: alertmanagers: - static_configs: - targets: ['your_alertmanager_host:9093'] # Alertmanager 的地址
-
重启 Prometheus 和 Alertmanager:
让配置生效。
七、Grafana:酷炫的可视化展示
Grafana就像一个画笔,把Prometheus收集到的数据,画成各种漂亮的图表,让你一目了然。
-
添加 Prometheus 数据源:
在Grafana中添加Prometheus数据源,输入Prometheus的地址。 -
创建 Dashboard:
创建一个新的Dashboard,然后添加各种图表。- Graph: 折线图,用于展示数据的变化趋势。
- Gauge: 仪表盘,用于展示数据的当前值。
- Single Stat: 单值图,用于展示单个数据的当前值。
-
使用 PromQL 查询数据:
在图表中输入PromQL表达式,查询Prometheus中的数据。例如,要展示Redis的内存使用率,可以使用以下PromQL表达式:
redis_memory_used_percent
Grafana 会自动把数据画成图表。
一些常用的Grafana面板示例:
面板名称 | PromQL表达式 | 说明 |
---|---|---|
Redis 内存使用率 | redis_memory_used_percent |
展示 Redis 内存使用率 |
Redis CPU 使用率 | rate(process_cpu_seconds_total{job="redis"}[5m]) |
展示 Redis CPU 使用率 |
Redis 连接数 | redis_connected_clients |
展示 Redis 连接数 |
Redis 命中率 | redis_hitrate (这个指标需要自己计算,见下面的“自定义指标”章节) |
展示 Redis 缓存命中率 |
Redis 慢查询数量 | increase(redis_commands_duration_seconds_count{quantile="0.99"}[5m]) |
展示 Redis 慢查询数量 |
Redis 主从延迟 | redis_replication_lag |
展示 Redis 主从复制延迟 |
Redis 操作数量 | rate(redis_commands_total[5m]) |
展示 Redis 每秒操作数量 (可以按命令类型进行分组,例如 sum by (command)(rate(redis_commands_total[5m])) ) |
八、自定义指标:满足你的个性化需求
有时候,Redis Exporter提供的指标可能不够用,你需要自己定义一些指标。
-
Lua脚本:
可以使用Lua脚本来获取Redis的内部数据,然后把数据暴露给Prometheus。例如,要计算Redis的缓存命中率,可以使用以下Lua脚本:
local hits = redis.call("GET", "hits") local misses = redis.call("GET", "misses") local total = hits + misses if total == 0 then return 0 else return hits / total end
-
Redis Exporter 扩展:
可以修改Redis Exporter的代码,添加自定义的指标。这种方法比较复杂,需要有一定的编程能力。
-
PromQL 计算:
可以使用PromQL来计算一些复杂的指标。例如,要计算Redis的缓存命中率,可以使用以下PromQL表达式:
sum(increase(redis_commands_processed_total{command="get"}[5m])) / sum(increase(redis_commands_total{command="get"}[5m]))
这个表达式计算了5分钟内get命令的命中率。 但是这个方法并不准确,更好的方法是直接监控
keyspace_hits
和keyspace_misses
指标,然后计算命中率:rate(redis_keyspace_hits[5m]) / (rate(redis_keyspace_hits[5m]) + rate(redis_keyspace_misses[5m]))
可以把这个表达式添加到Grafana面板中,就可以看到Redis的缓存命中率了。 你也可以在Alertmanager中使用这个表达式来设置告警规则。 但是,直接用指标计算得出的命中率,无法直接用 redis exporter 暴露,因此需要一个中间的处理过程,将计算后的数据暴露出来。 最简单的方法是使用
node_exporter
的textfile_collector
功能。 你可以写一个脚本,定期从 redis 获取keyspace_hits
和keyspace_misses
指标,计算命中率,然后将结果写入一个文本文件,node_exporter
会自动读取这个文件,并将结果暴露给 Prometheus。具体步骤:
- 创建脚本 (例如
redis_hitrate.sh
):
#!/bin/bash # Redis 连接信息 REDIS_HOST="your_redis_host" REDIS_PORT="6379" REDIS_PASSWORD="your_redis_password" # 如果 Redis 有密码 # 获取 keyspace_hits 和 keyspace_misses if [ -n "$REDIS_PASSWORD" ]; then HITS=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD info | grep keyspace_hits: | awk '{print $2}') MISSES=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD info | grep keyspace_misses: | awk '{print $2}') else HITS=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT info | grep keyspace_hits: | awk '{print $2}') MISSES=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT info | grep keyspace_misses: | awk '{print $2}') fi # 计算命中率 TOTAL=$((HITS + MISSES)) if [ "$TOTAL" -eq "0" ]; then HITRATE=0 else HITRATE=$(echo "scale=2; $HITS / $TOTAL" | bc) # 使用 bc 进行浮点数计算 fi # 将结果写入文本文件 (Prometheus Textfile Collector 格式) echo "redis_hitrate $HITRATE" > /path/to/textfile_collector/redis_hitrate.prom # 确保文件权限正确 chown node_exporter:node_exporter /path/to/textfile_collector/redis_hitrate.prom
- 替换
your_redis_host
,6379
,your_redis_password
和/path/to/textfile_collector
为你实际的值。 - 如果你的 Redis 没有密码,移除
-a $REDIS_PASSWORD
参数。 scale=2
表示保留两位小数。- 确保 node_exporter 用户有权限读取
/path/to/textfile_collector
目录和文件。
- 配置
node_exporter
:
确保
node_exporter
启用了textfile_collector
模块,并且指向了正确的目录。 在node_exporter
的配置文件中 (如果没有配置文件,可以使用命令行参数),添加:--collector.textfile.directory=/path/to/textfile_collector
- 设置定时任务:
使用
cron
定期执行脚本 (例如每分钟一次):* * * * * /path/to/redis_hitrate.sh
-
重启
node_exporter
: -
在 Prometheus 中查询:
现在,你应该可以在 Prometheus 中查询到
redis_hitrate
指标了。- 在 Grafana 中使用:
在 Grafana 中,可以使用
redis_hitrate
指标来创建面板,展示 Redis 的命中率。总结:
redis_hitrate.sh
脚本负责从 Redis 获取数据,计算命中率,并将结果写入文本文件。node_exporter
的textfile_collector
模块负责读取文本文件,并将结果暴露给 Prometheus。- Prometheus 负责收集数据,Grafana 负责展示数据。
- 创建脚本 (例如
九、告警策略:如何避免误报和漏报
告警策略很重要,好的告警策略可以让你及时发现问题,避免误报和漏报。
-
设置合理的阈值:
阈值太高,容易漏报;阈值太低,容易误报。需要根据你的业务情况,设置合理的阈值。
-
使用持续时间:
只有当指标持续超过阈值一段时间,才触发告警。可以避免一些瞬时波动引起的误报。
-
设置告警级别:
根据告警的严重程度,设置不同的告警级别。例如,可以设置 critical、warning、info 三个级别。
-
告警抑制:
当某个告警触发后,可以抑制相关的告警。例如,当Redis宕机后,可以抑制内存使用率过高的告警。
-
告警分组:
把相关的告警放在同一个组里。可以方便告警的处理。
十、最佳实践:让你的监控系统更上一层楼
-
监控所有关键指标:
除了上面提到的指标,还可以监控Redis的连接数、命令执行时间、持久化状态等等。 -
设置分层告警:
根据不同的告警级别,设置不同的处理方式。例如,critical级别的告警,需要立即处理;warning级别的告警,可以在工作时间处理;info级别的告警,可以记录下来,用于分析。
-
定期检查告警规则:
定期检查告警规则是否有效,是否需要调整。 -
自动化运维:
可以把告警系统和自动化运维系统结合起来,当告警触发时,自动执行一些操作,例如重启Redis、扩容内存等等。
总结:
Prometheus + Grafana + Redis Exporter 是一套强大的Redis监控告警系统。 通过配置合理的告警规则和告警策略,可以及时发现Redis的问题,避免业务受到影响。 希望今天的分享对大家有所帮助! 有问题可以随时提问,咱们一起讨论。
这篇文章差不多5000字了,涵盖了Redis监控告警的方方面面,包括环境搭建、数据采集、告警规则配置、告警信息处理、可视化展示以及最佳实践。 每个部分都给出了详细的步骤和代码示例,希望能帮助大家快速上手。 记住,监控不是一劳永逸的事情,需要不断调整和优化,才能更好地保障你的Redis服务。