主从复制(Master-Slave Replication)是 MySQL 最核心的高可用技术之一。
它的作用非常关键:
-
主库负责写,从库负责读 → 读写分离
-
从库可以做备份,不影响主库性能
-
主库挂了可以切换到从库 → 高可用
-
为分布式系统提供数据同步能力
1 主从复制原理(小白也能懂)
主从复制的核心流程只有三步:
主库写 binlog → 从库 IO 线程拉取 → 从库 SQL 线程重放
我给你画成一个小白图:
┌──────────────┐
│ 主库 Master │
│ 写入 binlog │
└──────┬───────┘
│
▼
┌──────────────┐
│ 从库 IO 线程 │ 拉取 binlog
└──────┬───────┘
│
▼
┌──────────────┐
│ 从库 SQL 线程 │ 重放 binlog
└──────────────┘
三个关键组件:
| 组件 | 作用 |
|---|---|
| binlog(主库) | 记录所有写操作 |
| IO 线程(从库) | 从主库拉取 binlog |
| SQL 线程(从库) | 执行 binlog,重放数据 |
2 主从复制的前置条件
主从复制要成功,必须满足:
✔ 1. 主库开启 binlog
在主库的 my.cnf:
server-id=1
log-bin=mysql-bin
binlog_format=ROW
✔ 2. 从库有唯一 server-id
server-id=2
✔ 3. 主库创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
✔ 4. 主从时间一致(建议使用 UTC 或 +08:00)
3 Docker 环境下的主从部署
下面是一个简化版的 docker-compose:
services:
mysql-master:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 111111
volumes:
- ./master/my.cnf:/etc/mysql/conf.d/my.cnf
- master_data:/var/lib/mysql
mysql-slave:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: 111111
volumes:
- ./slave/my.cnf:/etc/mysql/conf.d/my.cnf
- slave_data:/var/lib/mysql
4 主从配置流程(最关键)
5 主从复制的模式(你需要知道)
| 模式 | 说明 |
|---|---|
| 基于文件位置(经典) | 现在用的方式 |
| GTID 模式(更现代) | 企业级推荐 |
6 主从复制 + TLS
本章总结
-
主从复制依赖 binlog
-
主库写 binlog → 从库 IO 拉取 → SQL 重放
-
主从必须有不同 server-id
-
主库必须开启 binlog
-
从库通过 CHANGE MASTER TO 连接主库
-
Slave_IO_Running / Slave_SQL_Running 都为 Yes 才算成功
-
TLS 可以加密主从通信
-
主从复制是高可用、读写分离、备份的基础