MySQL 主从复制原理
这张图片清晰展示了 MySQL 主从复制的工作流程,主库(Master)与从库(Slave)之间如何通过日志文件与线程协同完成数据同步。下面结合图片中的关键流程和组件进行详细讲解。
1. 主库的数据变更记录
在主库(Master)上:
-
数据变更(data change)
当主库执行写操作(如INSERT
、UPDATE
、DELETE
)时,这些操作不仅会修改主库的数据库数据,还会被**记录到二进制日志(binlog)**文件中。二进制日志(binlog) 是主从复制的核心数据来源,它记录了所有对数据库造成更改的 SQL 语句(不包含 SELECT 读操作)。主库只负责写入 binlog,复制时从库会读取这些日志。
2. 从库的复制线程(Slave)
在从库(Slave)上,复制主要依赖两个线程:
-
I/O 线程(IOThread)
- 从库的 I/O 线程连接主库,并从主库的 binlog 文件中读取日志内容,将其写入到从库的**中继日志(Relay log)**中。
- 这一过程如图所示,主库的 binlog 被 I/O 线程读出并写入到中继日志文件中。
-
SQL 线程(SQLThread)
- SQL 线程从中继日志中读取日志内容,并重放日志中的 SQL 语句,将变更应用到从库的数据中,完成数据同步。
- 这一重放过程是将从主库同步来的日志按顺序执行,确保从库的数据与主库保持一致。
3. 工作流程总结
主从复制过程可概括为以下几个步骤:
- 主库执行写操作,将数据更改记录到 binlog(如图中的 “data change”)。
- 从库的 I/O 线程连接主库,从主库读取 binlog 日志,并将日志保存到从库的中继日志(Relay log)。
- 从库的 SQL 线程从中继日志中读取日志内容,重放日志中的 SQL 语句,将主库的变更同步到从库。
4. 线程之间的配合
从库通过两个线程并行处理日志:
- I/O 线程负责读写主库的 binlog 并写入 Relay log。
- SQL 线程负责从 Relay log 中读取并重放 SQL 语句。
这两者并行运行,可以减少同步延迟,提升复制效率。
5. 复制过程中的几个关键日志
- binlog(主库的二进制日志):记录主库上的数据更改。
- Relay log(从库的中继日志):I/O 线程从主库读取 binlog 后写入中继日志,供 SQL 线程执行重放操作。
6. 数据同步与延迟
由于从库要依次拉取主库的 binlog,并重放日志中记录的 SQL 语句,可能存在短暂延迟。如果主库写入频繁、网络不稳定或从库性能较低,从库的数据可能会滞后于主库。这种现象在监控 SHOW SLAVE STATUS\G
中可以通过 Seconds_Behind_Master 字段体现。