必须在主从两端分别安装并启用rpl_semi_sync_master和rpl_semi_sync_slave插件,仅配置参数或只装单边插件无效;主库需先INSTALL PLUGIN再设rpl_semi_sync_master_enabled=ON,否则启动报错;从库须同时装slave插件、开read_only、启relay_log并执行START SLAVE;验证须查Rpl_semi_sync_master_status和Rpl_semi_sync_slave_status均为ON。

rpl_semi_sync_master 和 rpl_semi_sync_slave 插件必须在主从两端分别安装并启用,否则半同步形同虚设——只开主库插件或只配参数,复制仍是异步的。
主库必须先装插件再启配置,否则 mysqld 启动失败
MySQL 8.0 默认不加载半同步插件,rpl_semi_sync_master_enabled=ON 这类配置项只有在插件已安装的前提下才生效。如果先写配置再启动,mysqld 会直接报错退出,日志里出现类似 Unknown variable 'rpl_semi_sync_master_enabled' 的错误。
正确顺序是:
- 登录主库 MySQL,执行:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; - 确认安装成功:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'rpl_semi%';(应看到rpl_semi_sync_master状态为ACTIVE) - 再编辑
/etc/my.cnf或/etc/my.cnf.d/mysql-server.cnf,添加以下几行:
[mysqld] server-id = 1 log-bin = mysql-bin binlog-format = ROW rpl_semi_sync_master_enabled = ON rpl_semi_sync_master_timeout = 3000
rpl_semi_sync_master_timeout 单位是毫秒,设为 3000 表示等 3 秒,超时就退化为异步;这个值不能设为 0(会无限等待),也不建议设太高(影响写入延迟)。
从库要装 slave 插件 + 开启只读 + 配 relay_log
从库只装 rpl_semi_sync_slave 插件还不够,必须同时满足三个条件才能参与半同步:
- 执行:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';(注意不是semisync_master.so) - 配置文件中必须有
server-id(不能和主库重复),且开启relay_log(如relay-log = relay-bin) - 务必设置
read_only = ON(防止误写导致 GTID 冲突或数据不一致)
典型从库配置片段:
[mysqld] server-id = 2 relay-log = relay-bin read_only = ON rpl_semi_sync_slave_enabled = ON
装完插件后重启 mysqld,再连上 MySQL 执行 START SLAVE; —— 此时 SHOW SLAVE STATUS\G 中的 Seconds_Behind_Master 应为 0 或稳定增长,且 Slave_SQL_Running_State 显示 Waiting for master transaction to commit 才算真正进入半同步状态。
账号权限和网络连通性常被忽略
主从之间靠一个复制账号通信,这个账号必须满足:
- 在主库创建时,用
CREATE USER 'repl'@'%' IDENTIFIED WITH 'caching_sha2_password' BY 'StrongPass123!';(MySQL 8.0 默认认证插件变了) - 授权必须包含
REPLICATION SLAVE,例如:GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; - 从库连接主库时,
CHANGE MASTER TO语句里的MASTER_HOST必须能被 DNS 或/etc/hosts解析,且telnet 主库IP 3306要通(防火墙、SELinux、bind-address都可能拦住)
特别注意:bind-address 默认是 127.0.0.1,必须改成 0.0.0.0 或具体内网 IP,否则从库根本连不上。
验证半同步是否真生效,别只看配置文件
配置写对了 ≠ 半同步跑起来了。最可靠的验证方式是查两个变量:
- 主库执行:
SHOW GLOBAL VARIABLES LIKE 'rpl_semi_sync_master_status';→ 返回ON才说明插件已激活且至少有一个从库响应过 - 主库执行:
SHOW GLOBAL STATUS LIKE 'Rpl_semi_sync_master_yes_tx';→ 这个值会随事务提交递增,如果是 0 就说明压根没走半同步路径 - 从库执行:
SHOW GLOBAL VARIABLES LIKE 'rpl_semi_sync_slave_status';→ 必须是ON,且SHOW PROCESSLIST里能看到semi-sync slave io thread
GTID 模式下还要额外确认:SELECT @@global.gtid_mode, @@global.enforce_gtid_consistency; 两者都得是 ON,否则 CHANGE MASTER TO 会报错。
半同步的“半”字很关键:它不保证所有从库都收到,只保证至少一个;但一旦那个“至少一个”掉线或超时,主库立刻降级回异步——这个切换是自动的,不会报错,所以必须定期查状态,不能配完就不管。











