prometheus监控redis

redis-explorer监控redisredis阻塞 blocked_clients处理

1、安装部署

1.1、安装部署

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

  • 安装

    # 解压
    tar xf redis_exporter-v1.23.1.linux-amd64.tar.gz -C /opt/apm/exporter/
    cd /opt/apm/exporter/
    # 整成软链接是为了方便后续升级软件
    ln -sv redis_exporter-v1.23.1.linux-amd64/ redis_exporter
    
  • 启动脚本

    ]# cat redis_exporter_script.sh
    #!/bin/bash
    #
    # Name: node_exporter_start.sh 
    # Version Number:1.01
    # Type: 用于启动node_exporter
    # Language:bash shell  
    # Date: 2021.05.31
    # Author: 梁正雄
    
    server_path=/opt/apm/exporter/redis_exporter
    redis_add='redis的地址 x.x.x.x:端口'
    listen_add='0.0.0.0:9121'
    redis_pass='这里填redis'
    
    start() {
        check_port=`ss -tnlp|grep 9121`
        [ $? -eq 0 ] && echo "alreadry start" && exit 0
        ${server_path}/redis_exporter -redis.addr=${redis_add}  -redis.password=${redis_pass}  -web.listen-address=${listen_add} > ${server_path}/redis_exporter.log 2>&1
    }
    
    stop(){
        check_port=`ss -tnlp|grep 9121`
        [ $? -eq 0 ] && pkill redis_exporter && echo "redis_exporter stop" && exit 0 
        echo "无操作,服务没有启动"
    }
    
    # 如果是cat进来的  手动检查一下这个$1
    case $1 in
        start)
            start ;;
        stop)
            stop ;;
        *)
            echo "Inputs error";;
    esac
    
  • systemctl脚本

    cat >> redis-exporter.service << EOF
    [Unit]
    Description=redis-exporter
    # 这些服务必须在下面服务之后启动
    After=network.target 
    
    [Service]
    Type=simple
    ExecStart=/opt/apm/exporter/redis_exporter/redis_exporter_script.sh start
    ExecStop=/opt/apm/exporter/redis_exporter/redis_exporter_script.sh stop
    
    [Install]
    WantedBy=multi-user.target
    
    EOF
    
  • vim /etc/systemd/system/redis_exporter.service
    #添加如下内容:
    [Unit]
    Description=redis_exporter
    After=network.target
    
    [Service]
    Type=simple
    User=root
    ExecStart=/usr/local/redis_exporter/redis_exporter -redis.addr xxx.xxx.xxx.xxx:6379  -redis.password 123456
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    
  • 检查启动状态

    ]# ss -tnlp|grep 9121
    LISTEN  0  128  [::]:9121   [::]:*   users:(("redis_exporter",pid=29034,fd=3))
    

1.2、grafana引用redis引擎

  • 如果没有外网,找一台grafana的机器,先停止服务: stop grafana-server

  • 下载

    grafana-cli plugins install redis-datasource
    grafana-cli plugins install redis-explorer-app
    
  • 打包

    cd /var/lib/grafana/plugins
    tar zcf redis-grafana.tar.gz  redis-app/ redis-datasource redis-explorer-app/
    
  • 在回到要配置的机器,解压到: /var/lib/grafana/plugins

  • 启动 grafana-server
    在这里插入图片描述

  • enable 4跟5
    在这里插入图片描述

1.3、prometheus

直接配置

prometheus]# vim prometheus.yml 
  - job_name: 'redis_exporter_targets'
    static_configs:
      - targets:
        - redis地址:9121
        - redis://redis集群地址.103:7000
        - redis://redis集群地址.103:7001
        - redis://redis集群地址.103:7002
        - redis://redis集群地址.105:7000
        - redis://redis集群地址.105:7001
        - redis://redis集群地址.105:7002
        - redis://redis集群地址.115:7000
        - redis://redis集群地址.115:7001
        - redis://redis集群地址.115:7002
    metrics_path: /metrics
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: redis地址:9121

prometheus]# systemctl restart prometheus

