通过执行 show plugins; 检查 rpl_semi_sync_master 和 rpl_semi_sync_slave 状态是否为 active,若为 disabled 或未出现则说明插件未安装或未启用;必须在主从库分别执行 install plugin 命令加载对应 so 文件,并确保 plugin_dir 存在且参数 rpl_semi_sync_master_enabled/ slave_enabled 设为 on。

如何确认 MySQL 5.7 是否已启用半同步复制
直接查 show plugins;,找 rpl_semi_sync_master 和 rpl_semi_sync_slave 这两项的状态。如果显示 DISABLED 或压根没出现,说明插件没装或没启用。别只看配置文件里有没有参数——MySQL 启动时不会自动加载半同步插件,必须显式安装。
安装 semisync 插件的正确顺序和位置
主从节点都要装,但**不能同时装、不能跳过检查、不能只装一边**。先在主库执行:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
再在从库执行:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
注意点:
-
semisync_master.so和semisync_slave.so文件必须真实存在于plugin_dir目录下(用SELECT @@plugin_dir;查); - MySQL 5.7 默认不带这些 so 文件?不是——官方二进制包自带,但某些精简版或 Docker 镜像可能删了,得手动补;
- 装完立刻查
show plugins;,状态必须是ACTIVE,否则后续参数全无效; - 从库装完插件后,需执行
STOP SLAVE; START SLAVE;才能真正激活半同步通信逻辑。
关键参数设置:哪些必须开,哪些容易配错
插件装好只是第一步,下面四个参数才是半同步是否生效的开关:
-
rpl_semi_sync_master_enabled = ON(主库)、rpl_semi_sync_slave_enabled = ON(从库)——必须设为ON,且只能在运行时 SET 或配置文件中写,不能只靠 INSTALL PLUGIN 自动开启; -
rpl_semi_sync_master_timeout = 10000(单位毫秒)——建议设成 10000 而非默认 100000,超时太长会导致主库卡顿明显; -
rpl_semi_sync_master_wait_for_slave_count = 1——默认值就是 1,表示只要 1 个从库确认就提交,别乱改成大于 1,除非你真有多个从库且要求强一致性;
改完记得 SET GLOBAL 生效(或重启),然后立刻验证:SHOW VARIABLES LIKE 'rpl_semi_sync%'; 和 SHOW STATUS LIKE 'Rpl_semi_sync%'; ——重点关注 Rpl_semi_sync_master_status 和 Rpl_semi_sync_slave_status 是否都为 ON。
为什么主库写入变慢,或者半同步“时灵时不灵”
常见原因不是配置漏了,而是网络或从库状态没被考虑到:
- 从库延迟高、IO/SQL 线程卡住,会导致主库等不到 ACK,触发超时后自动退化为异步,
Rpl_semi_sync_master_status会变成OFF; - 防火墙或网络抖动导致 TCP 包丢失,主从之间的心跳或 ACK 包收不到,同样会降级;
-
rpl_semi_sync_master_wait_no_slave = OFF(默认)——意思是:当没有可用半同步从库时,主库直接拒绝写入。如果你只有一台从库且它挂了,主库就会卡住;生产环境建议设为ON,允许降级保可用; - 别忽略
sync_binlog = 1和innodb_flush_log_at_trx_commit = 1的配合——半同步只管网络 ACK,不保证磁盘落盘,这两项没配好,照样丢数据。
半同步不是银弹,它加了一层网络等待,所有依赖它的判断(比如切换主库前查 Rpl_semi_sync_master_clients)都得结合从库实时状态来看,不能只信一个变量值。











