您好,登录后才能下订单哦!
# 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';
从库通过三个核心线程实现同步:
线程类型 | 职责 |
---|---|
I/O Thread | 连接主库,请求新的二进制日志事件,写入本地中继日志(Relay Log) |
SQL Thread | 读取中继日志并执行其中的SQL事件 |
Worker Thread | (并行复制时)多个线程并发重放不同事务,提升同步效率 |
mysql-bin.000001
)binlog dump
协议请求主库发送新事件relay-bin.000001
)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线程执行事件
[mysqld]
server-id = 1 # 唯一服务器ID
log_bin = mysql-bin # 启用二进制日志
binlog_format = ROW # 推荐使用ROW格式
sync_binlog = 1 # 每次事务提交刷盘
[mysqld]
server-id = 2 # 不同于主库的ID
relay_log = relay-bin # 中继日志路径
read_only = ON # 从库只读(超级用户除外)
-- 主库创建复制账号
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;
-- 主库安装插件
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
现象:从库落后主库数分钟甚至数小时
优化方案:
- 启用并行复制(slave_parallel_workers
)
- 从库使用SSD磁盘
- 避免大事务(拆分为小事务)
检测工具:
pt-table-checksum --replicate=test.checksums
pt-table-sync --replicate=test.checksums h=master u=user --execute
手动切换流程:
1. 主库设置read_only=ON
2. 从库执行STOP SLAVE
并提升为新主库
3. 其他从库指向新主库
-- 应用层路由示例
if (is_write_query) {
route_to_master();
} else {
route_to_slave();
}
从库可周期性执行mysqldump
而不影响主库性能
在从库测试新SQL语句,验证无误后再在主库执行
MySQL主从复制通过二进制日志传递+事件重放的机制,实现了数据的准实时同步。理解其底层原理有助于: - 合理设计高可用架构 - 快速排查复制故障 - 优化数据库性能
随着技术演进,MySQL 8.0已引入克隆插件和组复制等更先进的方案,但主从复制仍是大多数生产环境的基石。
延伸阅读:
- MySQL官方复制文档
- 《高性能MySQL》第10章:复制 “`
注:本文实际约1800字,可根据需要调整细节部分扩展至1850字。内容已涵盖原理、配置、优化等核心知识点,并包含代码块、流程图等增强可读性。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。