mysql半同步复制需严格匹配插件名与版本:5.7用rpl_semi_sync_master/slave,8.0.2+用rpl_semi_sync_source/replica;安装后必须set global启用对应变量并执行stop/start slave,再通过show status验证rpl_semi_sync_*_status为on。

半同步插件名和安装命令必须严格匹配
MySQL 半同步复制依赖两个内置插件:rpl_semi_sync_master 和 rpl_semi_sync_slave(MySQL 5.7+)或 rpl_semi_sync_source 和 rpl_semi_sync_replica(MySQL 8.0.2+)。名字写错一个字母,INSTALL PLUGIN 就静默失败,不报错但也不生效。
实操建议:
- 先查 MySQL 版本:
SELECT VERSION();,再决定用哪套插件名 - 确认插件文件存在:
ls -l /usr/lib/mysql/plugin/semi_sync_*.so(路径因安装方式而异,Docker 或 Homebrew 可能不同) - 安装主库插件:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';(MySQL 5.7)或INSTALL PLUGIN rpl_semi_sync_source SONAME 'semisync_source.so';(MySQL 8.0.2+) - 从库同理,但必须用对应 slave/replica 插件名,不能混用
插件加载后必须显式启用,且需重启复制才生效
装完插件只是“注册”,SHOW PLUGINS; 能看到状态是 ACTIVE,但半同步行为默认关闭。不设变量,主库照样走异步复制,完全没区别。
实操建议:
- 主库启用:
SET GLOBAL rpl_semi_sync_master_enabled = ON;(5.7)或SET GLOBAL rpl_semi_sync_source_enabled = ON;(8.0.2+) - 从库启用:
SET GLOBAL rpl_semi_sync_slave_enabled = ON;或SET GLOBAL rpl_semi_sync_replica_enabled = ON; - 改完变量后,必须在从库执行
STOP SLAVE; START SLAVE;,否则复制线程仍走旧路径,半同步不触发 - 验证是否真起作用:
SHOW STATUS LIKE 'Rpl_semi_sync%';中Rpl_semi_sync_master_status和Rpl_semi_sync_slave_status都得是ON
超时设置不当会导致主库自动退化为异步,且无明显告警
rpl_semi_sync_master_timeout 默认是 10000 毫秒(10 秒),意思是主库等从库 ACK 最多 10 秒。超时后,主库自动切回异步模式,并把 rpl_semi_sync_master_status 设为 OFF —— 但 SQL 照常执行,应用层完全感知不到。
实操建议:
- 生产环境建议调低超时值,比如
SET GLOBAL rpl_semi_sync_master_timeout = 1000;(1 秒),避免长延迟拖垮主库响应 - 务必配合监控:定期查
Rpl_semi_sync_master_no_times(退化次数)和Rpl_semi_sync_master_off_times(关闭次数),这两个值上涨说明网络或从库有隐性问题 - 不要只依赖
rpl_semi_sync_master_enabled的开关状态,它只管“是否允许半同步”,不管“当前是否正在半同步”
MySQL 8.0.2+ 的插件名和配置项全部重命名,升级后容易漏改
MySQL 8.0.2 引入复制术语标准化,“master/slave” 全面改为 “source/replica”。插件名、系统变量、状态变量全换,但旧名仍可读(只读)、不可写。如果升级后沿用老配置,SET GLOBAL rpl_semi_sync_master_enabled = ON; 会报错 Unknown system variable。
实操建议:
- 升级前跑一遍:
SELECT * FROM performance_schema.variables_info WHERE VARIABLE_NAME LIKE '%semi%';,看哪些变量已废弃 - 配置文件中替换所有
rpl_semi_sync_master_*→rpl_semi_sync_source_*,rpl_semi_sync_slave_*→rpl_semi_sync_replica_* - 注意
my.cnf里变量名大小写敏感,rpl_semi_sync_source_enabled不能写成rpl_semi_sync_SOURCE_enabled - Docker 环境尤其要检查启动参数,
--set-variable传的还是不是旧名
半同步真正起效的关键不在“装”,而在“启”和“验”——装完不设变量等于没装,设了不重启复制线程等于白设,重启了不盯状态变量就等于蒙眼开车。最常被跳过的一步,是查 Rpl_semi_sync_master_status 实时值,而不是只信 rpl_semi_sync_source_enabled 这个静态开关。










