Skip to content

Redis 容量监控

容量监控简介

什么是容量监控?

容量监控涉及跟踪和分析Redis资源使用情况,确保系统有足够的资源满足当前和未来需求。它有助于:

  • 防止资源耗尽
  • 规划未来扩展
  • 优化资源利用率
  • 识别性能瓶颈
  • 确保高可用性

需要监控的关键资源

  • 内存:Redis最关键的资源
  • 存储:用于持久化文件(RDB/AOF)
  • CPU:用于命令执行和后台任务
  • 网络:用于客户端连接和复制
  • 连接数:客户端连接数量

内存监控

关键内存指标

指标描述命令
used_memoryRedis使用的总内存`redis-cli info memory
used_memory_rssRSS内存(包括碎片)`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 key2

Redis Exporter + Prometheus + Grafana

  1. 安装Redis Exporter:

    bash
    wget 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
  2. 配置Prometheus:

    yaml
    scrape_configs:
      - job_name: 'redis'
        static_configs:
          - targets: ['localhost:9121']
  3. 创建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_progressAOF重写是否进行中`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 get

CPU告警

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 + 增长率)^时间

容量规划示例

  1. 当前内存使用:4GB
  2. 增长率:每月10%
  3. 期望提前时间:3个月
  4. 预计使用量:4GB × (1 + 0.1)^3 = 5.324GB
  5. 行动:计划在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或云提供商的告警服务。