半同步生效需同时满足:插件ACTIVE、参数ON、Rpl_semi_sync_master_status和Rpl_semi_sync_slave_status均为ON、Rpl_semi_sync_master_clients≥1、IO线程重载且网络稳定。

只看rpl_semi_sync_master_enabled返回ON不等于生效,必须查运行时状态。
查SHOW STATUS里的真实开关状态
变量值(如@@rpl_semi_sync_master_enabled)只是“你想开”,而SHOW STATUS LIKE 'Rpl_semi_sync%'反映的是当前实际运行状态:
-
Rpl_semi_sync_master_status必须为ON——表示主库当前正以半同步模式工作;若为OFF,说明已降级为异步(可能因从库断连、超时或IO线程未重载) -
Rpl_semi_sync_slave_status在从库上必须为ON——表示该从库已成功注册为半同步客户端,且IO线程正在处理ACK逻辑 -
Rpl_semi_sync_master_clients应≥1——确认至少有一个从库完成握手并被主库识别;为0说明从库没连上来,或插件/参数/IO线程三者中任一环节失败
验证SHOW PLUGINS是否真激活
插件装了≠ACTIVE,DISABLED或缺失都导致半同步完全不走:
- 主库执行:
SHOW PLUGINS LIKE 'rpl_semi_sync_master',状态必须是ACTIVE,不能是DISABLED或查不到结果 - 从库执行:
SHOW PLUGINS LIKE 'rpl_semi_sync_slave',同理必须ACTIVE - 如果查不到,先确认
SELECT @@plugin_dir下是否存在semisync_master.so(主库)和semisync_slave.so(从库);某些Docker镜像或精简版MySQL会删掉这两个文件
检查从库IO线程是否真正接管半同步通信
很多情况下插件和参数都对,但Rpl_semi_sync_slave_status始终OFF,根源就是IO线程没重载:
- 从库必须执行:
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;(不是STOP SLAVE; START SLAVE;) - 因为ACK响应由IO线程发起,SQL线程只负责执行,重载IO线程才能让其重新与主库协商半同步模式
- 若从库启用了GTID,还需确保
log_slave_updates = ON,否则relay log不写binlog,主库收不到ACK
别忽略超时退化和网络抖动的影响
半同步不是“一劳永逸”的开关,它会在运行中动态变化:
-
rpl_semi_sync_master_timeout设得太小(如100毫秒),网络轻微抖动就会频繁触发降级,Rpl_semi_sync_master_status反复在ON/OFF间跳变 - 设得太大(如
60000毫秒),主库事务会长时间阻塞,影响业务写入,且监控时容易误判为“一直ON” - 建议设为
10000(10秒),既避免卡死,又留出合理容错窗口
最易被忽略的一点:即使所有配置正确、插件ACTIVE、参数ON、IO线程重启过,只要主从之间TCP连接不稳定,或从库磁盘刷盘慢(比如relay log没及时fsync),主库就收不到ACK,立刻降级。所以线上必须持续监控Rpl_semi_sync_master_status和Rpl_semi_sync_master_wait_time等指标,不能只靠一次检查就认为“已搞定”。


















