异步复制适合读多写少且容忍数据丢失的场景,MySQL默认采用,主库不等从库确认即返回成功,可能导致数据丢失;半同步复制在一致性与可用性间折中,需至少一个从库落盘后才提交;组复制基于Paxos实现强一致多写,但性能开销大、限制多。
异步复制(ASYNC)适合读多写少、能容忍数据丢失的场景
MySQL 默认就是异步复制:binlog 写完就返回客户端成功,不等从库回执。主库崩溃时,最后几条事务很可能没传到从库,造成数据丢失。
常见错误现象:Seconds_Behind_Master 突然飙升、主从延迟几十秒甚至几分钟,但业务无感知;切换主库后发现新主库缺了几笔订单。
- 适用场景:报表分析库、搜索同步库、日志归档库这类“最终一致即可”的下游
- 不适用场景:金融交易、账户余额、支付结果通知等强一致性要求场景
- 性能影响最小,吞吐最高,网络抖动几乎不影响主库响应
半同步复制(SEMISYNC)在可用性与一致性间折中
启用 rpl_semi_sync_master_enabled=ON 后,主库至少等待一个从库写入 relay log 并刷盘(默认配置下),才向客户端返回成功。
注意:MySQL 5.7+ 的 rpl_semi_sync_master_wait_point 默认是 AFTER_SYNC,即等从库落盘后再提交主库事务——这是真正意义的“半同步”;若设为 AFTER_COMMIT(5.6 默认),主库已提交再等从库,仍可能丢事务。
- 必须安装插件:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so' - 超时由
rpl_semi_sync_master_timeout控制(单位微秒),超时自动退化为异步,不阻塞主库 - 从库宕机或网络中断时,主库最多卡住 timeout 时间,之后继续异步运行,这点常被误认为“不可靠”
组复制(Group Replication)适合高一致性、多写需求,但代价明显
group_replication 是 MySQL 官方的 Paxos 实现,要求至少 3 节点,所有写入需多数派确认(quorum)才提交,天然支持多主写(multi-primary 模式)和自动故障转移。