外观
Redis 容量监控
容量监控简介
什么是容量监控?
容量监控涉及跟踪和分析Redis资源使用情况,确保系统有足够的资源满足当前和未来需求。它有助于:
- 防止资源耗尽
- 规划未来扩展
- 优化资源利用率
- 识别性能瓶颈
- 确保高可用性
需要监控的关键资源
- 内存:Redis最关键的资源
- 存储:用于持久化文件(RDB/AOF)
- CPU:用于命令执行和后台任务
- 网络:用于客户端连接和复制
- 连接数:客户端连接数量
内存监控
关键内存指标
| 指标 | 描述 | 命令 |
|---|---|---|
| used_memory | Redis使用的总内存 | `redis-cli info memory |
| used_memory_rss | RSS内存(包括碎片) | `redis-cli info memory |
| mem_fragmentation_ratio | 内存碎片率 | `redis-cli info memory |
| used_memory_peak | 最大内存使用量 | `redis-cli info memory |
| maxmemory | 配置的最大内存 | redis-cli config get maxmemory |
| mem_allocator | 使用的内存分配器 | `redis-cli info memory |
内存使用细分
bash
# 详细内存使用情况
redis-cli info memory
# 数据集内存使用
redis-cli info memory | grep used_memory_dataset
# 开销内存使用
redis-cli info memory | grep used_memory_overhead
# Lua脚本内存使用
redis-cli info memory | grep used_memory_lua内存监控工具
Redis CLI
bash
# 实时监控内存使用
redis-cli --stat
# 获取大键
redis-cli --bigkeys
# 获取特定键的内存使用
redis-cli memory usage key1
redis-cli memory usage key2Redis Exporter + Prometheus + Grafana
安装Redis Exporter:
bashwget https://github.com/oliver006/redis_exporter/releases/download/v1.50.0/redis_exporter-v1.50.0.linux-amd64.tar.gz tar xzf redis_exporter-v1.50.0.linux-amd64.tar.gz ./redis_exporter --redis.addr redis://localhost:6379配置Prometheus:
yamlscrape_configs: - job_name: 'redis' static_configs: - targets: ['localhost:9121']创建Grafana仪表板:
- 导入Redis仪表板(ID: 763)
- 监控内存使用、碎片率和关键指标
内存告警
yaml
# Prometheus告警规则
groups:
- name: redis-alerts
rules:
- alert: RedisHighMemoryUsage
expr: redis_memory_used_bytes / redis_memory_max_bytes * 100 > 80
for: 5m
labels:
severity: warning
annotations:
summary: "Redis高内存使用"
description: "Redis实例 {{ $labels.instance }} 内存使用超过80%"
- alert: RedisHighFragmentation
expr: redis_memory_fragmentation_ratio > 1.5
for: 10m
labels:
severity: warning
annotations:
summary: "Redis高内存碎片"
description: "Redis实例 {{ $labels.instance }} 碎片率超过1.5"存储监控
关键存储指标
| 指标 | 描述 | 命令 |
|---|---|---|
| rdb_last_save_time | 上次RDB保存时间戳 | `redis-cli info persistence |
| rdb_changes_since_last_save | 上次RDB以来的更改数 | `redis-cli info persistence |
| aof_current_size | 当前AOF文件大小 | `redis-cli info persistence |
| aof_rewrite_in_progress | AOF重写是否进行中 | `redis-cli info persistence |
存储使用监控
bash
# 检查RDB文件大小
ls -lh /var/lib/redis/dump.rdb
# 检查AOF文件大小
ls -lh /var/lib/redis/appendonly.aof
# 监控磁盘空间
df -h /var/lib/redis存储告警
yaml
# 存储相关Prometheus告警规则
- alert: RedisRDBNotSaving
expr: time() - redis_rdb_last_save_timestamp_seconds > 3600
for: 10m
labels:
severity: critical
annotations:
summary: "Redis RDB未保存"
description: "Redis实例 {{ $labels.instance }} 已超过1小时未保存RDB"
- alert: RedisAofSizeGrowing
expr: rate(redis_aof_current_size_bytes[1h]) > 100 * 1024 * 1024
for: 30m
labels:
severity: warning
annotations:
summary: "Redis AOF大小快速增长"
description: "Redis实例 {{ $labels.instance }} AOF文件增长速度超过100MB/小时"CPU监控
关键CPU指标
| 指标 | 描述 | 命令 |
|---|---|---|
| used_cpu_sys | 系统CPU使用率 | `redis-cli info cpu |
| used_cpu_user | 用户CPU使用率 | `redis-cli info cpu |
| used_cpu_sys_children | 子进程系统CPU | `redis-cli info cpu |
| used_cpu_user_children | 子进程用户CPU | `redis-cli info cpu |
CPU使用分析
bash
# 实时监控CPU使用
redis-cli --stat
# 检查Redis进程CPU使用
top -p $(pidof redis-server)
# 检查命令CPU使用
redis-cli slowlog getCPU告警
yaml
# CPU相关Prometheus告警规则
- alert: RedisHighCPUUsage
expr: (redis_cpu_sys_seconds_total + redis_cpu_user_seconds_total) / time() > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: "Redis高CPU使用"
description: "Redis实例 {{ $labels.instance }} CPU使用率超过80%"网络监控
关键网络指标
| 指标 | 描述 | 命令 |
|---|---|---|
| total_net_input_bytes | 总网络输入 | `redis-cli info stats |
| total_net_output_bytes | 总网络输出 | `redis-cli info stats |
| instantaneous_input_kbps | 当前输入速率 | `redis-cli info stats |
| instantaneous_output_kbps | 当前输出速率 | `redis-cli info stats |
网络使用分析
bash
# 监控网络使用
redis-cli --stat
# 检查网络连接
netstat -an | grep 6379
# 使用sar检查网络流量
sar -n DEV 1 10网络告警
yaml
# 网络相关Prometheus告警规则
- alert: RedisHighNetworkOutput
expr: redis_net_output_bytes_total / 1024 / 1024 / 60 > 100
for: 5m
labels:
severity: warning
annotations:
summary: "Redis高网络输出"
description: "Redis实例 {{ $labels.instance }} 网络输出超过100MB/分钟"连接监控
关键连接指标
| 指标 | 描述 | 命令 |
|---|---|---|
| connected_clients | 当前客户端连接数 | `redis-cli info clients |
| client_longest_output_list | 最长输出列表 | `redis-cli info clients |
| client_biggest_input_buf | 最大输入缓冲区 | `redis-cli info clients |
| rejected_connections | 拒绝的连接数 | `redis-cli info stats |
连接分析
bash
# 列出所有客户端
redis-cli client list
# 杀死空闲客户端
redis-cli client kill type idle skipme yes
# 实时监控连接
redis-cli monitor | grep connect连接告警
yaml
# 连接相关Prometheus告警规则
- alert: RedisHighConnectionCount
expr: redis_connected_clients > 1000
for: 5m
labels:
severity: warning
annotations:
summary: "Redis高连接数"
description: "Redis实例 {{ $labels.instance }} 连接数超过1000"
- alert: RedisRejectingConnections
expr: delta(redis_rejected_connections_total[5m]) > 0
for: 1m
labels:
severity: critical
annotations:
summary: "Redis拒绝连接"
description: "Redis实例 {{ $labels.instance }} 正在拒绝连接"命令监控
关键命令指标
| 指标 | 描述 | 命令 |
|---|---|---|
| instantaneous_ops_per_sec | 每秒命令数 | `redis-cli info stats |
| total_commands_processed | 处理的总命令数 | `redis-cli info stats |
| commandstats | 命令特定统计信息 | redis-cli info commandstats |
命令分析
bash
# 使用频率最高的命令
redis-cli info commandstats | sort -k2 -r | head -10
# 监控慢命令
redis-cli slowlog get 10
# 配置slowlog
redis-cli config set slowlog-log-slower-than 10000
redis-cli config set slowlog-max-len 1000命令告警
yaml
# 命令相关Prometheus告警规则
- alert: RedisHighCommandRate
expr: rate(redis_commands_processed_total[1m]) > 10000
for: 5m
labels:
severity: warning
annotations:
summary: "Redis高命令速率"
description: "Redis实例 {{ $labels.instance }} 每秒处理超过10000个命令"
- alert: RedisSlowCommands
expr: delta(redis_slowlog_length[5m]) > 10
for: 1m
labels:
severity: warning
annotations:
summary: "检测到Redis慢命令"
description: "Redis实例 {{ $labels.instance }} 在5分钟内记录了超过10个慢命令"复制监控
关键复制指标
| 指标 | 描述 | 命令 |
|---|---|---|
| master_repl_offset | 主节点复制偏移量 | `redis-cli info replication |
| slave_repl_offset | 从节点复制偏移量 | `redis-cli info replication |
| repl_backlog_active | 复制缓冲区是否激活 | `redis-cli info replication |
| repl_backlog_size | 复制缓冲区大小 | `redis-cli info replication |
复制延迟监控
bash
# 检查从节点复制延迟
redis-cli info replication | grep lag
# 实时监控复制
redis-cli --stat | grep master
tail -f /var/log/redis/redis-server.log | grep replication复制告警
yaml
# 复制相关Prometheus告警规则
- alert: RedisReplicationLag
expr: redis_replication_offset_master_bytes - redis_replication_offset_slave_bytes > 1000000
for: 5m
labels:
severity: critical
annotations:
summary: "Redis复制延迟"
description: "Redis从节点 {{ $labels.instance }} 复制延迟超过1MB"基于监控数据的容量规划
趋势分析
- 收集历史数据:存储30-90天的指标数据
- 识别增长模式:分析内存、命令速率和连接数增长
- 预测未来需求:使用趋势预测资源何时会耗尽
- 规划扩展:确定何时添加节点或升级资源
容量规划公式
预计容量 = 当前使用率 × (1 + 增长率)^时间容量规划示例
- 当前内存使用:4GB
- 增长率:每月10%
- 期望提前时间:3个月
- 预计使用量:4GB × (1 + 0.1)^3 = 5.324GB
- 行动:计划在2个月内升级到8GB RAM
最佳实践
监控频率
- 实时指标:关键指标每1-5秒监控一次
- 历史数据:每1分钟存储聚合指标,保留90天
- 长期趋势:每1小时存储聚合指标,保留1年
告警策略
- 关键告警:立即通知(电子邮件、短信、PagerDuty)
- 警告告警:每日摘要电子邮件
- 信息告警:记录供审查
自动操作
- 自动扩展:当容量阈值达到时自动添加节点
- 内存优化:当内存使用率高时自动驱逐旧数据
- 连接管理:杀死空闲连接以释放资源
文档
- 记录指标:定义每个指标的含义和可接受范围
- 记录告警:记录告警阈值和响应程序
- 记录容量计划:保留容量预测和扩展操作记录
常见容量问题及解决方案
内存耗尽
问题:Redis内存不足
解决方案:
- 尽可能增加maxmemory
- 实施更好的淘汰策略
- 优化数据结构
- 使用Redis Cluster进行水平扩展
- 删除不必要的数据
高CPU使用率
问题:Redis CPU使用率持续居高
解决方案:
- 优化慢命令
- 实施流水线
- 减少写入操作
- 水平扩展
- 升级到更快的CPU
网络瓶颈
问题:网络带宽饱和
解决方案:
- 优化命令使用
- 对大值实施压缩
- 使用Redis Cluster分散网络负载
- 升级网络基础设施
- 将客户端移近Redis服务器
常见问题(FAQ)
Q1: Redis容量监控应该关注哪些指标?
A1: 最关键的监控指标包括:
- 内存使用和碎片率
- CPU使用率
- 网络吞吐量
- 客户端连接数
- 命令速率
- 复制延迟(主从设置)
Q2: 我应该多久检查一次Redis容量指标?
A2: 对于实时监控,关键指标每1-5秒检查一次。对于趋势分析,每分钟存储聚合指标,保留90天。对于长期容量规划,每小时存储聚合指标,保留1年。
Q3: 什么是良好的内存碎片率?
A3: 碎片率在1.0到1.5之间是可接受的。超过1.5表示高碎片,低于1.0表示Redis使用的RSS内存多于分配的内存(可能由于内存分配器开销)。
Q4: 我如何知道何时扩展Redis?
A4: 当出现以下情况时扩展Redis:
- 内存使用率持续超过maxmemory的70-80%
- CPU使用率持续超过80%
- 命令速率接近最大容量
- 网络吞吐量饱和
- 复制延迟持续较高
Q5: 我可以使用哪些工具进行Redis容量监控?
A5: 推荐的工具包括:
- Redis CLI用于基本监控
- Redis Exporter + Prometheus + Grafana用于全面监控
- RedisInsight用于GUI监控
- Datadog/New Relic用于托管监控解决方案
- 云提供商工具(AWS CloudWatch、Azure Monitor、GCP Stackdriver)
Q6: 如何设置Redis容量问题的告警?
A6: 基于关键指标的阈值设置告警:
- 内存使用率 > maxmemory的80%
- CPU使用率 > 80%
- 网络吞吐量 > 容量的80%
- 复制延迟 > 1MB
- 拒绝连接数 > 0
使用Prometheus Alertmanager、Grafana Alerting或云提供商的告警服务。
