跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

如何监控主从复制链路的健康状态_Zabbix监控与IO/SQL线程检查

查MySQL主从复制状态应执行SHOW SLAVE STATUS\G,重点检查Slave_IO_Running和Slave_SQL_Running是否均为Yes,任一为No即复制中断;Seconds_Behind_Master为NULL表明SQL线程已停止。 怎么查 MySQL 主从复制的 IO 和 SQL 线程是否在运行 主从复制挂了,第一反应不是翻日志,而是直接看两个线程状态——
Slave_IO_Running
和
Slave_SQL_Running
。它们只要有一个是
NO
,链路就断了。 实操建议: 登录从库执行
SHOW SLAVE STATUS\G
,重点盯住这两行输出,别被其他几十行字段带偏 注意
Seconds_Behind_Master
为
NULL
时,往往意味着 SQL 线程已停止(不是延迟大,是彻底卡死) 如果
IO_Running
是
Connecting
,说明从库连不上主库——检查
Master_Host
、网络、主库
bind_address
和防火墙 SQL 线程报错常见于主库执行了从库不兼容的操作,比如没主键的表被更新,错误号会写在
Last_SQL_Errno
和
Last_SQL_Error
里 Zabbix 怎么抓取 Slave_IO_Running 这类状态值 Zabbix 本身不理解 MySQL 复制状态,得靠自定义监控项把
SHOW SLAVE STATUS
的结果“掰开”喂给它。 实操建议: 用 Zabbix Agent 的
UserParameter
配置,例如:
UserParameter=mysqld.replica.io_running,mysql -Nse "SHOW SLAVE STATUS\G" 2>/dev/null | grep "Slave_IO_Running:" | awk '{print $2}'
必须加
-N
(禁用列名)和
-s
(跳过表格格式),否则 grep 会匹配失败 别用
mysql -e "SHOW SLAVE STATUS"
,因为默认输出带横线分隔符,
grep
容易误匹配 Zabbix item 的类型选
Text
或
Character
,别设成
Numeric
——状态是
Yes
/
No
,不是数字 为什么 Zabbix 显示 “OK” 但实际复制已经延迟数小时
IO_Running
和
SQL_Running
都是
Yes
,不代表复制健康。真正危险的是
Seconds_Behind_Master
持续上涨,而 Zabbix 默认不监控它,或只设了个静态阈值(比如 > 60 秒告警),忽略了业务峰值期的合理波动。 实操建议: 把
Seconds_Behind_Master
单独做成一个 Zabbix item,类型设为
Numeric (unsigned)
,单位秒 告警策略不能只看绝对值:对写入密集型从库,延迟 300 秒可能正常;对低频更新库,延迟 60 秒就得立刻响应 配合监控
Exec_Master_Log_Pos
和
Read_Master_Log_Pos
的差值,能判断 IO 是否拉取滞后(差值大 + 延迟高 = 主库写太快,从库网络或磁盘慢) 避免用
SHOW SLAVE STATUS
全量查询再解析——每秒一次太重,Zabbix agent 内部应缓存最近一次结果,或改用 performance_schema 表(如
replication_connection_status
)替代 从库重启后 Zabbix 监控项突然全失效 不是 Zabbix 出问题,是 MySQL 重启后,
SHOW SLAVE STATUS
在复制未启动前返回空,导致所有基于它的 UserParameter 解析失败,Zabbix 收到空值或报错,触发异常状态。 实操建议: 在 UserParameter 脚本末尾加兜底逻辑,例如:
|| echo "NULL"
,确保总有输出,避免 Zabbix 报
NOTSUPPORTED
检查 Zabbix agent 日志,搜索
cannot parse
或
timeout
,常因 MySQL 启动慢、agent 超时 3 秒导致采集失败 从库启动脚本里加个等待环节:
until mysql -e "SHOW SLAVE STATUS\G" >/dev/null 2>&1; do sleep 2; done
,再启动 Zabbix agent 不要依赖
Slave_SQL_Running_State
这类字符串字段做告警——它内容不稳定(如 “Reading event from the relay log” / “System lock”),容易误判 真正难的不是取值,是区分“瞬时抖动”和“持续恶化”。比如
Seconds_Behind_Master
从 0 跳到 120 又回落,可能是单条大事务;但如果连续 5 分钟 > 300,大概率是 relay log 写满、磁盘 IO 瓶颈或 SQL 线程被锁表卡住——这时候得切到
SHOW PROCESSLIST
和
information_schema.INNODB_TRX
查现场。

相关文章