在这里插入图片描述

下载dashboard json文件
在这里插入图片描述
在这里插入图片描述

2、监控指标

2.1、命中率指标

Metric to watch: hit rate
  • 使用Redis作为缓存时,监视缓存命中率可以告诉您缓存是否被有效使用。
  • 命中率低意味着客户端正在寻找不再存在(Redis内存中)的Key值。
  • Redis不直接提供命中率指标。我们可以像这样计算
    HitRate=keyspace_hits/(keyspace_hits+keyspace_misses)

低命中率原因

  1. 低缓存命中率可能由许多因素引起,包括数据到期和分配给Redis的内存不足(这可能导致key值被清除)。

  2. 低命中率可能会导致应用程序延迟增加,因为它们必须从较慢的备用资源中获取数据。

  3. 获取Redis的keyspace_hits+keyspace_misses,同样是info stats

    127.0.0.1:6379> INFO stats
        keyspace_hits:0    #命中
        keyspace_misses:0  #未命中
    
  4. PromQL

    redis_keyspace_hits_total/(redis_keyspace_hits_total+redis_keyspace_misses_total)
    
    原因:低命中率的原因
    说明:数据到期和分配给Redis的内存不足
    
Memory metrics

内存指标、,内存使用是Redis性能的关键组成部分。

需要注意的指标: used_memory

如果实例超过可用内存(used_memory > total available memory),操作系统将开始交换老的/未使用的部分内存(pages),将该部分pages写入磁盘,为较新/活动页腾出内存空间。

每个交换的部分都写入磁盘,严重影响性能。从磁盘写入或读取速度比写入或从存储器读取速度慢5个数量级(100,000)(内存为0.1μs,磁盘为10 ms)。

可以将Redis配置为仅限于指定的内存量。在redis.conf文件中设置maxmemory指令可以直接控制Redis的内存使用情况。

启用maxmemory需要您为Redis配置驱逐(过期)策略以确定它应如何释放内存。

当Redis用作缓存时,这种“扁平线”模式很常见;消耗掉所有可用内存,并以与插入新数据相同的速率清理旧数据。

关于Redis的内存参数 info memory

used_memory和used_memory_human都是Redis使用到的内存,used_memory_human是一更加可读性的方式展示Redis的内存使用。

used_memory_rss和used_memory_rss_human 表示操作系统为Redis进程分配的内存总量,两者的含义类似如上。

为什么会出现Redis使用的内存大于操作系统给Redis分配的内存

  • used_memory being < used_memory_rss意味着内存碎片的存在。

  • used_memory > used_memory_rss 意味着物理内存不足,发生了内存swap。

    #]# redis-cli 
    127.0.0.1:6379> info memory
    # Memory
    used_memory:882976
    used_memory_human:862.28K
    used_memory_rss:7225344
    used_memory_rss_human:6.89M
    used_memory_peak:3975624
    used_memory_peak_human:3.79M
    total_system_memory:7125061632
    total_system_memory_human:6.64G
    used_memory_lua:37888
    used_memory_lua_human:37.00K
    maxmemory:0
    maxmemory_human:0B
    maxmemory_policy:noeviction
    mem_fragmentation_ratio:8.18
    mem_allocator:jemalloc-4.0.3
    

需要告警的指标: mem_fragmentation_ratio

        mem_fragmentation_ratio度量标准给出了操作系统看到的内存与Redis分配的内存的比率。
MemoryFragmentationRatio =Used_Memory_RSS(Used_Memory)

        操作系统负责为每个进程分配物理内存。操作系统的虚拟内存管理器处理由内存分配器调解的实际映射。
        如果Redis实例的内存占用为1GB,内存分配器将首先尝试找到一个连续内存段来存储数据。如果没有找到连续的段,分配器必须将进程的数据划分为多个段,从而导致内存开销的增加。

