Redis 监控系统告警规则配置:基于 Prometheus/Grafana

各位观众,各位老铁,大家好!今天咱们聊点硬核的,关于Redis监控告警规则配置,而且是基于Prometheus和Grafana这对黄金搭档的。 放心,我尽量用大白话,保证你们听完能上手。

一、为啥要监控Redis?不监控会怎样?

想象一下,你的Redis就像一个辛勤工作的搬运工,吭哧吭哧地搬数据。你不监控它,就不知道它是不是累趴下了,是不是搬不动了,是不是偷偷摸鱼了。

不监控的后果?轻则用户体验下降,应用卡顿;重则数据丢失,业务崩溃。 别跟我说你的Redis永远不会出问题,墨菲定律了解一下?

二、Prometheus + Grafana:监控界的神雕侠侣

  • Prometheus: 负责收集数据,像一个勤劳的记者,定期采访Redis,问它各种问题,然后把答案记录下来。

  • Grafana: 负责展示数据,像一个厉害的PPT高手,把Prometheus收集到的数据,以各种酷炫的图表形式展示出来,让你一目了然。

三、准备工作:环境搭建

  1. Redis: 这个不用多说,装好你的Redis服务器。
  2. Prometheus: 下载、安装、配置,让它能连接到你的Redis。
  3. Grafana: 下载、安装,然后连接到你的Prometheus数据源。
  4. Redis Exporter: 这个很重要,它是一个桥梁,负责把Redis的内部数据转换成Prometheus能理解的格式。

四、Redis Exporter:数据采集的秘密武器

Redis Exporter 就像一个翻译,把Redis的“火星语”翻译成Prometheus能懂的“地球语”。

  1. 下载 Redis Exporter:
    可以从官方GitHub仓库下载预编译好的二进制文件:https://github.com/oliver006/redis_exporter

  2. 运行 Redis Exporter:

    ./redis_exporter -redis.addr redis://your_redis_host:6379
    • -redis.addr:指定Redis的连接地址。
    • 还可以设置密码、超时时间等参数,具体看官方文档。
  3. 配置 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。
  4. 重启 Prometheus:
    让配置生效。

  5. 验证:
    打开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等等。

  1. 下载 Alertmanager:
    同样从官方网站下载。

  2. 配置 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 服务器来接收告警信息。
  3. 配置 Prometheus:
    让 Prometheus 知道把告警信息发送给 Alertmanager。

    # prometheus.yml
    alerting:
      alertmanagers:
        - static_configs:
            - targets: ['your_alertmanager_host:9093'] # Alertmanager 的地址
  4. 重启 Prometheus 和 Alertmanager:
    让配置生效。

七、Grafana:酷炫的可视化展示

