复制健康巡检脚本是什么
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 阈值永远不会告警,高写入实例则会天天误报;应结合自身写入速率设定基线,并给出「持续多久才算异常」的持续条件。