跟踪碎片比率对于了解Redis实例的性能非常重要。

        碎片率大于1表示内存有碎片。比率超大表示碎片过多,Redis实例占用了所请求的物理内存的150%。
        碎片率低于1会告诉您Redis需要的内存比系统上可用的内存多,这会导致交换。交换到磁盘将导致延迟显着增加。

    理想情况下,操作系统会在物理内存中分配一个连续的段,碎片比率等于1或稍大一些。

  1. 如果您的服务器的碎片率高于1.5,则重新启动Redis实例将允许操作系统恢复以前因碎片而无法使用的内存。在这种情况下,作为通知的警报可能就足够了。
  2. 如果Redis服务器的碎片比率低于1,则可能需要以发出告警,以便快速增加可用内存或减少内存使用量。

        从Redis 4开始,当Redis配置为使用包含的jemalloc副本时,可以使用新的活动碎片整理功能,可以将此工具配置为在碎片达到特定级别时启动,并开始将值复制到连续的内存区域并释放旧副本,从而减少服务器运行时的碎片。

info memory可以查看内存碎片信息

mem_fragmentation_ratio:8.18	# 碎片信息


配置文件中增加activedefrag yes选项,不用重启的方式自动重整内存碎片。
127.0.0.1:6379> CONFIG SET activedefrag yes
127.0.0.1:6379> CONFIG get activedefrag 
1) "activedefrag"
2) "yes

exporter中的指标

redis_mem_fragmentation_ratio 8.26
evicted_keys

需要告警的指标:evicted_keys(仅限缓存)

        如果使用Redis作为缓存,可能将其配置在达到maxmemory限制时(按照某种方式)自动清除key值。

        如果使用Redis作为数据库或队列,可能需要交换而不是清除key值,在这种情况下可以跳过此指标,跟踪key值清理指标非常重要,因为Redis按顺序处理每个操作,这意味着驱逐大量key可以降低命中率,从而增加延迟时间。

        如果您使用TTL,您可能不会期望清理key值。在这种情况下,如果此指标始终高于零,您可能会看到实例中的延迟增加。

        大多数不使用TTL的其他配置最终会耗尽内存并开始清理key值。只要您的响应时间可以接受,就可以接受稳定的清除率。

        可以使用以下命令配置key值过期策略:config set maxmemory-policy = ***

其中policy是以下之一:

key说明
noeviction当达到内存限制并且用户尝试添加其他键时,将返回错误
(也就是说达到内存限制之后不允许写入)
volatile-lru在已过期的key值中,删除最近最少使用的key值
volatile-ttl在已过期的key值中,删除最短过期时间的key值
volatile-random在已过期的key值中,随机删除key值
allkeys-lru从所有key值中删除最近最少使用的key
allkeys-random从所有key值中随机删除
volatile-lfu在Redis 4中新增选项,在已过期的key值中,“最近最不常用”的key值
allkeys-lfu在Redis 4中新增选项,从所有key值中,删除“最近最不常用”的key值

        注意:出于性能原因,当使用LRU,TTL或Redis 4的LFU策略时,Redis实际上不会从整个key值集进行采样。

  • Redis首先对key值集的随机子集进行采样,然后对样本应用清理策略。

        通常,Redis的较新(> = 3)版本采用LRU采样策略,该策略更接近真实LRU。
例如,可以通过设置必须经过多少时间而无需访问项目在排名中向下移动来调整LFU策略。

        关于LRU和LFU,分别是最近最少使用和最近最不频繁使用,LFU理论上是比LRU更加合理的算法,清理key的时候,LFU认为“最近最不频繁”使用要比“最近最少”使用更加合理。

LRU和LFU的区别:

  1. LRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面!
  2. LFU是最近最不常用页面置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的页!
blocked_clients

Redis提供了许多在List上运行的阻塞命令。

BLPOP,BRPOP和BRPOPLPUSH分别是命令LPOP,RPOP和RPOPLPUSH的阻塞变体。

当List非空时,命令按预期执行。但是,当List为空时,阻塞命令将一直等到源被填充或达到超时。

等待数据的并且被阻止客户端数量的增加可能是一个麻烦的迹象。

延迟或其他问题可能会阻止源列表被填充。虽然被阻止的客户端本身不会引起警报,但如果您看到此指标的值始终为非零值,则应该引起注意。

