MySQL 主从复制的三种类型详解

根据数据同步的时效性和一致性要求,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 ClusterGalera 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

八、一句话总结

异步复制性能最好但可能丢数据,半同步复制在性能和一致性间平衡,同步复制一致性最强但性能最差,根据业务对数据一致性的要求选择合适类型。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注