MySQL主从复制原理详解与配置实操

纸上星河
纸上星河
发布时间:2026-10-13 | 2人浏览过
原创

面对高并发业务,单机MySQL往往成为性能瓶颈。通过配置主从复制,利用binlog异步传输实现读写分离,可大幅提升I/O性能并保障业务连续性。本文将深入解析其底层线程交互原理、延迟成因及标准配置流程。

为何需要主从复制?

在复杂业务系统中,数据库常面临锁表导致服务不可用的风险。主从复制的核心价值在于:

  • 读写分离:主库专注于写入操作,从库处理读取请求。即使主库因写入产生锁等待,从库的查询服务依然正常,保证业务不中断。
  • I/O压力分散:随着业务量增长,单机磁盘I/O可能过载。通过多实例存储,降低单台机器的I/O频率,提升整体吞吐量。
  • 数据冗余备份:除负载均衡外,从库天然具备异地或同机容灾能力,增强数据安全性。

MySQL主从复制底层原理

MySQL默认采用异步复制模式。主节点将数据变更记录到二进制日志(Binlog),从节点通过特定机制获取并回放这些变更。

核心交互机制

  1. 主节点记录日志:当主库(Master)数据发生变更时,事务执行器会将修改写入Binlog文件。该文件以事件(Event)形式顺序记录所有DDL和DML操作。
  2. 从节点I/O请求:从库(Slave)开启一个I/O线程,定期探测主库Binlog变化。一旦发现新事件,便向主库发起请求。
  3. 数据传输:主库启动Dump线程响应I/O线程请求,将对应的Binlog Event发送给从库。
  4. 中继日志存储:从库I/O线程接收数据后,并不直接执行,而是将其写入本地的中继日志(Relay Log)中,并记录当前进度至master.info文件。
  5. SQL回放:从库的SQL线程监控Relay Log的变化,读取其中的日志内容,解析为原始SQL语句并在本地重放(Replay),确保数据状态与主库一致。

图来源《高性能mysql》

关键注意事项

  • 线程角色:从库主要依赖I/O线程(负责拉取日志)和SQL线程(负责执行SQL)协同工作;主库依赖Dump线程发送日志。
  • 版本兼容:强烈建议主从节点使用相同MySQL版本。若必须不同,需保证主库版本低于从库版本,以避免语法或特性不支持的问题。
  • 时间同步:节点间系统时间需保持同步,以减少时钟差异带来的潜在排序错误。
  • 权限要求:需授予从库用户远程连接主库并使用Binlog的权限(如REPLICATION SLAVE)。

主从同步延迟分析与优化

主从复制存在固有时延。主库Binlog是顺序写入,效率极高;而从库SQL线程通常单线程回放,且涉及随机I/O操作(如索引重建、非主键更新)。当主库并发写入量大或存在大事务锁等待时,从库积压现象加剧。

解决方案

  • 分库分表:通过水平拆分将负载分散到多个MySQL实例上。
  • 一主多从:针对读密集型业务,增加从库数量分担查询压力,保护主库稳定性。
  • 引入缓存层:在应用与数据库之间接入Redis或Memcache,拦截大量重复读请求,降低DB I/O。
  • 硬件升级:从库配置优于主库的硬件(如SSD硬盘、更高主频CPU),以加速SQL回放速度。
  • 并行复制:MySQL 5.7及以上版本支持MTS(Multi-Threaded Slave),允许从库多线程并行回放不同库的变更,大幅降低延迟。

主从复制配置实操(MySQL 5.7)

以下示例基于同一物理机的两个MySQL实例演示(端口区分:3306为主,3307为从),适用于理解参数逻辑,生产环境请将IP替换为真实地址。

1. 基础环境准备

假设已安装两个MySQL实例,均为v5.7版本。

  • 主库节点:node1 (IP: 127.0.0.1, Port: 3306)
  • 从库节点:node2 (IP: 127.0.0.1, Port: 3307)

首先在两台服务器上创建相同的测试库,确保初始结构一致:

-- 两台服务器均需执行
CREATE DATABASE IF NOT EXISTS test;

2. 主库(Master)配置

编辑主库配置文件/etc/my.cnf(或my.ini),在[mysqld]段下添加以下配置:

[mysqld]
# 开启Binlog,文件名为前缀
log-bin=master-bin
# 设置唯一Server ID,通常可使用IP末位
server-id=1
# 选择行模式复制,更精确记录数据变更
binlog-format=ROW
# 指定需要同步的数据库,留空表示同步所有
binlog-do-db=test

配置说明:

  • row格式:记录每一行数据的改动,对主从一致性最安全,但日志体积较大。
  • statement格式:记录执行的SQL语句,体积小但可能在特定函数下导致不一致。
  • mixed格式:混合模式,默认语句,无法保证一致时自动切换为行模式。

3. 创建复制专用账号

在主库3306中创建一个专门用于复制的用户,并授权:

-- 关闭密码复杂度校验(测试环境)
SET GLOBAL validate_password_policy=0;
SET GLOBAL validate_password_length=1;

-- 创建用户并授权
GRANT REPLICATION SLAVE ON *.* TO 'rep_user'@'%' IDENTIFIED BY 'rep_pass';
FLUSH PRIVILEGES;

4. 从库(Slave)配置

编辑从库配置文件/etc/my.cnf,确保配置如下:

[mysqld]
log-bin=slave-bin
server-id=2
# 注意:从库通常也开启Binlog以便做级联复制或故障恢复
binlog-format=ROW

5. 重启并验证主库状态

重启主库服务使配置生效,进入MySQL命令行查看当前Binlog状态:

service mysqld restart
mysql -uroot -p
SHOW MASTER STATUS;

记下输出结果中的File(即master-bin.000001)和Position(例如154),这将是后续从库连接的起点。

6. 连接主库并启动同步

登录从库3307,执行CHANGE MASTER TO指令指向主库信息:

CHANGE MASTER TO
  MASTER_HOST='127.0.0.1',
  MASTER_USER='rep_user',
  MASTER_PASSWORD='rep_pass',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='master-bin.000001',
  MASTER_LOG_POS=154;

随后启动从库复制进程:

START SLAVE;

最后检查从库状态,确认连接成功:

SHOW SLAVE STATUS\G;

若看到Slave_IO_Running: Yes且Slave_SQL_Running: Yes,则表明主从复制配置完成,此时在主库增删改数据,从库应当同步可见。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表