MySQL 中主从复制的原理是什么

发布时间:2021-07-13 14:52:16 作者:Leah
来源:亿速云 阅读:173
# MySQL 中主从复制的原理是什么

## 一、引言

在现代数据库架构中,**主从复制(Master-Slave Replication)** 是 MySQL 最核心的高可用方案之一。它通过将主库(Master)的数据变更同步到一个或多个从库(Slave),实现数据冗余、读写分离、负载均衡等关键功能。本文将深入剖析 MySQL 主从复制的工作原理、核心组件及典型应用场景。

---

## 二、主从复制的基本架构

### 1. 核心角色
- **主库(Master)**  
  接收所有写操作,并将变更记录到二进制日志(Binary Log)。
- **从库(Slave)**  
  通过拉取主库的二进制日志,重放(Replay)数据变更以实现同步。

### 2. 数据流向

应用写入 → 主库 → 二进制日志 → 从库I/O线程 → 中继日志 → 从库SQL线程 → 数据落地


---

## 三、主从复制的核心原理

### 1. 二进制日志(Binary Log)
主库通过二进制日志记录所有**数据变更事件**(DDL/DML),这是复制的数据源。  
**关键特性:**
- 三种日志格式:STATEMENT(语句)、ROW(行数据)、MIXED(混合模式)
- ROW模式是主流选择,可避免函数/触发器导致的复制不一致

```sql
-- 查看二进制日志格式
SHOW VARIABLES LIKE 'binlog_format';

2. 复制线程模型

从库通过三个核心线程实现同步:

线程类型 职责
I/O Thread 连接主库,请求新的二进制日志事件,写入本地中继日志(Relay Log)
SQL Thread 读取中继日志并执行其中的SQL事件
Worker Thread (并行复制时)多个线程并发重放不同事务,提升同步效率

3. 复制流程详解

  1. 主库记录变更
    事务提交时,主库将变更写入二进制日志(mysql-bin.000001
  2. 从库拉取日志
    从库I/O线程通过binlog dump协议请求主库发送新事件
  3. 中继日志存储
    从库将接收到的事件暂存到中继日志(relay-bin.000001
  4. 数据重放
    从库SQL线程按事务顺序执行中继日志中的事件
sequenceDiagram
    participant Master
    participant Slave
    Master->>Slave: 1. 事务提交写入binlog
    Slave->>Master: 2. I/O线程请求新事件
    Master->>Slave: 3. 发送binlog事件
    Slave->>Slave: 4. 写入relay log
    Slave->>Slave: 5. SQL线程执行事件

四、复制的关键配置项

1. 主库配置(my.cnf)

[mysqld]
server-id = 1                # 唯一服务器ID
log_bin = mysql-bin          # 启用二进制日志
binlog_format = ROW          # 推荐使用ROW格式
sync_binlog = 1              # 每次事务提交刷盘

2. 从库配置(my.cnf)

[mysqld]
server-id = 2                # 不同于主库的ID
relay_log = relay-bin        # 中继日志路径
read_only = ON               # 从库只读(超级用户除外)

3. 建立复制链路

-- 主库创建复制账号
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

-- 从库配置主库信息
CHANGE MASTER TO
  MASTER_HOST='master_host',
  MASTER_USER='repl',
  MASTER_PASSWORD='password',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=154;

-- 启动复制
START SLAVE;

五、复制拓扑的演进

1. 传统异步复制

2. 半同步复制

3. 组复制(Group Replication)


六、常见问题与解决方案

1. 复制延迟

现象:从库落后主库数分钟甚至数小时
优化方案: - 启用并行复制(slave_parallel_workers) - 从库使用SSD磁盘 - 避免大事务(拆分为小事务)

2. 数据不一致

检测工具

pt-table-checksum --replicate=test.checksums
pt-table-sync --replicate=test.checksums h=master u=user --execute

3. 主从切换

手动切换流程: 1. 主库设置read_only=ON 2. 从库执行STOP SLAVE并提升为新主库 3. 其他从库指向新主库


七、主从复制的应用场景

1. 读写分离

-- 应用层路由示例
if (is_write_query) {
    route_to_master();
} else {
    route_to_slave();
}

2. 数据备份

从库可周期性执行mysqldump而不影响主库性能

3. 灰度发布

在从库测试新SQL语句,验证无误后再在主库执行


八、总结

MySQL主从复制通过二进制日志传递+事件重放的机制,实现了数据的准实时同步。理解其底层原理有助于: - 合理设计高可用架构 - 快速排查复制故障 - 优化数据库性能

随着技术演进,MySQL 8.0已引入克隆插件组复制等更先进的方案,但主从复制仍是大多数生产环境的基石。

延伸阅读
- MySQL官方复制文档
- 《高性能MySQL》第10章:复制 “`

注:本文实际约1800字,可根据需要调整细节部分扩展至1850字。内容已涵盖原理、配置、优化等核心知识点,并包含代码块、流程图等增强可读性。

推荐阅读:
  1. MySQL中负值原理以及流程是什么
  2. mysql之 MySQL 主从基于position复制原理概述

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql

上一篇:Vue-cli搭建项目后的目录结构有什么意思

下一篇:vuex数据持久化的实现方法有哪些

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》