• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    通过prometheus监控redis实时运行状态的操作方法

    发布者: Error | 发布时间: 2025-6-19 12:41| 查看数: 89| 评论数: 0|帖子模式

    引言

    在现代微服务架构中,Redis被广泛应用于缓存、消息队列及其他场景。为了确保Redis集群的高可用性和性能,我们需要实时监控其状态与指标。本文将全面讲解如何通过prometheus监控redis运行的各项指标,让数据实时可知。

    1、安装配置redis


    1)安装redis
    1. yum install redis -y
    复制代码
    2)调整redis内使用的最大内存
    1. vim /etc/redis/redis.conf
    2. maxmemory 200mb
    复制代码


    3)启动redis
    1. systemctl start redis
    复制代码
    redis本身就有info命令,可以哦查看redis状态,但是并不兼容prometheus的数据格式

    因此,需要借助exporter来暴露指标

    2、安装配置redis_exporter


    1)访问redis_exporter的github地址

    https://github.com/oliver006/redis_exporter
    下载redis_exporter

    直接下载最新版


    2)解压redis_exporter
    1. tar xf redis_exporter-v1.67.0.linux-amd64.tar.gz -C /etc/
    2. ln -s /etc/redis_exporter-v1.67.0.linux-amd64/ /etc/redis_exporter
    复制代码


    3)配置redis_exporter启动文件

    先看下redis_exporter启动参数

    默认监听地址是9121

    systemd启动配置文件
    1. cat /usr/lib/systemd/system/redis_exporter.service
    2. [Unit]
    3. Description=redis_exporter
    4. Documentation=https://github.com/oliver006/redis_exporter
    5. After=network.target
    6. [Service]
    7. ExecStart=/etc/redis_exporter/redis_exporter \
    8. -redis.addr="redis://localhost:6379"
    9. -redis.password=""
    10. -web.listen-address=":9121" \
    11. -web.telemetry-path="/metrics" \
    12. ExecReload=/bin/kill -HUP $MAINPID
    13. TimeoutStopSec=20s
    14. Restart=always
    15. [Install]
    16. WantedBy=multi-user.target
    复制代码


    4)启动redis_exporter
    1. systemctl enable redis_exporter.service --now
    复制代码


    5)访问redis_exporter的metrics

    http://10.10.0.32:9121/metrics


    3、配置prometheus


    1)修改prometheus配置
    1. vim /etc/prometheus/prometheus.yml
    2.   - job_name: "redis_exporter"
    3.     static_configs:
    4.       - targets: ["jingtian03:9121"]
    复制代码
    2)加载prometheus配置文件
    1. curl -X POST http://localhost:9090/-/reload
    复制代码
    3)检查Prometheus的Status->Targets页面

    验证 redis_exporter 是否已经成功纳入监控中

    查看下指标


    4)模拟产生Redis相关数据

    执行如下脚本
    1、Redis向db0库,插入了50个key,然后尝试随机获取100个key。由于总共的key只有50个,因此会有一半查询命中一半miss。
    2、Redis向db1库,插入了100个key,但有60个key设定了过期时间;
    1. [root@jingtian03 myredis ]#cat redis_data.sh
    2. #!/bin/bash
    3. # 定义Redis主机和端口
    4. REDIS_HOST=localhost
    5. REDIS_PORT=6379
    6. # Redis数据库定义
    7. DB0=0
    8. DB1=1
    9. # 定义key的总数
    10. TOTAL_KEYS=100
    11. # 计算应设置过期时间的键的数量
    12. EXPIRING_KEYS_COUNT=$(( TOTAL_KEYS * 60 / 100 ))
    13. # 向Redis db0插入一半的key
    14. for i in {1..50}
    15. do
    16. key="test-$i"
    17. value="test-$i"
    18. redis-cli -h $REDIS_HOST -p $REDIS_PORT -n $DB0 SET $key $value
    19. done
    20. # 随机获取100个key,一部分将获取成功,一部分将miss
    21. for i in {1..100}
    22. do
    23.   random_key_index=$(( ( RANDOM % TOTAL_KEYS ) + 1 ))
    24.   key="test-$random_key_index"
    25.   result=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -n $DB0 GET $key)
    26.   if [ "$result" == "" ]
    27.   then
    28.     echo "MISS: $key"
    29.   else
    30.     echo "HIT: $key"
    31.   fi
    32. done
    33. # 向Redis db1插入100个key,其中60%设置过期时间为10分钟
    34. for i in {1..100}
    35. do
    36.   key="expire-test-$i"
    37.   value="value-$i"
    38.   # 对前60%的键设置过期时间
    39.   if [ $i -le $EXPIRING_KEYS_COUNT ]
    40.   then
    41.     redis-cli -h $REDIS_HOST -p $REDIS_PORT -n $DB1 SET $key $value EX 600
    42.   else
    43.     redis-cli -h $REDIS_HOST -p $REDIS_PORT -n $DB1 SET $key $value
    44.   fi
    45. done
    复制代码
    执行脚本


    4、Redis常用指标与示例

    针对Redis服务,我们可以利用Google的四个黄金信号来监控其健康状况。
    这些信号包括:
    延迟:监控平均命令响应时间,以评估处理请求的效率。
    流量:跟踪每秒处理的命令数量、以及网络的输入/输出速度,以便理解服务负载。
    错误:统计命令失败次数和连接被拒绝的情况,以识别潜在的服务问题。
    饱和度:监测内存使用率和客户端连接数,以判断服务的负载情况和容量限制。

    1)redis健康状态相关指标


    启动多少秒是累加的,不断增大的,counter类型的,exporter将其标为gauge是错误的

    案例1:检查Redis是否存活
    1. sum(redis_up) by (instance,job)
    复制代码

    案例2:检查Redis是否出现过重启,只需要判断启动时间是否小于1分钟即可。
    1. sum(redis_uptime_in_seconds) by (instance,job) < 60

    2. # redis运行了多长时间
    3. sum(redis_uptime_in_seconds) by (instance,job) / 3600 # 小时
    4. sum(redis_uptime_in_seconds) by (instance,job) / 86400 # 天
    复制代码
    2)redis连接数相关指标



    默认允许的最大连接数为10000

    案例1:查询当前 Redis 连接数与最大配置连接数的比率。
    计算公式:( 当前客户端连接数 / 最大支持的客户端连接数 * 100 )
    1. redis_connected_clients /redis_config_maxclients *100
    复制代码

    案例2:查询过去1小时内是否有连接被拒绝,直接使用increase获取一个小时的增量数据
    1. increase(redis_rejected_connections_total[1h])
    复制代码


    3)redis内存相关指标



    案例:redis当前使用的内存达到最大内存的比率。计算公式:( 当前内存 /最大内存 * 100 )
    1. redis_memory_used_bytes / redis_memory_max_bytes * 100
    复制代码


    4)redis命中率相关指标


    案例1:查询最近5分钟,命令率和未命中率QPS
    1. irate(redis_keyspace_hits_total[5m])
    2. irate(redis_keyspace_misses_total[5m])
    复制代码
    案例2:查询Redis最近5分钟,缓存成功命中率低于90% ,计算公式:(rate(5分钟成功的命中率) / ( 5分钟成功的命中率 + 5分钟失败的命中率) *100 )
    1. irate(redis_keyspace_hits_total[5m]) / ( irate(redis_keyspace_hits_total[5m]) + irate(redis_keyspace_misses_total[5m]) ) * 100 < 90
    复制代码
    5)redis key相关指标



    案例1:计算Redis中,每个库即将过期的key,占每个库总key的比率。计算公式:( 每个库过期的key / 每个库总的key * 100 )
    1. redis_db_keys_expiring / redis_db_keys * 100
    复制代码

    案例2:计算Redis最近5分钟,即将被驱逐的Key,占总key的比率。计算公式:( rate(最近5分钟被驱逐的Key) / 总的key * 100 )
    1. # 计算不同命令的失败率。
    2. irate(redis_commands_failed_calls_total[5m]) / irate(redis_commands_total[5m]) * 100
    3. # 计算总的失败比率
    4. sum (irate(redis_commands_failed_calls_total[5m])) by (instance,job)
    5. /
    6. sum (irate(redis_commands_total[5m])) by (instance,job) * 100
    复制代码


    6)redis执行命令操作相关指标



    案例1:计算Redis每分钟,成功处理命令的QPS
    1. irate(redis_commands_processed_total[1m])
    复制代码
    1. # 模拟Redis的QPS小脚本
    2. while true;do
    3. redis-cli keys "*"
    4. redis-cli set a b
    5. redis-cli get a
    6. sleep 0.1
    7. done
    复制代码

    案例2:计算Redis最近5分钟,命令执行失败占执行命令总数的比率。
    计算公式:( irate(最近5分钟失败的命令数量) / irate(最近5分钟执行命令的总数量) * 100 )
    1. # 计算不同命令的失败率。
    2. irate(redis_commands_failed_calls_total[5m]) / irate(redis_commands_total[5m]) * 100
    3. # 计算总的失败比率
    4. sum (irate(redis_commands_failed_calls_total[5m])) by (instance,job)
    5. /
    6. sum (irate(redis_commands_total[5m])) by (instance,job) * 100
    复制代码
    案例3:计算Redis最近5分钟,被拒绝执行的命令占执行命令总数的比率。
    计算公式:( irate(最近5分钟拒绝的命令数量) / irate(最近5分钟执行命令的总数量) * 100 )
    1. # 计算不同命令的拒绝率。
    2. irate(redis_commands_rejected_calls_total[5m]) / irate(redis_commands_total[5m]) * 100
    3. # 计算总的拒绝率
    4. sum (irate(redis_commands_rejected_calls_total[5m])) by (instance,job)
    5. /
    6. sum (irate(redis_commands_total[5m])) by (instance,job) * 100
    复制代码
    案例4:计算Redis在过去5分钟内每个成功执行的命令,平均响应时间。
    计算公式:( irate(5分钟所花费总的时间) / rate(5分钟执行成功命令的次数))
    1. sum(rate(redis_commands_duration_seconds_total[5m])) by (instance,job)
    2. /
    3. sum (rate(redis_commands_processed_total[5m])) by (instance,job)
    复制代码
    7)redis备份相关指标

    RDB方式备份

    案例1:上一次RDB备份失败。
    1. redis_rdb_last_bgsave_status == 0
    复制代码
    案例2:上一次RDB备份成功,但是备份时长超过了3s
    1. redis_rdb_last_bgsave_duration_sec > 3 and redis_rdb_last_bgsave_status ==1
    复制代码
    案例3:超过10小时没有生成新的RDB备份文件。
    计算公式:( (当前时间戳- 上一次RBD备份文件时间戳 ) > 36000 ),10小时等于36000秒( 60 *60 * 10 )
    1. (time() - redis_rdb_last_save_timestamp_seconds) > 36000
    复制代码
    AOF备份
    1. redis_aof_enabled:1                    AOF日志是否启用
    2. redis_aof_rewrite_in_progress:0                表示当前是否在进行写入AOF日志操作
    3. redis_aof_rewrite_scheduled:0            是否有AOF操作等待执行。
    4. redis_aof_last_rewrite_time_sec:-1        表示上次写入AOF日志的时间戳
    5. redis_aof_current_rewrite_time_sec:-1            当前正在执行的AOF重写操作已经消耗的时间。
    6. redis_aof_last_bgrewrite_status:ok        表示上次执行AOF日志重写的状态
    7. redis_aof_last_write_status:ok            表示上次写入AOF日志的状态
    8. redis_aof_last_cow_size:0                AOF执行中父进程与子进程相比执行了多少修改
    9. redis_aof_current_size:0                        AOF日志的当前大小
    10. redis_aof_base_size:0                    最近一次重写后AOF日志的大小。
    11. redis_aof_pending_rewrite:0                    是否有AOF操作在等待执行。
    12. redis_aof_buffer_length:0                AOF缓冲区的大小。
    13. redis_aof_rewrite_buffer_length:0                AOF重写缓冲区的大小。
    14. redis_aof_pending_bio_fsync:0            在等待执行的fsync操作的数量。
    15. redis_aof_delayed_fsync:0                fsync操作延迟执行的次数。
    复制代码
    5、redis告警规则文件


    1)编写redis告警规则文件
    1. cat /etc/prometheus/rules/redis_rules.yml
    复制代码
    1. groups:- name: redis告警规则  rules:  - alert: Redis实例宕机    expr: sum(redis_up) by (instance, job) == 0    for: 1m    labels:      severity: critical    annotations:      summary: "Redis实例宕机, {{ $labels.instance }} "      description: "Redis实例 {{ $labels.instance }} 在过去1分钟内无法连接。"  - alert: Redis实例重启    expr: sum(redis_uptime_in_seconds) by (instance, job) < 60    for: 0m    labels:      severity: warning    annotations:      summary: "Redis实例 {{ $labels.instance }} 重启"      description: "Redis实例 {{ $labels.instance }} 出现重启。当前运行时间:{{ $value }} 秒。"  - alert: Redis连接数过高    expr: redis_connected_clients / redis_config_maxclients * 100 > 80    for: 5m    labels:      severity: warning    annotations:      summary: "Redis实例 {{ $labels.instance }} 连接数超过80%"      description: "Redis实例 {{ $labels.instance }} 当前连接数占最大连接数的比率超过80%。当前比率: {{ $value }}%。"  - alert: Redis连接被拒绝    expr: increase(redis_rejected_connections_total[1h]) > 0    for: 5m    labels:      severity: warning    annotations:      summary: "Redis实例 {{ $labels.instance }} 有连接被拒绝"      description: "Redis实例 {{ $labels.instance }} 在过去1小时内有连接被拒绝。当前被拒绝的连接数: {{ $value }}。"  - alert: Redis内存使用率过高    expr: redis_memory_used_bytes / redis_memory_max_bytes * 100 > 80    for: 5m    labels:      severity: critical    annotations:      summary: "Redis实例 {{ $labels.instance }} 内存使用率超过80%"      description: "Redis实例 {{ $labels.instance }} 当前内存使用率超过配置的最大内存值的80%。当前内存使用率: {{ $value }}%。"  - alert: Redis缓存命中率低    expr: |      irate(redis_keyspace_hits_total[5m]) /      (irate(redis_keyspace_hits_total[5m]) + irate(redis_keyspace_misses_total[5m])) * 100 < 90    for: 10m    labels:      severity: warning    annotations:      summary: "Redis实例 {{ $labels.instance }} 缓存命中率低于90%"      description: "Redis实例 {{ $labels.instance }} 最近5分钟内的缓存命中率低于90%。当前命中率: {{ $value }}%。"  - alert: Redis即将过期的Key数量过多    expr: |      sum(redis_db_keys_expiring) by (instance, job, db) /      sum(redis_db_keys) by (instance, job, db) * 100 > 50    for: 5m    labels:      severity: warning    annotations:      summary: "Redis实例 {{ $labels.instance }} 中的数据库 {{ $labels.db}} 有过多即将过期的Key"      description: "Redis实例 {{ $labels.instance }} 中的数据库 {{ $labels.db }} 有超过50%的Key即将过期。当前比率: {{ $value }}%。"  - alert: RedisRDB备份失败    expr: redis_rdb_last_bgsave_status == 0    for: 1m    labels:      severity: critical    annotations:      summary: "Redis实例 {{ $labels.instance }} RDB备份失败"      description: "Redis实例 {{ $labels.instance }} 最近的RDB备份尝试失败。"  - alert: RedisRDB备份时间过长    expr: redis_rdb_last_bgsave_duration_sec > 3 and redis_rdb_last_bgsave_status == 1    for: 1m    labels:      severity: warning    annotations:      summary: "Redis实例 {{ $labels.instance }} RDB备份成功但耗时超过3秒"      description: "Redis实例 {{ $labels.instance }} RDB备份成功,但备份耗时超过了3秒。持续时间: {{ $value }}秒。"  - alert: RedisRDB备份过期    expr: (time() - redis_rdb_last_save_timestamp_seconds) > 36000    for: 5m    labels:      severity: critical    annotations:      summary: "Redis实例 {{ $labels.instance }} 超过10小时未进行RDB备份"      description: "Redis实例 {{ $labels.instance }} 已超过10小时没有生成新的RDB备份文件。"  - alert: Redis命令拒绝率过高    expr: |      sum(irate(redis_commands_rejected_calls_total[5m])) by (instance, job) /      sum(irate(redis_commands_total[5m])) by (instance, job) * 100 > 25    for: 5m    labels:      severity: warning    annotations:      summary: "Redis实例 {{ $labels.instance }} 命令拒绝率超过25%"      description: "Redis实例 {{ $labels.instance }} 的命令拒绝率超过了25%。当前拒绝率: {{ $value }}%。"  - alert: Redis命令平均响应时间过长    expr: |      sum(rate(redis_commands_duration_seconds_total[5m])) by (instance,job) /      sum(rate(redis_commands_processed_total[5m])) by (instance, job) >0.250    for: 5m    labels:      severity: critical    annotations:      summary: "Redis实例 {{ $labels.instance }} 命令平均响应时间超过250ms"      description: "Redis实例 {{ $labels.instance }} 的执行命令平均响应时间超过了250毫秒。当前平均响应时间: {{ $value }}秒。"
    复制代码
    2)查看告警规则



    6、导入redis图形


    1)导入一个redis的grafana的模板,ID为763



    2)运行一个redis的模拟数据脚本
    1. cat redis_basic_data.sh
    2. #!/bin/bash
    3. # 模拟的 Redis 客户端数量
    4. CLIENTS=199
    5. # Redis 服务器配置
    6. REDIS_HOST="localhost"
    7. REDIS_PORT=6379
    8. REDIS_PASSWORD="" # Redis 密码
    9. # 生成随机字符串的函数,用于键和值
    10. # $1 是生成的字符串长度
    11. generate_random_string() {
    12. cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${1:-32} | head -n 1
    13. }

    14. # 模拟 Redis 客户端的行为
    15. simulate_redis_client() {
    16.   # 存储随机生成的键,用于后续的 GET 操作
    17.   declare -a keys
    18.   # 打开 redis-cli 的交互式会话
    19.   (
    20.     # 如果设置了密码,先认证
    21.     if [[ -n "$REDIS_PASSWORD" ]]; then
    22.       echo "AUTH $REDIS_PASSWORD"
    23.     fi
    24.     # 持续发送命令
    25.     while true; do
    26.     # 生成随机键和值
    27.       key=$(generate_random_string 10)
    28.       value=$(generate_random_string 20)
    29.       # 随机的过期时间,介于10到60秒之间
    30.       ttl=$((RANDOM % 50 + 10))
    31.       # SET 操作
    32.       echo "SET $key $value EX $ttl"
    33.       # 将键存储在数组中,用于模拟 GET
    34.       keys+=("$key")
    35.       # 随机决定是否执行 GET
    36.       if [ $((RANDOM % 2)) -eq 0 ]; then
    37.         # 模拟命中和未命中
    38.         if [ $((RANDOM % 10)) -lt 8 ]; then # 80% 概率尝试获取一个存在的键,模拟命中
    39.           get_key="${keys[$((RANDOM % ${#keys[@]}))]}"
    40.         else # 20% 概率尝试获取一个不存在的键,模拟未命中
    41.           get_key=$(generate_random_string 10)
    42.         fi
    43.       # GET 操作
    44.       echo "GET $get_key"
    45.       fi
    46.       # 操作间隔,减少服务器压力
    47.       sleep 1
    48.     done
    49.   ) | redis-cli -h $REDIS_HOST -p $REDIS_PORT --pipe
    50. }
    51. # 启动多个客户端
    52. for ((i=0; i<CLIENTS; i++)); do
    53.   simulate_redis_client &
    54.   echo "Started Redis client simulation $i"
    55. done
    56. # 等待所有后台进程
    57. wait
    复制代码
    客户端数量增加

    以上就是通过prometheus监控redis实时运行状态的操作方法的详细内容,更多关于prometheus监控redis运行状态的资料请关注脚本之家其它相关文章!

    来源:https://www.jb51.net/database/335655jrp.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    浏览过的版块

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表