文章目录
主从原理 + 多种复制场景 + 实战配置,一次讲清!
一、MySQL 主从复制的本质原理
MySQL 主从复制是通过 二进制日志(binlog)+ 中继日志(relay log) 机制实现的。
数据同步流程:
1. 主库开启 binlog,记录所有写操作
2. 从库的 I/O 线程向主库请求 binlog
3. 主库的 dump 线程将 binlog 发送给从库
4. 从库的 I/O 线程写入 relay log
5. 从库的 SQL 线程读取 relay log 并执行
主从复制三大线程:
名称 | 角色 | 功能 |
---|---|---|
Dump 线程 | 主库 | 向从库推送 binlog 内容 |
I/O 线程 | 从库 | 拉取 binlog 并写入中继日志 |
SQL 线程 | 从库 | 读取中继日志并执行 SQL |
二、主从复制的三种模式
模式 | 特点 | 延迟 | 一致性 |
---|---|---|---|
异步复制(默认) | 主库执行完即返回 | 低 | 可能丢数据 |
半同步复制 | 至少一个从库确认才返回 | 中 | 提高可靠性 |
GTID复制(基于事务ID) | 支持 failover 自动切换 | 更强一致性 | 更好容灾支持 |
三、一主多从架构设计与应用
一主多从是 MySQL 构建读写分离的常见架构:
+-----------+
| |
| Master |
| |
+-----------+
/ | \
/ | \
+--------+ +--------+ +--------+
| Slave1 | | Slave2 | | Slave3 |
+--------+ +--------+ +--------+
应用场景:
主库处理写操作(INSERT/UPDATE/DELETE)
从库处理读请求(SELECT)
配合中间件(如 MyCAT、ShardingSphere、ProxySQL)实现自动读写分离
优势:
提升系统并发能力(读写分离)
降低主库压力
增加容灾能力,主挂后可快速切换为从
四、单机模拟主从复制(实战配置)
环境准备:
同一台主机运行多个 MySQL 实例(如 3306、3307)
修改配置文件以区分实例
示例配置片段(my.cnf):
[mysqld]
server-id=1 # 主从必须唯一
log-bin=mysql-bin # 主库需开启binlog
port=3306
[mysqld2]
server-id=2
relay-log=mysql-relay
port=3307
设置主从关系:
-- 从库配置
CHANGE MASTER TO
MASTER_HOST='127.0.0.1',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='repl_pass',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS= 154;
START SLAVE;
SHOW SLAVE STATUS\G;
五、主主复制(双主复制)配置
原理:
两台 MySQL 互为主从,都开启 binlog 与 relay log。
+-----------+ +-----------+
| Master A | <-----> | Master B |
+-----------+ +-----------+
关键注意事项:
两边写入不能写相同主键或数据 → 否则数据冲突
通常搭配 auto_increment_offset 和 auto_increment_increment 避免主键冲突
示例配置(主 A):
server-id=1
log-bin=mysql-bin
auto_increment_offset=1
auto_increment_increment=2
主 B:
server-id=2
log-bin=mysql-bin
auto_increment_offset=2
auto_increment_increment=2
使用场景:
多活读写(慎用,建议仅读活)
高可用自动切换(结合 MHA、Orchestrator 使用)
六、项目中常见主从实践方案
项目场景 | 推荐方案 | 说明 |
---|---|---|
中小型系统 | 一主两从 | 读写分离 + 冗余 |
高并发大读量 | 一主多从(>3) | 配合 ProxySQL 或 LVS 负载 |
容灾架构 | 主主复制 + keepalived | 主库故障时自动切换 |
单机模拟开发 | 3306 + 3307 模拟主从 | 便于学习测试复制流程 |
七、故障应对与运维建议
定期监控 Slave_IO_Running/Slave_SQL_Running
配置 slave_skip_errors 时慎重使用
使用 pt-table-checksum 保证主从一致
设置从库只读:
read_only=ON
结语
MySQL 的主从复制为分布式架构提供了坚实的基础。不论是一主多从、主主复制,还是读写分离,在不同规模和业务需求下都能灵活组合构建高可用、高性能的数据库架构。