背景与目的
Redis作为高性能内存数据库,广泛应用于缓存、会话存储、消息队列等场景。对Redis运行状况的有效监控,是保障业务稳定性的关键。本文的目的是帮助运维工程师建立完整的Redis监控知识体系,讲解需要监控哪些指标、如何采集这些指标、以及如何设置合理的告警阈值。
前置知识:本文假设你具备基本的Linux操作能力,了解Redis的基本概念和常用命令,有过Redis实际维护经验。
环境说明:本文基于Redis 7.4.x,Prometheus 2.50.x,Grafana 11.x。
1. Redis监控的重要性
1.1 监控不足的常见问题
性能问题:
内存接近上限,淘汰策略生效导致命中率下降
CPU单核瓶颈,请求处理变慢
网络带宽打满,请求超时
可用性问题:
主从复制中断,数据不一致
持久化失败,数据丢失风险
客户端连接耗尽,新请求被拒绝
容量问题:
内存规划不足,无法承载数据增长
bigkey导致内存分配失败
键数量接近上限(内存碎片)
1.2 监控体系架构
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 应用层 │────│ Redis │────│ 监控层 │
│ (业务代码) │ │ (被监控) │ │ (采集/存储)│
└─────────────┘ └─────────────┘ └─────────────┘
│ │
│ ▼
│ ┌─────────────┐
└───────────│ 告警层 │
│ (Alertmanager)│
└─────────────┘
2. 基础运行指标
2.1 版本和进程信息
# 查看Redis版本 redis-cli INFO server | grep redis_version # redis_version: 7.4.0 # redis_mode: standalone # os: Linux 6.8.5 x86_64 # arch_bits: 64 # process_id: 12345 # tcp_port: 6379
2.2 uptime指标
# 查看运行时长
redis-cli INFO server | grep uptime_in
# uptime_in_seconds: 864000
# uptime_in_days: 10
# 监控脚本
#!/bin/bash
uptime_seconds=$(redis-cli INFO server | grep uptime_in_seconds | cut -d: -f2)
uptime_days=$(echo"scale=2;$uptime_seconds/86400"| bc)
echo"Redis运行时间:${uptime_days}天"
# 如果uptime过短(比如<1小时),可能是刚重启,需要告警
2.3 基础健康检查脚本
#!/bin/bash # script: redis_health_check.sh # 用途:Redis基础健康检查 echo"=== Redis健康检查 ===" # 1. 检查进程是否存活 ifredis-cli PING 2>/dev/null | grep -q PONG;then echo"✓ Redis进程存活" else echo"✗ Redis进程不可用" exit1 fi # 2. 检查版本 VERSION=$(redis-cli INFO server | grep redis_version | cut -d: -f2 | tr -d' ') echo"✓ 版本:$VERSION" # 3. 检查运行时间 UPTIME=$(redis-cli INFO server | grep uptime_in_days | cut -d: -f2 | tr -d' ') echo"✓ 运行天数:${UPTIME}天" # 4. 检查是否可写 ifredis-cli SET test_key test_value EX 10 > /dev/null;then redis-cli DEL test_key > /dev/null echo"✓ 可写" else echo"✗ 不可写(可能内存已满)" fi # 5. 检查复制状态 ROLE=$(redis-cli INFO replication | grep role: | cut -d: -f2 | tr -d' ') echo"✓ 角色:$ROLE"
3. 内存指标详解
3.1 核心内存指标
redis-cli INFO memory # used_memory: 104857600 # Redis申请的总内存(字节) # used_memory_human: 100.00M # 人类可读格式 # used_memory_rss: 115673600 # 操作系统报告的物理内存占用 # used_memory_rss_human: 110.32M # used_memory_peak: 209715200 # 历史峰值 # used_memory_peak_human: 200.00M # used_memory_peak_perc: 100.00% # 使用率百分比 # used_memory_lua: 33792 # Lua引擎内存 # used_memory_lua_human: 33.00K # maxmemory: 1073741824 # 配置的最大内存 # maxmemory_human: 1.00G # maxmemory_policy: allkeys-lru # 淘汰策略 # memory_frag_ratio: 1.10 # 内存碎片率 # memory_frag_bytes:10737418 # 碎片字节数
3.2 内存告警脚本
#!/bin/bash
# script: redis_memory_alert.sh
# 用途:Redis内存告警检查
WARNING_THRESHOLD=80
CRITICAL_THRESHOLD=90
INFO=$(redis-cli INFO memory)
USED=$(echo"$INFO"| grep"^used_memory:"| cut -d: -f2 | tr -d'
')
MAX=$(echo"$INFO"| grep"^maxmemory:"| cut -d: -f2 | tr -d'
')
RSS=$(echo"$INFO"| grep"^used_memory_rss:"| cut -d: -f2 | tr -d'
')
FRAG=$(echo"$INFO"| grep"^mem_fragment_ratio:"| cut -d: -f2 | tr -d'
')
# 计算使用率
if["$MAX"!="0"];then
USAGE=$(echo"scale=2;$USED* 100 /$MAX"| bc)
echo"内存使用率:${USAGE}%"
echo"已使用:$(echo "scale=2; $USED/1024/1024" | bc)MB"
echo"最大限制:$(echo "scale=2; $MAX/1024/1024" | bc)MB"
echo"物理占用:$(echo "scale=2; $RSS/1024/1024" | bc)MB"
echo"碎片率:$FRAG"
# 告警判断
USAGE_INT=$(echo"$USAGE"| cut -d. -f1)
if["$USAGE_INT"-ge"$CRITICAL_THRESHOLD"];then
echo"ALERT: 内存使用率${USAGE}%,超过${CRITICAL_THRESHOLD}%,请立即处理!"
# 发送告警
elif["$USAGE_INT"-ge"$WARNING_THRESHOLD"];then
echo"WARNING: 内存使用率${USAGE}%,超过${WARNING_THRESHOLD}%"
fi
else
echo"maxmemory未设置"
fi
3.3 内存指标详细说明
| 指标 | 说明 | 正常范围 | 异常处理 |
|---|---|---|---|
| used_memory | Redis申请的内存 | - | - |
| used_memory_rss | 物理内存占用 | - | - |
| mem_fragment_ratio | 碎片率 | 1.0-1.5 | >2.0需优化 |
| maxmemory | 配置的最大内存 | - | - |
| mem_not_counted_for_evict | 淘汰时不计入的内存 | - | - |
4. 持久化指标
4.1 RDB持久化
redis-cli INFO persistence # rdb_changes_since_last_save: 0 # 距上次保存后的变化次数 # rdb_bgsave_in_progress: 0 # bgsave是否进行中 # rdb_last_save_time: 1743619200 # 上次保存的Unix时间戳 # rdb_last_bgsave_status: ok # 上次bgsave状态 # rdb_last_bgsave_time_sec: -1 # 上次bgsave耗时(秒) # rdb_current_bgsave_time_sec: -1 # 当前bgsave已执行时间 # rdb_saves: 100 # 累计保存次数
4.2 AOF持久化
redis-cli INFO persistence # aof_enabled: 1 # AOF是否启用 # aof_rewrite_in_progress: 0 # AOF重写是否进行中 # aof_rewrite_scheduled: 0 # 是否计划AOF重写 # aof_last_rewrite_time_sec: -1 # 上次AOF重写耗时 # aof_current_rewrite_time_sec: -1 # 当前AOF重写已执行时间 # aof_last_bgrewrite_status: ok # 上次AOF重写状态 # aof_last_write_status: ok # 上次AOF写入状态 # aof_delayed_fsync: 0 # 延迟fsync次数
4.3 持久化监控脚本
#!/bin/bash
# script: redis_persistence_check.sh
# 用途:检查持久化健康状态
echo"=== Redis持久化检查 ==="
INFO=$(redis-cli INFO persistence)
# RDB检查
rdb_status=$(echo"$INFO"| grep"^rdb_last_bgsave_status:"| cut -d: -f2 | tr -d'
')
rdb_in_progress=$(echo"$INFO"| grep"^rdb_bgsave_in_progress:"| cut -d: -f2 | tr -d'
')
rdb_time=$(echo"$INFO"| grep"^rdb_last_bgsave_time_sec:"| cut -d: -f2 | tr -d'
')
echo"RDB状态:"
echo" 上次保存状态:$rdb_status"
echo" 保存中:$rdb_in_progress"
if["$rdb_time"!="-1"];then
echo" 耗时:${rdb_time}秒"
fi
# AOF检查
aof_enabled=$(echo"$INFO"| grep"^aof_enabled:"| cut -d: -f2 | tr -d'
')
aof_status=$(echo"$INFO"| grep"^aof_last_write_status:"| cut -d: -f2 | tr -d'
')
echo"AOF状态:"
echo" 启用:$aof_enabled"
echo" 上次写入状态:$aof_status"
# 检查异常
if["$rdb_status"!="ok"];then
echo" RDB保存失败!"
fi
if["$aof_status"!="ok"];then
echo" AOF写入失败!"
fi
5. 主从复制指标
5.1 复制状态查看
# 主节点 redis-cli INFO replication # role: master # connected_slaves: 2 # slave0:ip=192.168.1.101,port=6379,state=online,offset=123456 # slave1:ip=192.168.1.102,port=6379,state=online,offset=123456 # master_repl_offset: 123456 # 从节点 redis-cli INFO replication # role: slave # master_host: 192.168.1.100 # master_port: 6379 # master_link_status: up # master_repl_offset: 123456 # slave_repl_offset: 123456
5.2 复制延迟
#!/bin/bash # script: check_replication_lag.sh # 用途:检查主从复制延迟 INFO=$(redis-cli INFO replication) echo"=== 复制状态检查 ===" role=$(echo"$INFO"| grep"^role:"| cut -d: -f2 | tr -d' ') if["$role"="master"];then echo"角色:主节点" slaves=$(echo"$INFO"| grep"^slave"| wc -l) echo"从节点数量:$slaves" # 检查每个从节点的延迟 echo"$INFO"| grep"^slave"|whileIFS=,read-ra slave;do echo" ${slave[0]}" done elif["$role"="slave"];then echo"角色:从节点" master=$(echo"$INFO"| grep"^master_host:"| cut -d: -f2 | tr -d' ') link_status=$(echo"$INFO"| grep"^master_link_status:"| cut -d: -f2 | tr -d' ') echo"主节点:$master" echo"连接状态:$link_status" if["$link_status"!="up"];then echo" 主从连接中断!" fi fi
5.3 复制相关指标说明
| 指标 | 说明 | 正常值 | 告警阈值 |
|---|---|---|---|
| connected_slaves | 连接的从节点数 | - | 与预期不符 |
| master_link_status | 主从连接状态 | up | down |
| slave_repl_offset | 从节点复制偏移量 | - | 与主节点差异大 |
| master_repl_offset | 主节点复制偏移量 | - | - |
| replication_lag | 复制延迟(秒) | 0 | >10秒 |
6. 客户端连接指标
6.1 连接统计
redis-cli INFO clients # connected_clients: 50 # 当前连接的客户端数 # cluster_connections: 0 # 集群连接数 # maxclients: 10000 # 最大客户端数限制 # blocked_clients: 0 # 阻塞中的客户端数(BLPOP等) # tracking_clients: 0 # 客户端追踪数
6.2 客户端列表
# 查看所有客户端 redis-cli CLIENT LIST # 输出格式: # id=1 addr=192.168.1.100:12345 fd=8 name= age=100 idle=0 flags=N db=0 sub=0 pub=0 multi=-1 cmd=ping # 字段说明: # id: 客户端ID # addr: IP和端口 # fd: 文件描述符 # idle: 空闲时间(秒) # flags: 客户端类型(N=普通,M=master,S=slave) # cmd: 最近执行的命令
6.3 连接监控脚本
#!/bin/bash
# script: redis_clients_check.sh
# 用途:检查客户端连接状态
echo"=== Redis客户端检查 ==="
INFO=$(redis-cli INFO clients)
CLIENTS=$(echo"$INFO"| grep"^connected_clients:"| cut -d: -f2 | tr -d'
')
MAX=$(echo"$INFO"| grep"^maxclients:"| cut -d: -f2 | tr -d'
')
BLOCKED=$(echo"$INFO"| grep"^blocked_clients:"| cut -d: -f2 | tr -d'
')
echo"当前连接数:$CLIENTS"
echo"最大限制:$MAX"
echo"阻塞客户端:$BLOCKED"
# 计算使用率
if["$MAX"!="0"];then
USAGE=$(echo"scale=2;$CLIENTS* 100 /$MAX"| bc)
echo"连接使用率:${USAGE}%"
# 告警阈值
if(( $(echo"$USAGE> 80"| bc -l) ));then
echo" 连接数接近上限!"
fi
fi
# 查找空闲连接
echo""
echo"空闲超过1小时的连接:"
redis-cli CLIENT LIST | awk -F'[,=]''$5>3600 {print $2, $5"秒"}'
6.4 连接异常检测
#!/bin/bash
# script: detect_client_issues.sh
# 用途:检测客户端连接异常
echo"=== 客户端异常检测 ==="
# 1. 检测长期空闲连接
echo"【1】空闲连接(>1小时):"
redis-cli CLIENT LIST |whileIFS=,read-ra fields;do
idle=$(echo"${fields[@]}"| grep -oP'idle=Kd+')
if[ -n"$idle"] && ["$idle"-gt 3600 ];then
addr=$(echo"${fields[@]}"| grep -oP'addr=K[w.:]+')
echo" $addridle=${idle}s"
fi
done
# 2. 检测异常IP连接
echo""
echo"【2】连接数最多的IP:"
redis-cli CLIENT LIST | awk -F'[=, ]''{print $4}'| sort | uniq -c | sort -rn | head -5
# 3. 杀掉空闲连接
read-p"是否关闭空闲超过6小时的连接?(y/N): "confirm
if["$confirm"="y"];then
redis-cli CLIENT LIST |whileIFS=,read-ra fields;do
idle=$(echo"${fields[@]}"| grep -oP'idle=Kd+')
id=$(echo"${fields[@]}"| grep -oP'^id=Kd+')
if[ -n"$idle"] && ["$idle"-gt 21600 ];then
echo"关闭连接:$id(idle=${idle}s)"
redis-cli CLIENT KILL ID"$id"
fi
done
fi
7. 键空间统计
7.1 keyspace信息
redis-cli INFO keyspace # db0:keys=1000000,expires=500000,avg_ttl=3600000000 # db1:keys=0,expires=0,avg_ttl=0 # 字段说明: # keys: 键数量 # expires: 有过期时间的键数量 # avg_ttl: 平均TTL(纳秒)
7.2 键统计脚本
#!/bin/bash # script: redis_keyspace_stats.sh # 用途:键空间统计分析 echo"=== Redis键空间统计 ===" # 查看每个数据库 redis-cli INFO keyspace echo"" # 键数量变化趋势 echo"【键数量历史记录】" if[ -f /tmp/redis_keys_history.txt ];then tail -20 /tmp/redis_keys_history.txt else echo"无历史记录" fi # 记录当前数据 DBINFO=$(redis-cli INFO keyspace | grep"^db0:") KEYS=$(echo"$DBINFO"| cut -d: -f2 | cut -d, -f1 | cut -d= -f2) DATE=$(date +%Y-%m-%d %H:%M:%S) echo"$DATE$KEYS">> /tmp/redis_keys_history.txt # 计算增长率 if[ -f /tmp/redis_keys_prev.txt ];then PREV=$(cat /tmp/redis_keys_prev.txt) PREV_KEYS=$(echo"$PREV"| awk'{print $2}') PREV_TIME=$(echo"$PREV"| awk'{print $1}') PREV_TS=$(date -d"$PREV_TIME"+%s 2>/dev/null ||echo"0") CUR_TS=$(date +%s) DIFF=$((KEYS - PREV_KEYS)) TIME_DIFF=$((CUR_TS - PREV_TS)) if["$TIME_DIFF"-gt 0 ];then RATE=$(echo"scale=2;$DIFF/$TIME_DIFF"| bc) echo"键增长率:$RATE键/秒" fi fi echo"$DATE$KEYS"> /tmp/redis_keys_prev.txt # 大键统计 echo"" echo"【键大小分布】" redis-cli --scan --pattern'*'| head -1000 |whilereadkey;do type=$(redis-cli TYPE"$key"2>/dev/null) if["$type"="string"];then len=$(redis-cli STRLEN"$key"2>/dev/null) elif["$type"="list"];then len=$(redis-cli LLEN"$key"2>/dev/null) elif["$type"="set"];then len=$(redis-cli SCARD"$key"2>/dev/null) elif["$type"="zset"];then len=$(redis-cli ZCARD"$key"2>/dev/null) elif["$type"="hash"];then len=$(redis-cli HLEN"$key"2>/dev/null) fi echo"$key|$type|$len" done| awk -F'|''{print $2,$3}'| sort | uniq -c | sort -rn | head -10
8. 命令统计
8.1 commandstats
redis-cli INFO commandstats # cmdstat_get:calls=1000000,usec=5000000,usec_per_call=5.00 # cmdstat_set:calls=500000,usec=3000000,usec_per_call=6.00 # cmdstat_del:calls=100000,usec=1000000,usec_per_call=10.00
8.2 慢命令分析
#!/bin/bash
# script: analyze_slow_commands.sh
# 用途:分析执行最慢的命令
echo"=== 慢命令分析 ==="
redis-cli INFO commandstats | grep"^cmdstat"|whileIFS=:read-ra line;do
cmd=${line[0]#cmdstat_}
stats=${line[1]}
calls=$(echo"$stats"| grep -oP'calls=Kd+')
usec=$(echo"$stats"| grep -oP'usec=Kd+')
if[ -n"$calls"] && [ -n"$usec"];then
avg_usec=$(echo"scale=2;$usec/$calls"| bc)
echo"$cmd:$calls次, 平均${avg_usec}微秒"
fi
done| sort -t: -k4 -rn | head -10
9. 吞吐指标
9.1 QPS计算
# 查看统计数据 redis-cli INFO stats # instantaneous_ops_per_sec: 5000 # 每秒操作数 # total_commands_processed: 10000000 # 累计处理命令数 # rejected_commands: 0 # 被拒绝的命令数
9.2 QPS监控脚本
#!/bin/bash # script: redis_qps_monitor.sh # 用途:监控Redis QPS echo"=== Redis QPS监控 ===" INFO=$(redis-cli INFO stats) OPS=$(echo"$INFO"| grep"^instantaneous_ops_per_sec:"| cut -d: -f2 | tr -d' ') TOTAL=$(echo"$INFO"| grep"^total_commands_processed:"| cut -d: -f2 | tr -d' ') REJECTED=$(echo"$INFO"| grep"^rejected_commands:"| cut -d: -f2 | tr -d' ') CONNECTIONS=$(echo"$INFO"| grep"^total_connections_received:"| cut -d: -f2 | tr -d' ') echo"当前QPS:$OPS" echo"累计处理命令:$TOTAL" echo"被拒绝命令:$REJECTED" echo"累计连接数:$CONNECTIONS" # 记录QPS历史 echo"$(date +%Y-%m-%d %H:%M:%S)$OPS">> /tmp/redis_qps_history.txt # 计算平均QPS if[ -f /tmp/redis_qps_history.txt ];then echo"" echo"【QPS趋势(最近10分钟)】" tail -10 /tmp/redis_qps_history.txt fi
9.3 延迟监控
#!/bin/bash
# script: redis_latency_monitor.sh
# 用途:监控Redis延迟
echo"=== Redis延迟监控 ==="
# 基准延迟测试
echo"【Redis延迟基准测试】"
foriin{1..5};do
start=$(date +%s%N)
redis-cli PING > /dev/null
end=$(date +%s%N)
latency=$(( (end - start) / 1000000 ))
echo" 测试$i:${latency}ms"
done
# 使用redis-cli内置延迟测试
ifcommand-v redis-cli &> /dev/null;then
echo""
echo"【延迟分布】"
redis-cli --latency-history
fi
10. Sentinel/Cluster状态
10.1 Redis Sentinel监控
# 查看Sentinel状态 redis-cli SENTINEL masters # 查看特定master redis-cli SENTINEL master mymaster # 查看从节点 redis-cli SENTINEL slaves mymaster # 查看Sentinel实例 redis-cli SENTINEL sentinels mymaster
10.2 Sentinel监控脚本
#!/bin/bash
# script: redis_sentinel_monitor.sh
# 用途:监控Redis Sentinel状态
echo"=== Redis Sentinel监控 ==="
MASTER_NAME="mymaster"
# 获取主节点信息
MASTER=$(redis-cli SENTINEL get-master-addr-by-name"$MASTER_NAME")
echo"主节点:$MASTER"
# 检查主节点状态
MASTER_STATUS=$(redis-cli SENTINEL master"$MASTER_NAME"| grep -E"^status$"| awk'{print $2}')
echo"主节点状态:$MASTER_STATUS"
# 获取从节点列表
echo""
echo"从节点:"
redis-cli SENTINEL slaves"$MASTER_NAME"|whilereadline;do
echo" $line"
done
# 检查主观下线
SDOWN=$(redis-cli SENTINEL masters | grep -A1"name"| head -2)
echo""
echo"主观下线状态:$SDOWN"
10.3 Redis Cluster状态
# 查看集群状态 redis-cli cluster info # 输出: # cluster_state: ok # cluster_slots_assigned: 16384 # cluster_slots_ok: 16384 # cluster_nodes: 6
10.4 Cluster监控脚本
#!/bin/bash # script: redis_cluster_monitor.sh # 用途:监控Redis Cluster状态 echo"=== Redis Cluster监控 ===" INFO=$(redis-cli cluster info) STATE=$(echo"$INFO"| grep"^cluster_state:"| cut -d: -f2 | tr -d' ') SLOTS=$(echo"$INFO"| grep"^cluster_slots_assigned:"| cut -d: -f2 | tr -d' ') SLOTS_OK=$(echo"$INFO"| grep"^cluster_slots_ok:"| cut -d: -f2 | tr -d' ') NODES=$(echo"$INFO"| grep"^cluster_nodes:"| cut -d: -f2 | tr -d' ') echo"集群状态:$STATE" echo"已分配槽:$SLOTS" echo"正常槽:$SLOTS_OK" echo"节点数:$NODES" # 检查槽分配 if["$SLOTS"!="16384"];then echo" 槽分配不完整!" fi if["$SLOTS"!="$SLOTS_OK"];then echo" 存在故障槽!" fi # 检查节点状态 echo"" echo"节点详情:" redis-cli cluster nodes |whilereadline;do echo" $line" done
11. 监控工具对比
11.1 redis-cli内置工具
# 实时监控 redis-cli MONITOR # 实时统计 redis-cli INFO # 大键扫描 redis-cli --bigkeys # 延迟测试 redis-cli --latency redis-cli --latency-history # 慢查询 redis-cli SLOWLOG GET 10 # 内存分析 redis-cli MEMORY STATS redis-cli MEMORY USAGE key
11.2 Prometheus + Grafana
# prometheus.yml scrape_configs: -job_name:'redis' static_configs: -targets:['localhost:6379'] metrics_path:/metrics
关键指标:
# redis_exporter采集的指标 redis_memory_used_bytes redis_memory_max_bytes redis_connected_clients redis_commands_total redis_command_duration_seconds_total redis_up
11.3 Grafana仪表盘
推荐使用社区仪表盘:
Redis Dashboard (ID: 763)
Redis / Prometheus (ID: 14091)
11.4 监控工具对比
| 工具 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| redis-cli | 无需安装,功能全面 | 无法长期存储 | 临时诊断 |
| Prometheus | 时序存储,告警 | 需要额外组件 | 生产监控 |
| Grafana | 可视化丰富 | 依赖其他数据源 | 数据展示 |
| redis_exporter | 标准化采集 | 有资源开销 | Prometheus生态 |
| Supervisor | 进程管理 | 非监控工具 | 进程保活 |
12. 告警阈值设置参考
12.1 内存告警
# Prometheus告警规则
groups:
-name:redis
rules:
# 内存使用率警告
-alert:RedisMemoryUsageHigh
expr:redis_memory_used_bytes/redis_memory_max_bytes>0.8
for:5m
labels:
severity:warning
annotations:
summary:"Redis内存使用率高"
description:"实例{{ $labels.instance }}内存使用率{{ $value | humanizePercentage }}"
# 内存使用率危急
-alert:RedisMemoryUsageCritical
expr:redis_memory_used_bytes/redis_memory_max_bytes>0.9
for:1m
labels:
severity:critical
annotations:
summary:"Redis内存使用率危急"
description:"实例{{ $labels.instance }}内存即将耗尽,请立即处理!"
# 内存碎片过高
-alert:RedisHighFragmentation
expr:redis_mem_fragmentation_ratio>1.5
for:10m
labels:
severity:warning
12.2 连接告警
# 连接数过高
-alert:RedisHighConnections
expr:redis_connected_clients/redis_config_maxclients>0.8
for:5m
labels:
severity:warning
12.3 复制告警
# 主从复制中断 -alert:RedisReplicationDown expr:redis_connected_slaves< 1 for: 1m labels: severity: critical for: 1m
12.4 性能告警
# 内存驱逐过多
-alert:RedisHighEviction
expr:rate(redis_evicted_keys_total[5m])>10
for:5m
labels:
severity:warning
# 命令拒绝
-alert:RedisCommandRejected
expr:redis_rejected_commands_total>0
for:1m
labels:
severity:critical
13. 总结:监控大盘设计
13.1 核心监控指标
必选指标(Critical):
内存使用率 used_memory / maxmemory
客户端连接数 connected_clients
主从复制状态 master_link_status
持久化状态 last_bgsave_status
重要指标(Important):
QPS instantaneous_ops_per_sec
复制延迟 slave_repl_offset
内存碎片率 mem_fragmentation_ratio
淘汰键数量 evicted_keys
命令执行时间 commandstats
可选指标(Optional):
Lua脚本内存 used_memory_lua
客户端追踪数 tracking_clients
阻塞客户端数 blocked_clients
13.2 监控Checklist
【基础设施层】 □ 进程存活 (redis-cli PING) □ 进程重启次数 □ 运行时间 (uptime) 【内存层】 □ 内存使用率 □ 内存碎片率 □ 淘汰策略生效次数 □ maxmemory配置 【连接层】 □ 客户端连接数 □ 阻塞客户端数 □ 最大连接数限制 【持久化层】 □ RDB最后保存状态 □ AOF最后写入状态 □ BGSAVE执行情况 【复制层】 □ 主从连接状态 □ 复制延迟 □ 从节点数量 【性能层】 □ QPS □ 命令执行时间 □ 慢查询数量
13.3 告警处理流程
【告警触发】 │ ▼ 【确认告警有效性】 │ ▼ 【初步判断】 - 内存告警 → 检查数据增长、淘汰策略 - 连接告警 → 检查连接泄漏、空闲连接 - 复制告警 → 检查网络、从节点状态 - 性能告警 → 检查慢查询、大键 │ ▼ 【快速处理】 - 扩容内存 - 清理连接 - 重启复制 │ ▼ 【根因分析】 - 分析数据增长原因 - 检查代码逻辑 - 优化配置参数 │ ▼ 【长效机制】 - 调整监控阈值 - 优化容量规划 - 完善告警规则
13.4 监控命令速查
| 指标 | 查看命令 | 监控脚本函数 |
|---|---|---|
| 内存 | INFO memory | grep used_memory |
| 连接 | INFO clients | grep connected_clients |
| 持久化 | INFO persistence | grep rdb/aof |
| 复制 | INFO replication | grep slave/master |
| 键空间 | INFO keyspace | grep db0 |
| 命令 | INFO commandstats | cmdstat_* |
| 性能 | INFO stats | instantaneous_ops_per_sec |
参考信息
版本信息:
Redis:7.4.x
Prometheus:2.50.x
Grafana:11.x
redis_exporter:最新稳定版
操作系统:Rocky Linux 9.4
相关文档:
Redis官方文档:Monitoring
Prometheus redis_exporter
Grafana Redis Dashboard
延伸阅读:
《Redis in Action》
Redis University: Redis for Operations
-
Linux
+关注
关注
88文章
11807浏览量
219508 -
数据库
+关注
关注
7文章
4078浏览量
68524 -
Redis
+关注
关注
0文章
394浏览量
12248
原文标题:运维干货|Redis 应用监控指标大盘点,附监控配置要点
文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
Redis应用监控指标大盘点
评论