半同步复制必须先安装插件才能生效,仅设置参数无效;主从需分别安装对应插件并启用参数,且从库须重启IO线程以注册为semi-sync客户端,否则主库将自动降级为异步复制。

半同步复制必须先装插件,不装插件设参数没用
MySQL 半同步复制不是默认开启的功能,rpl_semi_sync_master_enabled 和 rpl_semi_sync_slave_enabled 这两个参数只是开关,背后依赖 rpl_semi_sync_master 和 rpl_semi_sync_slave 插件。没装插件就设参数,重启后参数会自动变回 OFF,且错误日志里不会报错,只默默失效。
- 主库执行:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so' - 从库执行:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so' - Linux 下文件名可能是
semisync_master.so,macOS 是semisync_master.dylib,Windows 是semisync_master.dll - 插件路径不对会导致
ERROR 1126 (HY000),查SELECT @@plugin_dir确认路径,再把对应文件放进去
参数要主从分开配,且不能只配 master
半同步是双向协作机制:主库得等至少一个从库确认收到 relay log,从库得主动上报确认。只开主库的 rpl_semi_sync_master_enabled=ON,从库没开 rpl_semi_sync_slave_enabled,主库会退化为异步——它发完就走,根本不等。
- 主库配置(my.cnf):
rpl_semi_sync_master_enabled=ON,rpl_semi_sync_master_timeout=10000(单位毫秒,超时即降级) - 从库配置(my.cnf):
rpl_semi_sync_slave_enabled=ON - 从库启用后需重启 IO 线程:
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;,否则不上报确认 -
rpl_semi_sync_master_timeout设太小(如 100)容易频繁降级;设太大(如 60000)会让主库卡住太久,影响业务
怎么验证半同步真在工作?别只看变量值
SHOW VARIABLES LIKE 'rpl_semi_sync%' 只显示配置是否打开,不代表当前生效。真正要看的是运行时状态,尤其 rpl_semi_sync_master_status 和 rpl_semi_sync_slave_status 这两个状态变量,它们反映插件当前是否活跃。
- 主库查:
SHOW STATUS LIKE 'Rpl_semi_sync_master_status'→ 应为ON才算接入成功 - 从库查:
SHOW STATUS LIKE 'Rpl_semi_sync_slave_status'→ 必须是ON,且Rpl_semi_sync_slave_clients≥ 1 - 如果主库状态是
OFF,但插件已装、参数已开,大概率是没从库连上来或从库没启 IO 线程 - 写入一条数据后,立刻查
Rpl_semi_sync_master_yes_transactions是否加 1,比看日志更直接
timeout 降级后不会自动升回半同步,得靠从库重连
主库超时一次,Rpl_semi_sync_master_status 会变成 OFF,之后所有事务都走异步,直到有从库重新完成连接并上报确认。这不是定时恢复机制,没有后台轮询。
- 常见误判:主库设了 timeout=10000,网络抖动一次,后面一直异步,还以为“半同步还在跑”
- 从库断连后重连,必须重新启动 IO 线程(
START SLAVE IO_THREAD),才能触发再次注册为 semi-sync client - 主库上
Rpl_semi_sync_master_no_times记录降级次数,定期查这个值能发现隐性故障 - 生产环境建议配合监控:告警
Rpl_semi_sync_master_status == OFF且持续 > 30 秒