2.2、基本活动指标

nameDescriptionType
connected_clients客户端连接数Utilization
connected_slavesSlave数量Other
master_last_io_seconds_ago最近一次主从交互之后的秒数Other
keyspace数据库中的key值总数Utilization
connected_clients

需要关注的指标,由于对Redis的访问通常由应用程序发起(用户通常不直接访问数据库),因此对于大多数场景,连接客户端的数量将有合理的上限和下限。

  • 如果数字偏离正常范围,这表示可能存在问题。
  • 如果它太低,表示客户端连接可能已经丢失,如果它太高,大量的并发客户端连接可能会打垮服务器处理请求的能力。

查看

redis中查看
    127.0.0.1:6379> CONFIG GET maxclients
    1) "maxclients"
    2) "10000"
    127.0.0.1:6379> 

prometheus
    redis_config_maxclients 10000	# 最大连接数
	redis_connected_clients 3		# 已连接客户端
connected_slaves

如果数据库是大量读取的,那么您可能正在使用Redis中提供的主从数据库复制功能。

在这种情况下,监控连接的从站数量是关键。如果连接的从站数量意外更改,则可能表示主机已关闭或从站实例出现问题。
在这里插入图片描述

注意:在上图中,Redis Master将显示它有两个连接的slave,并且每个slave都有两个slave。

由于slave的slave不直接连接到Redis Master,因此它们不包含在Redis Master的connected_slaves中。

master_last_io_seconds_ago

使用Redis的复制功能时,slave会定期检查其主服务器。主从长时间没有通信的可能表示主从Redis实例之间存在问题。并且冒着slave中数据在master中已经发生了变化危险。

主从延迟问题

        网络会导致主从无法进行之间的PING心跳,由于Redis执行同步的方式,最大限度地减少主从通信的中断至关重要。当从设备在中断后重新连接到master时,它会发送PSYNC命令以尝试仅同步中断期间丢失的命令。

        如果无法做到这一点,则slave将请求完整的SYNC,这会迫使master立即开始执行background save命令,同时新增加的命令会被缓冲起来。

        当background save命令执行完成时,数据与缓冲的命令一起发送到客户端。每次从机执行SYNC时,都会导致主实例上的延迟显着增加。

keyspace

        跟踪数据库中的键数通常是个好主意。作为内存数据存储,key值集合空间越大,为了确保性能,Redis需要的物理内存越多。

        Redis将继续添加key值,直到它达到maxmemory limit,然后它开始以相同的速率清理key值。这会产生一个“扁平线”图,如上图所示。

        如果您使用Redis作为缓存并查看key值空间饱和度 - 如上图所示 - 加上命中率较低,您可能会让客户端请求旧的或已逐出的数据。随着时间的推移跟踪keyspace_misses数量将帮助您查明原因。

        或者,如果使用Redis作为数据库或队列,则可能不选择volatile策略,随着key值空间的增长,如果可能的话,您可能需要考虑在添加物理内存或在主机之间拆分数据集。

        添加更多内存是一种简单有效的解决方案。如果单机资源有限,则对数据进行分区或分片可以合并许多计算机的资源, 有了分区计划,Redis可以存储更多key值集合而无需清理或swap。但是,分片比增加内存要困难得多。

2.3、持久化指标

        Redis需要启用持久性配置,尤其是在使用Redis的复制功能时,如果您使用Redis作为缓存,或者在数据丢失无关紧要的用例中,则可能不需要持久性。

Namedescriptiontype
rdb_last_save_time最后一次持久化保存到磁盘的Unix时间戳other
rdb_changes_since_last_save自最后一次持久化以来数据库的更改数other

1.需要注意的指标: rdb_last_save_time and rdb_changes_since_last_save

        关注数据集的波动性是个好主意。写入磁盘之间的时间间隔过长可能会在服务器发生故障时导致数据丢失,在上次保存时间和故障时间之间对数据集所做的任何更改都将丢失。

        监控rdb_changes_since_last_save可更深入地了解数据的波动性。如果数据集在该间隔内没有太大变化,则写入之间的长时间间隔不是问题, 跟踪这两个指标可以清楚地了解在给定时间点发生故障时您将丢失多少数据。

