MySQL 异步复制默认开启,主库提交事务后立即响应,性能最好但主库故障时可能丢失未同步数据;半同步复制要求至少一个从库写入中继日志并返回 ACK 后才提交,数据更安全但会增加事务延迟。选型核心取决于业务对数据丢失(RPO)的容忍度。
先说结论:核心业务且不能容忍数据丢失时选半同步,读多写少或允许秒级延迟场景选异步。
- 适合:电商订单、支付流水等要求 RPO=0 的核心写业务
- 重点看:网络 RTT 和从库 I/O 能力,半同步会增加毫秒级延迟
- 别忽略:从库必须安装插件并开启半同步,否则主库会静默降级为异步
命令速用版
以下命令基于 MySQL 5.7+ 环境,需在主从库分别执行:
主库配置:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; SET GLOBAL rpl_semi_sync_master_enabled = 1; SET GLOBAL rpl_semi_sync_master_timeout = 10000;
从库配置:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; SET GLOBAL rpl_semi_sync_slave_enabled = 1;
为什么会这样
异步复制是“发后即忘”,主库写完 binlog 就返回成功,不等待从库确认,因此主库宕机时未同步的 binlog 会丢失。半同步复制是“确认制”,主库需等待至少一个从库将 binlog 写入 relay log 并返回 ACK 才提交事务,确保已提交事务至少存在于一个从库的中继日志中。
分步处理
- 确认版本:MySQL 5.5+ 支持半同步,5.7+ 推荐使用 AFTER_SYNC 模式。
- 安装插件:主库加载 semisync_master.so,从库加载 semisync_slave.so。
- 修改配置:主库设置 rpl_semi_sync_master_enabled=1,从库设置 rpl_semi_sync_slave_enabled=1。
- 调整超时:根据网络情况设置 rpl_semi_sync_master_timeout,默认 10 秒,超时后自动降级为异步。
怎么验证是否生效
在主库执行 SHOW STATUS LIKE 'Rpl_semi_sync_master_status';,值为 ON 表示生效。执行 SELECT @@rpl_semi_sync_master_wait_point;,返回 AFTER_SYNC 表示为增强半同步模式。
常见坑
- 从库未开启 rpl_semi_sync_slave_enabled=1,主库会静默退化为异步。
- max_allowed_packet 主从不一致,导致握手失败,插件加载成功但实际不生效。
- 从库启用并行复制时,ACK 可能滞后于事务写入顺序,影响一致性语义。
- 超时参数设得太小,导致频繁降级为异步复制。
常见问题
半同步复制会影响多少性能?
单次事务 RT 通常增加约 10–50ms,具体取决于网络延迟和从库 I/O,核心业务 TPS 可能下降约 15%。
主库宕机后数据会丢吗?
异步复制可能丢失未同步 binlog,半同步复制在 ACK 成功后可确保数据至少存在于某个从库的 relay log 中。
如何判断当前是异步还是半同步?
查看主库状态变量 Rpl_semi_sync_master_status,OFF 为异步,ON 为半同步。
参考来源
- mysql 主从复制模式选哪种更好_对比异步复制与半同步复制性能
- mysql 主从复制中的异步和半同步有什么区别_同步模式说明
- 深入浅出 MySQL 复制三剑客:同步、异步、半同步复制到底怎么选?-CSDN 博客
- MySQL 复制三剑客全面剖析:同步、异步、半同步,哪种最适合你?
- MySQL 半同步复制原理与配置详解