mysql 5.7增强半同步复制(after_sync模式)需主从分别安装对应插件、设rpl_semi_sync_master_wait_point=after_sync、重启从库io线程,并验证rpl_semi_sync_master_status和slave_status均为on且clients≥1,否则不生效。

MySQL 5.7 的增强半同步复制(AFTER_SYNC 模式)能显著降低主库崩溃时的数据丢失风险,但**它不会自动生效,也不等于强一致性**;必须主从插件安装正确、参数设对、IO 线程重载,并持续验证状态,否则 Rpl_semi_sync_master_status 永远是 OFF。
确认主从复制已完全就绪,否则半同步无效
半同步只是在稳定异步复制上叠加的机制,不是独立方案。如果基础复制本身就不健康,装了插件也白搭。
-
SHOW SLAVE STATUS\G中Slave_IO_Running和Slave_SQL_Running必须都为Yes -
Seconds_Behind_Master应稳定为0或极小值(比如1),不能持续增长或剧烈波动 - 主库必须开启
log_bin,从库必须设置唯一server-id且启用log_slave_updates = 1(尤其当从库未来可能升级为主库) - 禁用
binlog-do-db或replicate-ignore-db—— 它们与 GTID 冲突,也常导致 ACK 不触发
主库装 rpl_semi_sync_master,从库装 rpl_semi_sync_slave
插件文件名和加载命令不能混用:主库用 semisync_master.so,从库用 semisync_slave.so;只装一边或装反,Rpl_semi_sync_master_clients 就会是 0。
- 先查插件目录:
SELECT @@plugin_dir;,确认semisync_master.so(主库)和semisync_slave.so(从库)真实存在且权限可读 - 主库执行:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; - 从库执行:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; - 立刻验证:
SHOW PLUGINS LIKE '%semi%';,两行状态都必须是ACTIVE,不是DISABLED也不是空
关键参数必须动态设置,AFTER_SYNC 是核心
仅靠配置文件写入或只改 rpl_semi_sync_master_enabled = 1 不够。默认的 AFTER_COMMIT 模式在主库 crash 时仍可能丢事务;而 AFTER_SYNC 才是 MySQL 5.7 实现“无损”的唯一路径。
- 主库必须设:
SET GLOBAL rpl_semi_sync_master_wait_point = 'AFTER_SYNC'; - 主库建议设:
SET GLOBAL rpl_semi_sync_master_timeout = 3000;(3 秒),太小(如100)会频繁降级,太大(如10000)会让业务卡顿 - 主库启用:
SET GLOBAL rpl_semi_sync_master_enabled = 1; - 从库只需启用:
SET GLOBAL rpl_semi_sync_slave_enabled = 1;(它没有wait_point变量) - 所有
SET GLOBAL建议同步写入my.cnf的[mysqld]段,避免重启后失效
从库必须重启 IO 线程,否则 Rpl_semi_sync_slave_status 始终为 OFF
这是最常被跳过的步骤:插件装了、参数也设了,但状态还是 OFF,根本原因是 ACK 通信通道没重建。
- 从库执行:
STOP SLAVE IO_THREAD;,再执行:START SLAVE IO_THREAD; - 注意:不是
STOP SLAVE; START SLAVE;—— SQL_THREAD 重启不触发 ACK 握手 - 若从库启用了 GTID,还必须确认
log_slave_updates = ON,否则 relay log 不写 binlog,主库收不到 ACK - 防火墙要放行主从之间的 3306 端口;
Rpl_semi_sync_master_clients在主库上必须 ≥1,否则说明从库根本没连上
真正容易被忽略的是状态验证方式:不能只看 rpl_semi_sync_master_enabled 变量是否为 1,必须运行 SHOW STATUS LIKE 'Rpl_semi_sync%'; 并确认 Rpl_semi_sync_master_status 和 Rpl_semi_sync_slave_status 都是 ON,且 Rpl_semi_sync_master_clients ≥ 1;一旦发现 Rpl_semi_sync_master_no_tx 或 Rpl_semi_sync_master_no_times 持续增长,说明已在频繁降级为异步,得回头检查网络、磁盘刷盘延迟或超时设置。