如何查看Redis的rdb_last_save_time and rdb_changes_since_last_save

redis
    127.0.0.1:6379> info Persistence
    # Persistence
    loading:0
    rdb_changes_since_last_save:69008
    rdb_bgsave_in_progress:0
    rdb_last_save_time:1628824444
    rdb_last_bgsave_status:ok
    rdb_last_bgsave_time_sec:-1
    rdb_current_bgsave_time_sec:-1
    aof_enabled:0
    aof_rewrite_in_progress:0
    aof_rewrite_scheduled:0
    aof_last_rewrite_time_sec:-1
    aof_current_rewrite_time_sec:-1
    aof_last_bgrewrite_status:ok
    aof_last_write_status:ok

promQL
	redis_rdb_last_save_timestamp_seconds 1.628824444e+09
    redis_rdb_changes_since_last_save 69008

2.4、错误指标

Error metrics: Redis错误指标可以提醒您注意异常情况。以下指标可跟踪常见错误:

NameDescriptionType
rejected_connections由于达到maxclient限制而被拒绝的连接数Saturation
keyspace_missesKey值查找失败(没有命中)次数Errors / Other
master_link_down_since_seconds主从断开的持续时间(以秒为单位)Errors
rejected_connections
  • Redis能够处理许多活动连接,默认情况下可以使用10,000个客户端连接。
  • 可以通过更改redis.conf中的maxclient指令将最大连接数设置为不同的值。
  • 如果Redis实例当前处于其最大连接数,则将断开任何新的连接尝试。

**请注意,**Redis可能不支持使用maxclient指令请求的连接数。

