mysql半同步复制需主从插件协同生效:主库安装rpl_semi_sync_master并启用,从库安装rpl_semi_sync_slave、启用且重启io线程;必须满足版本≥5.5、动态加载可用、gtid环境已就绪,否则虽设参数仍为异步。

必须先确认主从复制已稳定运行,且 MySQL 版本 ≥ 5.5(推荐 5.7+),否则 rpl_semi_sync_master_enabled 开启后不会生效,主库仍按异步行为提交事务。
检查半同步插件是否可用
MySQL 半同步功能依赖动态加载的插件,不是所有安装包都默认包含 semisync_master.so 和 semisync_slave.so。直接启用 rpl_semi_sync_master_enabled 前,得先验证插件存在且可加载:
- 执行
SHOW VARIABLES LIKE 'have_dynamic_loading';,结果必须为YES,否则无法INSTALL PLUGIN - 执行
SELECT * FROM information_schema.PLUGINS WHERE PLUGIN_NAME LIKE 'rpl_semi%';,若返回空,说明插件未安装,不能跳过安装步骤直接设rpl_semi_sync_master_enabled=1 - 插件文件路径通常在
plugin_dir下(查SELECT @@plugin_dir;),常见位置如/usr/lib64/mysql/plugin/或/usr/local/mysql/lib/plugin/;缺失时需手动拷贝或重装对应版本的 MySQL 共享库
安装并启用主库半同步插件
仅设置 rpl_semi_sync_master_enabled=1 是无效的——它只是开关,背后必须有插件支撑。动态加载是标准做法,避免重启:
- 在主库执行:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; - 立即验证:
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM information_schema.PLUGINS WHERE PLUGIN_NAME = 'rpl_semi_sync_master';,状态必须为ACTIVE - 再启用开关:
SET GLOBAL rpl_semi_sync_master_enabled = 1; - 为防重启失效,追加到主库配置文件
/etc/my.cnf的[mysqld]段:rpl_semi_sync_master_enabled=1 - 注意:
rpl_semi_sync_master_timeout默认 10000 毫秒(10 秒),超时即降级为异步;若网络延迟高,建议调大(如SET GLOBAL rpl_semi_sync_master_timeout = 30000;)
从库必须配对启用 rpl_semi_sync_slave_enabled
半同步是双向协作机制:主库等待确认,但从库不主动响应,rpl_semi_sync_master_enabled 就形同虚设。常见误操作是只配主库,结果 SHOW STATUS LIKE '%semi_sync%'; 显示 Rpl_semi_sync_master_status 为 OFF:
- 从库执行:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; - 启用:
SET GLOBAL rpl_semi_sync_slave_enabled = 1; - 关键一步:重启 IO 线程,使从库进入半同步接收模式:
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;(仅START SLAVE不够) - 配置文件中也应写入:
rpl_semi_sync_slave_enabled=1,否则重启后 IO 线程恢复异步模式 - 验证从库是否响应:主库执行
SHOW STATUS LIKE 'Rpl_semi_sync_master_clients';,值应 ≥ 1
确认生效与典型失效场景
开启 rpl_semi_sync_master_enabled 后,数据安全提升的前提是它真实生效。最易被忽略的是状态“假开启”:
- 主库
SHOW STATUS LIKE 'Rpl_semi_sync_master_status';必须返回ON,而非OFF;若为OFF,90% 是从库未正确加载插件或未重启 IO 线程 - 主库
SHOW STATUS LIKE 'Rpl_semi_sync_master_no_times';若持续增长,说明频繁超时降级,需检查从库 IO 线程状态、网络延迟、磁盘 I/O(中继日志刷盘慢会导致确认延迟) - GTID 环境下,
enforce_gtid_consistency=ON和gtid_mode=ON是前提,否则半同步可能无法建立可靠确认链 - 主库写入压力大 + 从库 relay log 刷盘慢(如使用机械盘、
sync_relay_log=10000过大),会导致确认延迟,触发超时,实际仍是异步行为
真正起作用的不是那个开关变量本身,而是主库插件、从库插件、IO 线程三者协同形成的确认闭环;任一环节断开,rpl_semi_sync_master_enabled=1 就只是个摆设。











