首页/数据/数据库速查/复制健康巡检脚本(实战)
Redis 运维与场景124 条

复制健康巡检脚本(实战)

写一个 5 行的巡检脚本:对比主从 offset、检查链路状态、输出延迟字节数;可挂到 cron/监控系统做日常巡检。

数据库速查数据更新于 2026-10-13

复制健康巡检脚本是什么

Redis 复制的健康度可以只用几个 INFO replication 字段判断:主库的 master_repl_offset、从库的 slave_repl_offset 与其差值、以及 master_link_status。把这几个值采集下来做阈值判断,就是一份最小可用的巡检脚本,可以挂到 cron 或监控系统里定期执行;关键是要处理连接失败的情况,否则网络故障时取到空值反而会被判成正常。

基本信息

适用版本Redis 全版本(INFO replication 字段名在 5.0 前后一致)
主库字段master_repl_offset、connected_slaves
从库字段slave_repl_offset、master_link_status、master_last_io_seconds_ago
告警条件链路状态非 up,或 offset 差值持续超阈值
采集频率1 分钟足够,过密会增加 INFO 调用开销
权限要求只读账号即可,避免使用管理账号

典型使用场景

  • 日常巡检:定时比对主从 offset 差值,发现复制积压
  • 值班告警:链路断开与延迟超标第一时间通知
  • 故障复盘:用采集的历史数据定位复制异常的时间点
  • 容量评估:观察高写入期间延迟差值的变化趋势
  • 多从库场景:批量巡检所有从库,快速找出异常节点

巡检脚本示例

巡检脚本示例
#!/bin/bash
# 采集主从 offset 差值,差值超阈值或链路异常则输出告警
M=$(redis-cli -h 10.0.0.10 INFO replication | grep master_repl_offset | cut -d: -f2 | tr -d '\r')
S=$(redis-cli -h 10.0.0.11 INFO replication | grep slave_repl_offset | cut -d: -f2 | tr -d '\r')
LINK=$(redis-cli -h 10.0.0.11 INFO replication | grep master_link_status | cut -d: -f2 | tr -d '\r')

# 连接失败时 M/S 为空,必须先判空再比较,否则空值会被当成正常
[ -z "$M" ] || [ -z "$S" ] && { echo "ALERT: cannot read INFO"; exit 1; }
echo "link=$LINK master=$M slave=$S diff=$((M-S))"
[ "$LINK" = "up" ] && [ $((M-S)) -lt 1048576 ] || echo ALERT

字段核对与阈值参考

字段核对与阈值参考
# 查看从库完整复制状态
redis-cli -h 10.0.0.11 INFO replication

# 关注四个字段
# master_link_status: up / down
# master_last_io_seconds_ago: 最近一次与主库通信的间隔
# slave_repl_offset: 已复制的偏移量
# slave_read_only: 从库是否只读
redis-cli -h 10.0.0.11 INFO replication | grep -E 'master_link_status|master_last_io_seconds_ago|slave_repl_offset|slave_read_only'

字段读法与阈值

字段含义异常判断
master_repl_offset主库当前偏移量增长停滞说明主库写入中断
slave_repl_offset从库已同步偏移量与主库差值持续扩大即为积压
master_link_status链路状态非 up 即断链,需立即处理
master_last_io_seconds_ago距上次与主库通信的秒数持续增大说明链路已无数据往来
巡检频率 1 分钟足够:INFO 命令本身开销不大,但高频采集会累积可观流量,尤其是从库多、指标多时;把采集结果落地到监控系统比现场反复执行命令更利于分析趋势。
阈值不要写死一个值:低写入实例用 1MB 阈值永远不会告警,高写入实例则会天天误报;应结合自身写入速率设定基线,并给出「持续多久才算异常」的持续条件。

易错点

  • 阈值固定不变:低写入实例永不告警,高写入实例天天误报,最终告警被忽略
  • 脚本不处理 redis-cli 连接失败:取到空值时比较结果为正常,真实断链被漏报
  • 只看 offset 差值不看链路状态:链路已断但差值暂时很小时告警不触发
  • 采集频率过密(如每秒一次):大量 INFO 调用给实例增加无谓开销
  • 用管理账号跑巡检:脚本被读取即泄露高权限,应使用只读账号

数据来源与参考

  • Redis 官方文档: INFO replication
  • Redis 官方文档: 复制(监控)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