Redis检查内核以确定可用文件描述符的数`量。如果可用文件描述符的数量小于maxclient + 32(Redis为其自己使用保留32个文件描述符),则忽略maxclient指令并使用可用文件描述符的数量。

rejected_connections可以通过查看Info stat

redis
	127.0.0.1:6379> INFO stats
    rejected_connections:0
    
promQL
    redis_rejected_connections_total 0
keyspace_misses

每次Redis查找key时,只有两种可能的结果:key存在,或key不存在。

查找不存在的键会导致keyspace_misses计数器递增,因此keyspace_misses意味着客户端尝试在数据库中查找不存在的密key。

如果您不使用Redis作为缓存,则keyspace_misses应该为零或接近零。注意,调用阻塞的任何阻塞操作(BLPOP,BRPOP和BRPOPLPUSH)都将导致keyspace_misses递增。

keyspace_misses可以通过查看Info stat

redis
	127.0.0.1:6379> INFO stats
    rejected_connections:0
    keyspace_hits:53708
    keyspace_misses:26080
master_link_down_since_seconds

该指标仅在主从之间的连接丢失时可用。

理想情况下,此值不应超过零-主从之间保持持续通信,以确保slave不提供过时数据。

应该解决连接之间的大的时间间隔。请记住,重新连接后,您的主Redis实例将需要投入资源来更新从站上的数据,这可能会导致延迟增加。

3、预警

3.1、Redis报警规则
报警名称表达式采集数据时间(分钟)报警触发条件
RedisDownredis_up == 05Redis下线。
RedisMissingMastercount(redis_instance_info{role=“master”}) == 05Master缺失。
RedisTooManyMasterscount(redis_instance_info{role=“master”}) > 15Master过多。
RedisDisconnectedSlavescount without (instance, job) (redis_connected_slaves) - sum without (instance, job) (redis_connected_slaves) - 1 > 15Slave连接断开。
RedisReplicationBrokendelta(redis_connected_slaves[1m]) < 05复制中断。
RedisClusterFlappingchanges(redis_connected_slaves[5m]) > 25副本连接识别变更。
RedisMissingBackuptime() - redis_rdb_last_save_timestamp_seconds > 60 * 60 * 245备份中断。
RedisOutOfMemoryredis_memory_used_bytes / redis_total_system_memory_bytes * 100 > 905内存不足。
RedisTooManyConnectionsredis_connected_clients > 1005连接过多。
RedisNotEnoughConnectionsredis_connected_clients < 55连接不足。
RedisRejectedConnectionsincrease(redis_rejected_connections_total[1m]) > 05连接被拒绝。
redis_master_link_upredis_master_link_up == 05复制连接当前断开
groups:
- name: redis集群预警
  rules:
  - alert: "redis节点下线"
    expr: up{instance=~".*:9121"} == 0
    for: 20s
    labels:
      severity: ERROR
      alert_type: "节点下线通知"
      alert_host: "{{ reReplaceAll \":(.*)\" \"\" $labels.instance }}"
    annotations:
      description: "{{ reReplaceAll \":(.*)\" \"\" $labels.instance }} redis 监控主节点下线, 请及时处理 命令: systemctl restart|status redis-exporter"

  - alert: "redis节点下线"
    expr: redis_up{instance=~"redis:.*"} == 0
    for: 20s
    labels:
      severity: WARN
      alert_type: "节点下线通知"
      alert_host: "{{ reReplaceAll \":(.*)\" \"\" $labels.instance }}"
    annotations:
      description: "{{ $labels.instance }} 节点下线, 请及时处理"

  - alert: "redis集群节点丢失"
    expr: time() - redis_rdb_last_save_timestamp_seconds > 60 * 60 * 24
    for: 5m
    labels:
      severity: ERROR
    annotations:
      summary: "Missing backup (instance {{ $labels.instance }})"
      description: "redis 集群节点: {{$labels.instance}}  已下线24小时, 请立即处理"  

  - 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 > 18
    for: 5m
    labels:
      severity: ERROR
    annotations:
      description: "Redis 当前节点 {{ $labels.instance }} 内存碎片过大, 当前: {{ $value}}, 处理"

  - alert: "redis连接被拒绝"
    expr: increase(redis_rejected_connections_total[1m]) > 0
    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: delta(redis_connected_slaves[1m]) < 0
    for: 5m
    labels:
      severity: WARN
      alert_type: "数据不同步"
      alert_host: "{{ reReplaceAll \":(.*)\" \"\" $labels.instance }}"
    annotations:
      description: "redis {{ $labels.instance}} 集群副本下线, 请立即处理"
  
  - alert: "redis连接数过多"
    expr: redis_connected_clients{instance=~"redis://.*"} > redis_config_maxclients{instance=~"redis://.*"} * 0.85
    for: 5m
    labels:
      severity: WARN
      alert_type: "连接数过多"
      alert_host: "{{ reReplaceAll \":(.*)\" \"\" $labels.instance }}"
    annotations:
      description: "主机: {{ $labels.instance }} 当前连接数: {{ $value }}, 连接总数达到总量的85%,请立即检查"

  - 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: redis_connected_clients == 0
    for: 5m
    labels:
      severity: WARN
      alert_type: "连接数过低"
      alert_host: "{{ reReplaceAll \":(.*)\" \"\" $labels.instance }}"
    annotations:
      description: "当前: {{ $labels.instance }} 无连接, 请检查下服务是否下线了"

  - 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的内存不足,请及时检查内存、数据"

  - alert: "redis异常同步"
    expr: irate(redis_rdb_changes_since_last_save[60m])
    for: 60m
    labels:
      severity: ERROR
      alert_host: "{{ reReplaceAll \":(.*)\" \"\" $labels.instance }}"
    annotations:
      description: "当前: {{ $labels.alert_host }} redis 某一台服务异常断开, 同步异常"

  - alert: "redis集群连接异常"
    expr: redis_master_link_up{master_host=~".*"} == 0
    for: 5m
    labels:
      severity: WARN
      alert_host: "{{ reReplaceAll \":(.*)\" \"\" $labels.instance }}"
    annotations:
      description: "当前: {{ $labels.alert_host }} redis 复制连接当前断开"
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