mysql主从同步是常见的数据库高可用架构方案,通过主库的数据变更日志同步到从库,实现数据冗余和读写分离。监控主从同步的健康状况,能够及时发现同步中断、延迟过大等异常,避免数据不一致引发业务问题。

通过SHOW SLAVE STATUS命令监控核心状态
mysql提供了内置的SHOW SLAVE STATUSG命令,能够展示从库同步的详细状态信息,是排查同步问题最基础的方式。在从库执行该命令后,重点关注以下几个核心字段:
- Slave_IO_Running:从库的IO线程状态,负责从主库拉取binlog日志,正常状态为Yes,若为No说明IO线程异常,无法获取主库日志。
- Slave_SQL_Running:从库的SQL线程状态,负责执行拉取到的binlog日志,正常状态为Yes,若为No说明日志回放过程出现异常。
- Seconds_Behind_Master:从库同步延迟的秒数,数值为0表示无延迟,数值越大说明同步延迟越高,若值为NULL说明同步线程异常。
- Last_Error:SQL线程执行过程中出现的错误信息,若同步中断,该字段会展示具体的错误原因,比如主键冲突、表不存在等。
以下是执行命令的示例及部分输出解读:
-- 在从库执行查看同步状态命令 SHOW SLAVE STATUSG -- 重点关注以下输出字段 Slave_IO_Running: Yes Slave_SQL_Running: Yes Seconds_Behind_Master: 0 Last_Error:
监控主从同步的关键指标
除了基础的状态检查,还需要长期监控以下关键指标,及时发现潜在的同步问题:
1. 同步延迟指标
Seconds_Behind_Master是直观的延迟指标,但需要注意该指标的计算逻辑是基于从库当前时间戳和binlog中事件时间戳的差值,在网络波动或者从库负载过高时可能存在偏差。可以结合从库的SHOW MASTER STATUS命令获取主库的binlog位点,对比从库已执行的位点,更精准判断延迟情况。
2. 同步线程存活状态
定期检查Slave_IO_Running和Slave_SQL_Running是否都为Yes,若其中一个为No,需要立即排查原因。常见的原因包括主库binlog被清理、从库网络不通、主从server-id冲突、权限不足等。
3. 主从数据一致性
同步状态正常并不代表数据完全一致,可能出现主从数据不一致的情况。可以使用pt-table-checksum工具定期校验主从数据的一致性,发现不一致后使用pt-table-sync工具进行修复。
使用脚本实现自动化监控
手动执行命令检查同步状态效率较低,可以编写脚本定期自动检查,出现异常时发送告警。以下是使用shell脚本监控主从同步状态的示例:
#!/bin/bash
# 数据库连接配置
MYSQL_USER="monitor_user"
MYSQL_PASS="monitor_password"
MYSQL_HOST="127.0.0.1"
MYSQL_PORT=3306
# 执行SHOW SLAVE STATUS命令,提取关键字段
SLAVE_STATUS=$(mysql -u${MYSQL_USER} -p${MYSQL_PASS} -h${MYSQL_HOST} -P${MYSQL_PORT} -e "SHOW SLAVE STATUSG" 2>/dev/null)
# 提取IO线程和SQL线程状态
SLAVE_IO_RUNNING=$(echo "${SLAVE_STATUS}" | grep "Slave_IO_Running" | awk '{print $2}')
SLAVE_SQL_RUNNING=$(echo "${SLAVE_STATUS}" | grep "Slave_SQL_Running" | awk '{print $2}')
# 提取同步延迟
SECONDS_BEHIND_MASTER=$(echo "${SLAVE_STATUS}" | grep "Seconds_Behind_Master" | awk '{print $2}')
# 判断线程状态是否异常
if [ "${SLAVE_IO_RUNNING}" != "Yes" ] || [ "${SLAVE_SQL_RUNNING}" != "Yes" ]; then
echo "告警:主从同步线程异常,IO线程状态:${SLAVE_IO_RUNNING},SQL线程状态:${SLAVE_SQL_RUNNING}"
# 这里可以添加发送告警的逻辑,比如调用告警接口、发送邮件等
fi
# 判断同步延迟是否超过阈值,这里设置阈值为10秒
if [ "${SECONDS_BEHIND_MASTER}" != "NULL" ] && [ "${SECONDS_BEHIND_MASTER}" -gt 10 ]; then
echo "告警:主从同步延迟过大,当前延迟:${SECONDS_BEHIND_MASTER}秒"
fi
第三方监控工具的使用
对于大规模的mysql集群,手动脚本监控维护成本较高,可以使用成熟的第三方监控工具实现统一监控:
- Prometheus + Grafana:通过mysqld_exporter采集mysql的同步状态指标,包括同步线程状态、延迟、位点信息等,在Grafana中配置可视化面板,设置告警规则,出现异常时自动触发告警。
- Zabbix:通过自定义监控项,调用mysql命令获取同步状态数据,配置触发器和告警动作,实现对主从同步的实时监控。
- Percona Monitoring and Management (PMM):专门针对mysql等数据库的监控工具,内置了主从同步监控的模板,能够快速部署并查看同步状态、延迟趋势等信息。
常见同步异常处理方式
监控到同步异常后,需要根据具体原因进行处理:
- 如果是IO线程异常,检查从库到主库的网络连通性、主库的binlog是否开启、从库的同步账号权限是否正确、server-id是否冲突。
- 如果是SQL线程异常,查看Last_Error字段的错误信息,若是数据冲突问题,可以手动跳过错误的事务,或者重新搭建从库。
- 如果是同步延迟过大,检查从库的硬件资源使用情况,优化从库的查询性能,或者调整主库的binlog刷盘策略,降低从库的回放压力。
注意:跳过同步错误需要谨慎操作,避免造成主从数据不一致,生产环境建议先确认错误原因,再选择合适的处理方式。
总结
监控mysql主从同步健康状况需要结合内置命令、关键指标、自动化脚本和第三方工具,形成多层次的监控体系。日常运维中需要定期检查同步状态,关注同步延迟和数据一致性,及时发现并处理异常,保障主从架构的稳定运行,为业务提供可靠的数据服务。