查seconds_behind_master需连续采样判断趋势,避免单次值误判;null时须检查io/sql线程状态;并行复制下需结合performance_schema验证;推荐pt-heartbeat测端到端真实延迟。

查 Seconds_Behind_Master 不能只看单次值
主从延迟不是“当前延迟多少秒”的静态快照,而是 IO 线程和 SQL 线程协同状态的瞬时反映。直接执行 SHOW SLAVE STATUS\G 拿到的 Seconds_Behind_Master 可能为 NULL(SQL 线程未运行)、0(看似正常但可能刚追上又卡住),或短暂跳变(如大事务提交后突增)。监控脚本必须连续采样、做趋势判断。
- 至少每 10 秒采集一次,连续 3 次 ≥ 60 秒才触发告警——避免网络抖动或短时锁表误报
- 遇到
Seconds_Behind_Master: NULL时,要同时检查Slave_IO_Running和Slave_SQL_Running是否都为Yes,否则是复制已中断 - MySQL 5.7+ 中,若启用了并行复制(
slave_parallel_workers > 0),Seconds_Behind_Master计算逻辑有变化,可能滞后于真实延迟,需配合performance_schema.replication_applier_status_by_coordinator辅助验证
用 mysql 命令行 + shell 脚本做轻量级轮询
不依赖外部服务、不装额外组件,纯 shell 就能跑起来。关键是把连接、解析、判断逻辑写稳,别让脚本自己先挂掉。
- 连接要用
--defaults-file指定配置文件(含 host/user/password),避免密码明文出现在ps aux或 bash history 里 - 解析
SHOW SLAVE STATUS输出时,别用模糊的awk '/Seconds_Behind_Master/ {print $2}'—— 字段顺序可能因 MySQL 版本微调;改用awk -F ': ' '/^Seconds_Behind_Master:/ {print $2}' - 对空值、非数字做兜底:比如
[[ "$delay" =~ ^[0-9]+$ ]] || delay=0,防止后续数值比较报错 - 示例片段:
delay=$(mysql --defaults-file=/etc/mysql/slave.cnf -Nse "SHOW SLAVE STATUS\G" 2>/dev/null | awk -F ': ' '/^Seconds_Behind_Master:/ {print $2}' | tr -d '[:space:]')
pt-heartbeat 是唯一值得长期用的方案
自建轮询脚本能跑通,但扛不住高负载、跨机房、主从切换等真实场景。pt-heartbeat 不是“可选工具”,是经过千万级生产环境验证的延迟度量事实标准。
- 原理是主库定时写时间戳到一张专用表,从库读该表并比对本地时间——绕过复制机制本身的不可靠性,测的是端到端真实延迟
- 必须在主库创建心跳表:
pt-heartbeat --create-table --database=test --table=heartbeat --host=master-host,且确保该表不被replicate-ignore-db过滤 - 从库侧运行时加
--check参数(不加就是单纯打点);报警阈值用--threshold 30,超时退出码为 1,方便接进监控系统 - 注意:如果从库启用了
read_only=ON,pt-heartbeat --check仍可读,但--update必须在主库运行,别配错 host
报警通道选 curl 推企业微信/钉钉最省事
别写邮件发送逻辑,也别对接复杂告警平台。用现成 webhook,5 行脚本搞定通知,重点是带上上下文信息,别只甩一句“延迟高了”。
- HTTP body 必须是 JSON,且 key 名按目标平台要求来(比如钉钉是
text,企业微信是content) - 消息里至少包含:实例 IP、当前延迟值、最近 3 次延迟序列、
Slave_SQL_Running状态——没有这些,DBA 第一反应是“哪个从库?”“是真卡还是假死?” - 加个
sleep 300防止风暴:同一实例连续告警只发一次,5 分钟内重复不推送 - 示例(企业微信):
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx' \ -H 'Content-Type: application/json' \ -d '{"msgtype": "text", "text": {"content": "【MySQL从库延迟】10.0.1.12:3306, 当前延迟 86s (82/84/86), SQL线程: Yes"}}'
REPLICATION CLIENT 权限,别给 ALL PRIVILEGES;所有采集日志必须定期 logrotate,否则半年后发现磁盘被 monitor_slave.log 占满 20GB。