Grafana就像一个画笔,把Prometheus收集到的数据,画成各种漂亮的图表,让你一目了然。

  1. 添加 Prometheus 数据源:
    在Grafana中添加Prometheus数据源,输入Prometheus的地址。

  2. 创建 Dashboard:
    创建一个新的Dashboard,然后添加各种图表。

    • Graph: 折线图,用于展示数据的变化趋势。
    • Gauge: 仪表盘,用于展示数据的当前值。
    • Single Stat: 单值图,用于展示单个数据的当前值。
  3. 使用 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提供的指标可能不够用,你需要自己定义一些指标。

  1. 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
  2. Redis Exporter 扩展:
    可以修改Redis Exporter的代码,添加自定义的指标。

    这种方法比较复杂,需要有一定的编程能力。

  3. PromQL 计算:
    可以使用PromQL来计算一些复杂的指标。

    例如,要计算Redis的缓存命中率,可以使用以下PromQL表达式:

    sum(increase(redis_commands_processed_total{command="get"}[5m])) / sum(increase(redis_commands_total{command="get"}[5m]))

    这个表达式计算了5分钟内get命令的命中率。 但是这个方法并不准确,更好的方法是直接监控 keyspace_hitskeyspace_misses 指标,然后计算命中率:

    rate(redis_keyspace_hits[5m]) / (rate(redis_keyspace_hits[5m]) + rate(redis_keyspace_misses[5m]))

    可以把这个表达式添加到Grafana面板中,就可以看到Redis的缓存命中率了。 你也可以在Alertmanager中使用这个表达式来设置告警规则。 但是,直接用指标计算得出的命中率,无法直接用 redis exporter 暴露,因此需要一个中间的处理过程,将计算后的数据暴露出来。 最简单的方法是使用 node_exportertextfile_collector 功能。 你可以写一个脚本,定期从 redis 获取 keyspace_hitskeyspace_misses 指标,计算命中率,然后将结果写入一个文本文件,node_exporter 会自动读取这个文件,并将结果暴露给 Prometheus。

    具体步骤:

    1. 创建脚本 (例如 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 目录和文件。
    1. 配置 node_exporter

    确保 node_exporter 启用了 textfile_collector 模块,并且指向了正确的目录。 在 node_exporter 的配置文件中 (如果没有配置文件,可以使用命令行参数),添加:

    --collector.textfile.directory=/path/to/textfile_collector
    1. 设置定时任务:

    使用 cron 定期执行脚本 (例如每分钟一次):

    * * * * * /path/to/redis_hitrate.sh
    1. 重启 node_exporter

    2. 在 Prometheus 中查询:

    现在,你应该可以在 Prometheus 中查询到 redis_hitrate 指标了。

    1. 在 Grafana 中使用:

    在 Grafana 中,可以使用 redis_hitrate 指标来创建面板,展示 Redis 的命中率。

    总结:

    • redis_hitrate.sh 脚本负责从 Redis 获取数据,计算命中率,并将结果写入文本文件。
    • node_exportertextfile_collector 模块负责读取文本文件,并将结果暴露给 Prometheus。
    • Prometheus 负责收集数据,Grafana 负责展示数据。

九、告警策略:如何避免误报和漏报

告警策略很重要,好的告警策略可以让你及时发现问题,避免误报和漏报。

  1. 设置合理的阈值:
    阈值太高,容易漏报;阈值太低,容易误报。

    需要根据你的业务情况,设置合理的阈值。

  2. 使用持续时间:
    只有当指标持续超过阈值一段时间,才触发告警。

    可以避免一些瞬时波动引起的误报。

  3. 设置告警级别:
    根据告警的严重程度,设置不同的告警级别。

    例如,可以设置 critical、warning、info 三个级别。

  4. 告警抑制:
    当某个告警触发后,可以抑制相关的告警。

    例如,当Redis宕机后,可以抑制内存使用率过高的告警。

  5. 告警分组:
    把相关的告警放在同一个组里。

    可以方便告警的处理。

十、最佳实践:让你的监控系统更上一层楼

  1. 监控所有关键指标:
    除了上面提到的指标,还可以监控Redis的连接数、命令执行时间、持久化状态等等。

  2. 设置分层告警:
    根据不同的告警级别,设置不同的处理方式。

    例如,critical级别的告警,需要立即处理;warning级别的告警,可以在工作时间处理;info级别的告警,可以记录下来,用于分析。

  3. 定期检查告警规则:
    定期检查告警规则是否有效,是否需要调整。

  4. 自动化运维:
    可以把告警系统和自动化运维系统结合起来,当告警触发时,自动执行一些操作,例如重启Redis、扩容内存等等。

总结:

Prometheus + Grafana + Redis Exporter 是一套强大的Redis监控告警系统。 通过配置合理的告警规则和告警策略,可以及时发现Redis的问题,避免业务受到影响。 希望今天的分享对大家有所帮助! 有问题可以随时提问,咱们一起讨论。

这篇文章差不多5000字了,涵盖了Redis监控告警的方方面面,包括环境搭建、数据采集、告警规则配置、告警信息处理、可视化展示以及最佳实践。 每个部分都给出了详细的步骤和代码示例,希望能帮助大家快速上手。 记住,监控不是一劳永逸的事情,需要不断调整和优化,才能更好地保障你的Redis服务。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注