在 Ansible 部署 MySQL 主从复制时,处理同步状态检查的核心是调用 SHOW SLAVE STATUS 或 SHOW REPLICA STATUS 并解析关键字段。适用自动化交付场景,风险边界在于网络波动可能导致瞬时检查失败,需增加重试机制。
先说结论:Ansible 任务应查询复制状态字段并在状态稳定前持续重试,避免单次检查误判。
- 适合:自动化运维流水线、批量集群初始化
- 先准备:确保复制账号权限充足、网络端口互通
- 验收:确认 IO 和 SQL 线程均为 Yes,延迟在可控范围
命令速用版
以下 Ansible Task 片段用于检查复制状态,适用于 MySQL 8.0.22 及以上版本(使用 SHOW REPLICA STATUS)或旧版本(使用 SHOW SLAVE STATUS)。
- name: Check MySQL replication status
community.mysql.mysql_replication:
mode: getreplica
login_user: "{{ mysql_user }}"
login_password: "{{ mysql_password }}"
register: repl_status
until: >
repl_status.Is_Slave_Running == 'Yes' and
repl_status.Is_SQL_Running == 'Yes'
retries: 10
delay: 5
failed_when: repl_status.Last_Error != ''若无法使用 collection 模块,可通过 command 模块执行 SQL 并配合 grep 或 regex_search 过滤关键字段。
为什么会这样
同步状态检查依赖 MySQL 内部线程状态,瞬时网络抖动会导致状态字段短暂异常。
MySQL 主从复制依赖两个核心线程:IO 线程负责从主库读取 binlog,SQL 线程负责回放日志。Ansible 自动化脚本通常只执行一次配置命令,若此时网络波动或主库负载高,从库可能尚未建立连接或正在排队。直接判断单次状态为失败会导致部署中断,因此需要在 Ansible 中引入 until 重试逻辑,等待状态稳定。
分步处理
按顺序执行配置、启动、检查三步,每一步都需要明确的回滚或报错处理。
1. 配置复制关系
使用 CHANGE MASTER TO 或 CHANGE REPLICATION SOURCE TO 指定主库信息。Ansible 中需确保主库 binlog 文件位置和 position 点准确,或采用 GTID 模式避免位置依赖。
2. 启动复制线程
执行 START SLAVE 或 START REPLICA。注意 MySQL 8.0.22 之后建议使用 REPLICA 术语,但旧命令仍兼容。
3. 循环检查状态
在 Ansible 中设置重试循环。检查 Slave_IO_Running 和 Slave_SQL_Running 是否为 Yes。同时检查 Last_Error 字段是否为空,若有报错信息应直接失败并告警。
怎么验证是否生效
通过 SQL 命令查看状态字段数值,确认延迟和线程状态。
1. 检查线程状态
SHOW REPLICA STATUS\G确认 Replica_IO_Running 和 Replica_SQL_Running 均为 Yes。
2. 检查同步延迟
查看 Seconds_Behind_Source(或旧版本 Seconds_Behind_Master)。
若值为 NULL,表示 IO 线程未运行或尚未开始同步;若值为数字,表示落后主库的秒数。公开资料中没有看到可靠的量化数据说明多少秒算异常,通常业务可接受范围内即可,但持续增长需排查。
3. 检查错误日志
查看 MySQL 错误日志文件(通常位于 /var/log/mysql/error.log),确认无复制相关报错。
常见坑
以下场景容易导致状态检查误报或复制中断,需谨慎处理。
- MySQL 版本术语差异:MySQL 8.0.22 引入了新术语(Source/Replica),旧版 Ansible 模块或脚本可能不兼容,需确认集合版本。
- GTID 模式冲突:若主从 GTID 模式不一致(一个开启一个关闭),复制无法启动。检查
gtid_mode参数。 - 只读权限限制:从库通常开启
read_only,但复制账号需要有足够权限执行复制命令,避免权限不足导致 IO 线程启动失败。 - NULL 值误判:
Seconds_Behind_Master为NULL不代表正常,通常意味着 IO 线程未运行,脚本中需特别处理该状态。
常见问题
Seconds_Behind_Master 显示 NULL 是什么意思?
通常表示 IO 线程未运行或尚未开始同步,不是正常状态。
需检查 Slave_IO_Running 是否为 Yes,若为 No 则复制未建立连接。
Ansible 任务报错 Last_Error 不为空怎么办?
表示复制过程中遇到具体错误,需根据错误信息修复。
常见原因包括主键冲突、网络断开或权限不足,修复后需重置复制状态或跳过错误事务。
MySQL 8.0 以上版本必须用 SHOW REPLICA STATUS 吗?
建议使用新命令,但旧命令 SHOW SLAVE STATUS 仍兼容。
Ansible 模块 community.mysql 会自动适配,但手动脚本需注意版本兼容性。
参考来源
- MySQL Official Documentation - SHOW REPLICA STATUS Statement, URL: https://dev.mysql.com/doc/refman/8.0/en/show-replica-status.html
- Ansible Community Documentation - community.mysql.mysql_replication module, URL: https://docs.ansible.com/ansible/latest/collections/community/mysql/mysql_replication_module.html