5月28日 09:37

Redis 如何进行监控和运维?

Redis 监控和运维是保障线上稳定性的核心能力,面试中常从"监控哪些指标""用什么工具""遇到问题怎么排查"三个角度考察。

关键监控指标

内存指标

内存是 Redis 最核心的资源,重点监控以下项:

bash
INFO memory # 关键字段 used_memory # Redis 分配器分配的内存 used_memory_rss # 操作系统实际分配的内存 mem_fragmentation_ratio # 内存碎片率 = used_memory_rss / used_memory maxmemory # 配置的最大内存限制

碎片率阈值解读:碎片率 > 1.5 说明碎片严重,需触发 MEMORY PURGE 或重启;碎片率 < 1.0 说明使用了 Swap,性能会急剧下降,应立即排查。

命中率直接反映缓存有效性:

bash
keyspace_hits / (keyspace_hits + keyspace_misses)

命中率低于 90% 时需排查是否有过期 key 未清理、缓存穿透等问题。

性能与延迟指标

bash
INFO stats # instantaneous_ops_per_sec — 当前 QPS # total_commands_processed — 累计处理命令数 # 延迟监控(Redis 2.8.13+) CONFIG SET latency-monitor-threshold 100 # 超过 100ms 记录 LATENCY LATEST # 查看最近延迟事件 LATENCY DOCTOR # 诊断延迟原因

QPS 突降或延迟突增是故障的前兆,应设置基线告警。

连接与复制指标

bash
INFO clients # connected_clients — 当前连接数 # blocked_clients — 阻塞等待的客户端数 INFO replication # master_repl_offset / slave_repl_offset — 主从复制偏移量差即同步延迟 # master_link_down_since_seconds — 主从断连时长,应为 0

连接数超过 maxclients 的 80% 就应告警;主从偏移量差持续增大说明同步瓶颈。

持久化指标

bash
INFO persistence # rdb_last_save_time — 最后 RDB 保存时间 # rdb_changes_since_last_save — 上次保存后变更数,过大说明 RDB 间隔过长 # aof_rewrite_in_progress — AOF 重写是否进行中 # aof_current_size / aof_base_size — AOF 文件大小,重写触发比默认 100%

监控工具选型

原生命令

  • INFO:全局状态快照,按 section 查看内存、客户端、复制等
  • SLOWLOG:慢查询日志,SLOWLOG GET 10 查看最近 10 条,关注 usec 字段
  • MONITOR:实时命令流,生产环境慎用(会降低吞吐约 50%),仅用于紧急排查
  • LATENCY:延迟监控框架,可记录延迟事件并给出诊断建议

可观测性体系

Prometheus + Redis Exporter + Grafana 是生产环境主流方案:

bash
# 部署 Redis Exporter docker run -d --name redis-exporter \ -e REDIS_ADDR=redis://localhost:6379 \ prom/redis-exporter # Prometheus 抓取配置 scrape_configs: - job_name: redis static_configs: - targets: ["localhost:9121"]

Grafana 可导入 Redis Dashboard(ID: 11835),覆盖内存、QPS、命中率、延迟等核心面板。

Redis Insight 是 Redis 官方可视化工具,支持内存分析、CLI、Profiler,适合开发调试阶段。

哨兵监控

使用 Sentinel 时,除上述指标外还需关注:

bash
SENTINEL masters # 主节点状态 SENTINEL slaves <master> # 从节点状态 SENTINEL sentinels <master> # 哨兵节点状态

重点监控主观下线/客观下线事件、故障转移耗时。

常见故障排查

内存不足

现象:OOM command not allowed when used memory > maxmemory

bash
INFO memory # 查看内存使用 redis-cli --bigkeys # 扫描大 Key MEMORY USAGE <key> # 查看单个 key 内存占用

解决:调整 maxmemory、设置淘汰策略 allkeys-lru、用 UNLINK 替代 DEL 异步删除大 Key(避免阻塞主线程)、分批 SCAN 删除。

慢查询

bash
SLOWLOG GET 10 # 查看慢查询 CONFIG GET slowlog-log-slower-than # 查看阈值

常见原因:KEYS * 全量扫描、大 Key 操作(HGETALL 千万级 hash)、SORT 命令。替代方案:SCAN 替代 KEYSHSCAN 替代 HGETALL,Pipeline 减少网络往返。

主从同步延迟

bash
INFO replication # master_repl_offset 与 slave_repl_offset 的差值

增大 repl-backlog-size、优化网络、避免主节点大 Key 写入导致积压。

连接数打满

bash
INFO clients CONFIG GET maxclients

设置 timeout 自动断开空闲连接、排查连接泄漏、适当调大 maxclients

运维操作要点

备份恢复

RDB 备份用 BGSAVE(后台执行,不阻塞主线程),AOF 备份直接拷贝 .aof 文件。恢复时停止 Redis → 替换文件 → 启动。生产建议 RDB + AOF 混合持久化(Redis 4.0+)。

数据迁移

  • MIGRATE 命令:迁移单个或多个 key,原子操作
  • RedisShake:阿里开源工具,支持全量+增量同步,适合大规模迁移
bash
# RedisShake 配置 source.type: standalone source.address: source.redis.com:6379 target.type: standalone target.address: target.redis.com:6379 ./redis-shake.linux -type=sync -conf=shake.conf

集群扩缩容

bash
# 添加节点 redis-cli --cluster add-node <new-ip>:<port> <exist-ip>:<port> # 重新分配槽位 redis-cli --cluster reshard <exist-ip>:<port> \ --cluster-from <src-node-id> \ --cluster-to <dst-node-id> \ --cluster-slots 1000

删除节点前必须先迁走其槽位,否则拒绝删除。

性能优化配置

bash
# 内存 maxmemory 2gb maxmemory-policy allkeys-lru echo never > /sys/kernel/mm/transparent_hugepage/enabled # 关闭 THP # 持久化 appendonly yes appendfsync everysec # 折中方案,最多丢 1 秒数据 auto-aof-rewrite-min-size 64mb # 网络 tcp-backlog 511 tcp-keepalive 300 timeout 300 # 空闲连接超时

告警建议:内存使用率 > 80%、QPS 下降 > 50%、延迟 > 100ms、连接数 > 80% maxclients。

以上内容覆盖了 Redis 监控运维的核心考察点,面试中回答时应遵循"指标→工具→排查→优化"的递进逻辑,展示系统性思维而非零散知识点。

标签:Redis