根据数据同步的时效性和一致性要求,MySQL 主从复制主要分为以下三种类型:
一、三种复制类型对比总览
| 复制类型 | 同步方式 | 数据一致性 | 性能影响 | 适用场景 |
|---|---|---|---|---|
| 异步复制 | 主库不等待从库 | 最终一致 | 最小 | 读写分离、普通网站 |
| 半同步复制 | 至少一个从库确认 | 强一致 | 中等 | 金融、交易系统 |
| 同步复制 | 所有从库确认 | 最强一致 | 最大 | 集群、关键数据 |
二、异步复制(Asynchronous Replication)
工作原理
主库:执行事务 → 写 binlog → 提交事务 → 返回客户端成功
↓
从库: IO线程拉取binlog → SQL线程回放
核心特点
- 主库不等待:主库提交事务后立即返回,不关心从库是否收到
- 默认模式:MySQL 5.5 之前的唯一模式,5.5+ 仍是默认
- 数据风险:主库宕机时,未同步到从库的事务会丢失
配置示例
# 默认就是异步,无需特殊配置
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
优缺点
| 优点 | 缺点 |
|---|---|
| 主库性能最高 | 可能丢数据 |
| 简单易用 | 主从延迟可能大 |
| 对主库无阻塞 | 无法保证强一致 |
三、半同步复制(Semi-synchronous Replication)
工作原理
主库:执行事务 → 写 binlog → 等待从库确认 → 提交事务 → 返回客户端
↑
从库:写入 relaylog 后返回 ACK
核心特点
- 至少一个确认:主库等待至少一个从库写入 relaylog 后才提交
- 超时降级:如果从库超时无响应,自动降级为异步
- 5.5+ 版本引入,需要安装插件

配置步骤
# 1. 主库安装插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
# 2. 从库安装插件
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
# 3. 启用半同步(主库)
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 10000; -- 10秒超时
# 4. 从库启用
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
# 5. 重启 IO 线程
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
配置文件方式
# my.cnf 主库
[mysqld]
rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=10000 # my.cnf 从库
[mysqld]
rpl_semi_sync_slave_enabled=1
优缺点
| 优点 | 缺点 |
|---|---|
| 数据基本不丢 | 性能略降(网络延迟) |
| 比异步更安全 | 超时降级后可能不一致 |
| 适合交易系统 | 至少需要一个从库确认 |
四、同步复制(Synchronous Replication)
工作原理
主库:执行事务 → 写 binlog → 等待所有从库确认 → 提交事务 → 返回客户端
↑
从库1:写入 relaylog 后返回 ACK
从库2:写入 relaylog 后返回 ACK
从库3:写入 relaylog 后返回 ACK

核心特点
- 所有从库确认:主库等待所有从库都写入 relaylog 后才提交
- MySQL 原生不支持:需通过 NDB Cluster 或 Galera Cluster(Percona XtraDB Cluster)实现
- Paxos/RAFT 协议:集群节点间协商
Galera Cluster 配置示例
# my.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera/libgalera_smm.so wsrep_cluster_name=”mycluster” wsrep_cluster_address=”gcomm://192.168.1.100,192.168.1.101,192.168.1.102″ wsrep_node_name=”node1″ wsrep_node_address=”192.168.1.100″ binlog_format=ROW default_storage_engine=InnoDB
优缺点
| 优点 | 缺点 |
|---|---|
| ✅ 最强一致性 | ❌ 性能最差(网络延迟累加) |
| ✅ 无数据丢失 | ❌ 可用性降低(一个节点慢整体慢) |
| ✅ 多主写入 | ❌ 配置复杂 |
五、三种类型对比详细表格
| 特性 | 异步复制 | 半同步复制 | 同步复制 |
|---|---|---|---|
| 数据一致性 | 最终一致 | 强一致 | 最强一致 |
| 主库性能 | 最高 | 中等 | 最低 |
| 事务响应时间 | 最快 | 较慢(+网络RTT) | 最慢(+所有节点RTT) |
| 数据丢失风险 | 有 | 极少(超时可能丢) | 无 |
| 主从延迟 | 可能很大 | 较小 | 无延迟 |
| 所需从库数量 | 任意 | 至少1个 | 通常3个 |
| MySQL 原生支持 | ✅ 默认 | ✅ 5.5+插件 | ❌ 需第三方 |
| 适用场景 | 读写分离、日志 | 支付、订单 | 金融核心、集群 |
六、实际场景选择建议
场景1:普通网站、博客(选异步)
-- 能容忍短暂不一致,追求性能
CHANGE MASTER TO ... -- 默认异步即可
场景2:电商、支付系统(选半同步)
-- 不能丢数据,但可接受轻微性能下降
INSTALL PLUGIN ... -- 启用半同步
SET GLOBAL rpl_semi_sync_master_enabled = 1;
场景3:金融核心、交易系统(选同步/Galera)
-- 绝对一致,使用 Galera Cluster
wsrep_cluster_address="gcomm://ip1,ip2,ip3"
七、监控复制状态
查看复制类型
-- 查看半同步是否启用
SHOW VARIABLES LIKE 'rpl_semi_sync%';
-- 查看半同步状态
SHOW STATUS LIKE 'Rpl_semi_sync%';
监控复制延迟
-- 查看从库延迟
SHOW SLAVE STATUS\G
-- 关注 Seconds_Behind_Master
八、一句话总结
异步复制性能最好但可能丢数据,半同步复制在性能和一致性间平衡,同步复制一致性最强但性能最差,根据业务对数据一致性的要求选择合适类型。
发表回复