在Linux服务器上部署MySQL主从复制架构后,仅完成复制配置并不足以保障业务的稳定运行,需要搭建配套的监控体系,实时掌握主从复制的运行状态,及时感知延迟、中断等异常,实现高可用的监控保障。

监控指标梳理
要配置有效的主从复制监控,首先需要明确需要关注的核心指标,以下是必须监控的关键项:
- 复制运行状态:从库的
Slave_IO_Running和Slave_SQL_Running是否均为Yes,这是复制链路正常的基础 - 主从延迟:
Seconds_Behind_Master的数值,反映从库同步主库数据的滞后时间 - 错误日志信息:复制过程中出现的错误代码和错误描述,用于快速定位故障原因
- 主从数据一致性:核心表的数据校验结果,避免出现数据不一致的情况
监控脚本编写
我们可以使用Shell脚本结合MySQL自带命令实现基础监控功能,以下是主从复制状态监控脚本示例:
#!/bin/bash
# MySQL连接配置
MYSQL_USER="monitor_user"
MYSQL_PASS="monitor_password"
MYSQL_HOST="127.0.0.1"
MYSQL_PORT=3306
# 告警阈值配置
DELAY_THRESHOLD=30 # 主从延迟阈值,单位秒
ERROR_LOG="/var/log/mysql_repl_monitor.log"
# 获取主从复制状态
REPL_STATUS=$(mysql -h${MYSQL_HOST} -P${MYSQL_PORT} -u${MYSQL_USER} -p${MYSQL_PASS} -e "show slave statusG" 2>/dev/null)
# 提取关键指标
IO_RUNNING=$(echo "${REPL_STATUS}" | grep "Slave_IO_Running" | awk '{print $2}')
SQL_RUNNING=$(echo "${REPL_STATUS}" | grep "Slave_SQL_Running" | awk '{print $2}')
DELAY=$(echo "${REPL_STATUS}" | grep "Seconds_Behind_Master" | awk '{print $2}')
LAST_ERROR=$(echo "${REPL_STATUS}" | grep "Last_Error" | sed 's/Last_Error: //g')
# 检查复制运行状态
if [ "${IO_RUNNING}" != "Yes" ] || [ "${SQL_RUNNING}" != "Yes" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') 告警:主从复制中断,IO运行状态:${IO_RUNNING},SQL运行状态:${SQL_RUNNING}" >> ${ERROR_LOG}
# 这里可以添加告警通知逻辑,比如调用邮件接口、企业微信机器人等
fi
# 检查主从延迟
if [ -n "${DELAY}" ] && [ "${DELAY}" != "NULL" ] && [ ${DELAY} -gt ${DELAY_THRESHOLD} ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') 告警:主从延迟超过阈值,当前延迟:${DELAY}秒" >> ${ERROR_LOG}
# 这里可以添加告警通知逻辑
fi
# 检查复制错误
if [ -n "${LAST_ERROR}" ] && [ "${LAST_ERROR}" != "0" ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S') 告警:主从复制出现错误,错误信息:${LAST_ERROR}" >> ${ERROR_LOG}
# 这里可以添加告警通知逻辑
fi
echo "$(date '+%Y-%m-%d %H:%M:%S') 主从复制状态检查完成" >> ${ERROR_LOG}
高可用监控配置
仅编写脚本还不足以实现高可用,需要结合Linux系统能力保障监控本身的可靠性:
定时任务配置
使用crontab配置脚本每分钟执行一次,确保异常能被及时发现:
# 编辑crontab配置 crontab -e # 添加以下行,每分钟执行一次监控脚本 * * * * * /usr/local/bin/mysql_repl_monitor.sh
监控脚本高可用
为避免监控脚本所在节点故障导致监控失效,可以在两台独立的Linux服务器上部署相同的监控脚本,同时监控主从数据库状态,只要有一台服务器能正常执行监控,就不会遗漏异常告警。
告警通知冗余
告警通知建议同时配置两种以上的通道,比如邮件+短信,或者企业微信+钉钉,避免单一通知通道故障导致告警无法触达运维人员。
数据一致性校验
主从复制正常不代表数据完全一致,建议定期执行数据校验,以下是使用pt-table-checksum工具进行一致性校验的示例:
# 在主库执行,校验所有数据库的一致性,结果会写入主库的checksum表 pt-table-checksum --host=127.0.0.1 --port=3306 --user=root --password=root_password --databases=test_db --replicate=test_db.checksum
校验完成后可以通过pt-table-sync工具修复不一致的数据,保障主从数据的完全统一。
常见问题处理
监控过程中常见的异常及处理方式如下:
| 异常类型 | 可能原因 | 处理方式 |
|---|---|---|
| Slave_IO_Running为No | 主库地址不可达、复制账号权限不足、网络故障 | 检查主库连通性、校验复制账号权限、排查网络问题后重启复制 |
| Slave_SQL_Running为No | 从库执行relay log时出现错误,比如主键冲突、表不存在 | 查看Last_Error定位错误,跳过错误事务或修复数据后重启复制 |
| Seconds_Behind_Master持续增大 | 主库写入压力大、从库硬件性能不足、大事务执行 | 优化主库写入、升级从库硬件、拆分大事务 |