问题
MySQL主从复制的过程是怎样的?
答案
核心概念
MySQL主从复制是一种异步复制机制,通过将主库的变更操作记录到binlog(二进制日志)中,从库读取并重放这些日志来实现数据同步。
复制过程的三个关键步骤
1. 主库记录binlog
- 主库在执行写操作(INSERT、UPDATE、DELETE、DDL等)时,将变更记录到二进制日志(binlog)
- binlog按照事务提交的顺序记录,保证数据的一致性
- 存储位置:通常在MySQL的数据目录下,文件名如
mysql-bin.000001
2. 从库IO线程拉取日志
- 从库启动IO线程,连接到主库
- IO线程通过主库的binlog dump线程读取binlog事件
- 将读取到的binlog内容写入到从库本地的中继日志(relay log)
- IO线程记录读取位置(master_log_file, master_log_pos)
3. 从库SQL线程重放日志
- 从库启动SQL线程(也称为应用线程)
- SQL线程读取relay log中的事件,并按顺序执行SQL语句
- 执行完成后更新自己的数据,完成数据同步
- SQL线程记录应用位置(relay_log_file, relay_log_pos)
完整流程图示
主库(Master) 从库(Slave)
| |
[执行SQL] |
↓ |
[写入binlog] |
↓ |
[binlog dump线程] --------binlog事件------→ [IO线程]
↓
[写入relay log]
↓
[SQL线程]
↓
[执行SQL,同步数据]
关键配置参数
主库配置:
# 开启binlog
log-bin=mysql-bin
# 指定server-id(集群内唯一)
server-id=1
# binlog格式(ROW/STATEMENT/MIXED)
binlog_format=ROW
从库配置:
# 指定server-id(与主库不同)
server-id=2
# 开启中继日志
relay-log=mysql-relay-bin
# 从库只读(可选)
read_only=1
复制模式
- 异步复制(默认):主库写入binlog后立即返回,不等待从库确认
- 半同步复制:主库至少等待一个从库确认接收binlog后才返回
- 全同步复制(组复制):等待所有从库确认,类似于分布式事务
性能考量
- 主从延迟:从库应用relay log的速度跟不上主库写入速度
- 优化方向:
- 使用并行复制(基于GTID或逻辑时钟)
- 优化从库硬件(SSD、更多内存)
- binlog格式选择ROW模式减少冲突
- 监控
Seconds_Behind_Master指标
面试答题总结
MySQL主从复制分三步:主库写binlog → 从库IO线程拉取到relay log → 从库SQL线程重放执行。这是一个异步过程,通过binlog记录和重放实现数据同步,常用于读写分离、高可用架构。需要注意主从延迟问题,可通过半同步复制或并行复制优化。