Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL主从复制

深度解析MySQL中主从复制的详细流程

作者:身如柳絮随风扬

在现代数据库架构中,主从复制是实现读写分离、数据备份、高可用和故障转移的基石,本文深入解析MySQL主从复制的机制与实践,感兴趣的小伙伴可以了解下

1. 引言

在现代数据库架构中,主从复制(Master‑Slave Replication)是实现读写分离、数据备份、高可用和故障转移的基石。然而,许多开发者对复制的内部机制一知半解,尤其是半同步复制如何平衡性能与一致性。本文将带你深入理解:

通过流程图和实战案例,帮助你在生产环境中做出明智的选择。

2. 主从复制核心架构

2.1 整体流程图

2.2 核心组件

组件位置作用
binlog主库记录所有数据变更的二进制日志
binlog dump 线程主库为每个从库创建一个,负责发送 binlog 事件
I/O 线程从库连接主库,接收 binlog 并写入 relay log
relay log从库暂存从主库接收的日志
SQL 线程从库读取 relay log 并重放执行

3. 主从复制配置步骤

3.1 主库配置

编辑 my.cnf

[mysqld]
server-id = 1                     # 唯一标识
log-bin = mysql-bin               # 开启二进制日志
binlog_format = ROW               # 推荐 ROW 格式

创建复制账号:

CREATE USER 'replica'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;

查看主库状态(记录 FilePosition):

SHOW MASTER STATUS;

3.2 从库配置

编辑 my.cnf

[mysqld]
server-id = 2
relay-log = mysql-relay-bin
read_only = 1                     # 可选,防止从库被写入

执行同步命令:

CHANGE MASTER TO
  MASTER_HOST = 'master_ip',
  MASTER_USER = 'replica',
  MASTER_PASSWORD = 'password',
  MASTER_LOG_FILE = 'mysql-bin.000001',
  MASTER_LOG_POS = 12345;
START SLAVE;

检查同步状态:

SHOW SLAVE STATUS\G

重点关注:

4. 复制模式:异步、半同步、全同步

4.1 异步复制(默认)

主库写 binlog 后立即返回客户端成功,不等待从库确认。性能最高,但可能丢失数据(主库宕机时未发送的 binlog 丢失)。

4.2 半同步复制

半同步复制在主库提交事务前,至少等待一个从库确认已收到 binlog(写入 relay log)。这保证了至少一个从库有完整的数据副本,大幅降低数据丢失风险。

工作流程

超时降级机制

如果从库长时间不返回 ACK(如网络故障),半同步复制会自动降级为异步复制,避免主库阻塞。超时时间由参数 rpl_semi_sync_master_timeout 控制(默认 10 秒)。降级后,主库不再等待 ACK,恢复半同步需从库重新连接并追赶数据。

配置半同步复制

主库安装插件并启用:

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;  -- 10 秒

从库安装插件:

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;

4.3 全同步复制

所有从库确认收到 binlog 后才提交,数据一致性最强,但性能极差,极少使用。

4.4 模式对比

模式数据一致性性能适用场景
异步低(可能丢数据)最高非关键数据、日志系统
半同步较高(至少一个从库有)金融、订单等关键业务
全同步最高(所有从库有)极低几乎不用

5. 半同步复制的超时降级详细解析

当主库等待 ACK 超过 rpl_semi_sync_master_timeout 后,会暂时关闭半同步模式,退化为异步复制。此时主库的 Rpl_semi_sync_master_status 状态变为 OFF。从库恢复后,主库会尝试重新进入半同步模式。

为什么要降级? 如果不降级,主库将永远阻塞,导致整个系统不可写。降级机制保证了可用性优先,同时尽可能保证一致性(降级期间仍有短暂数据丢失风险)。

监控状态

SHOW STATUS LIKE 'Rpl_semi_sync%';

6. 常见问题与最佳实践

Q1:半同步复制下,从库宕机会导致主库不可用吗?

不会。超时后自动降级为异步,主库继续服务,但在此期间数据一致性降低。

Q2:如何提升半同步复制的性能?

Q3:半同步复制能保证完全不丢数据吗?

不能。在降级为异步的时间窗口内,如果主库宕机,尚未被从库确认的事务仍可能丢失。真正的零丢失需要金融级的全同步或 Paxos/Raft 协议(如 MySQL Group Replication)。

Q4:配置半同步后,从库需要额外注意什么?

从库必须开启 rpl_semi_sync_slave_enabled,并且 SHOW SLAVE STATUS 中的 Master_SSL_Allowed 不影响。

7. 总结

到此这篇关于深度解析MySQL中主从复制的详细流程的文章就介绍到这了,更多相关MySQL主从复制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文