一、数据库服务主从复制概述¶
MySQL数据库服务从3.23版本就开始提供复制的功能,复制是指将主数据库的DDL和DML操作语句通过二进制日志传到复制服务器上;
然后在从库上(复制服务器)对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步;
MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他服务器的主库,实现链状的复制;
MySQL复制的优点主要包含以下3个方面:
- 如果主库出现问题,可以快速切换到从库提供服务;
- 可以在从库上执行查询操作,降低主库的访问压力;
- 可以在从库上执行备份操作,以避免备份期间影响主库的服务;
由于MySQL实现的是异步的复制,所以主从库之间存在一定的差距,在从库上进行的查询操作需要考虑到这些数据的差异,
一般只有更新不频繁的数据或者对实时性要求不高的数据可以通过从库查询,实时性要求高的数据仍然需要从主数据库获得;
二、数据库服务主从复制原理¶
2.1 复制原理涉及线程(3个线程)¶
在进行主从数据复制时,是依靠相应线程信息来完成数据复制同步操作的,具体涉及到的线程信息如下:
| 所在位置 | 线程名称 | 作用说明 |
|---|---|---|
| 主库涉及线程 | binlog dump thread | 用于将主库binlog日志信息进行传输投递的线程 · 可以实现与从库的信息交互 · 可以监控二进制日志的变化 · 可以进行二进制日志的投递 |
| 从库涉及线程 | slave IO thread | · 可以用于连接主数据库服务 · 可以实现与主库线程的交互 · 可以接收和存储二进制日志(接收的二进制日志会存储在中继日志中) |
| slave SQL thread | · 可以解析执行中继日志信息 |
主库线程信息查看:binlog dump
可以通过show processlist命令在主库上查看binlog dump线程,从binlog dump线程的状态可以看到,mysql的复制是主库主动推送
日志到从库去的,是属于推日志的方式来做同步;

说明:如果是一主多从的架构,将会看见多个binlog dump线程信息,实现对多个从库的日志信息投递;
从库线程信息查看:slave io/slave sql
在从库上通过show processlist可以看到I/O线程和SQL线程;
- I/O线程等待主库上的binlog dump线程发送事件并更新到中继日志relay log;
用此线程和主库建立连接,并与主库的dump thread线程进行交互,以及接收和存储主库推送过来的binlog日志信息到relay log;
- SQL线程读取中继日志relay log并应用变更到数据库;
用此线程实现回放relay log中的日志信息,实现对从库的SQL语句操作;
从MySQL的复制流程可以得知MySQL的复制是异步的,从库上的数据和主库存在一定的延时;

2.2 复制原理涉及文件(4个文件)¶
在进行主从数据复制时,是依靠相应文件信息来完成数据复制过程中的数据保存的,具体涉及到的文件信息如下:
| 所在位置 | 文件信息 | 解释说明 |
|---|---|---|
| 主库涉及文件 | binlog | 可以利用二进制日志信息变化,实现主从数据库的异步方式同步 |
| 从库涉及文件 | relaylog | 可以利用中继日志进行临时存储或接收主库投递的二进制日志信息,日志信息会定期自动清理 |
| master.info | 可以存储主库相关信息(主库地址 端口 用户 密码 二进制位置点-已经获取的 )(和IO线程相关) | |
| relay-log.info | 可以存储SQL线程回放过的日志信息(与SQL线程相关) |
从库上的后两个文件(matser/relay-log)已经不以文件方式保存在数据库服务的数据目录中,而是以表格形式直接存储在数据库内部:
mysql> show variables like '%info%';
+---------------------------------+----------------+
| Variable_name | Value |
+---------------------------------+----------------+
| master_info_repository | TABLE |
| relay_log_info_repository | TABLE |
+---------------------------------+----------------+
8 rows in set (0.00 sec)
mysql> use mysql;
mysql> show tables;
+----------------------------------+
| Tables_in_mysql |
+----------------------------------+
| slave_master_info |
| slave_relay_log_info |
+----------------------------------+
37 rows in set (0.01 sec)
-- 可以获取slave_master_info表中的信息,就是change master to配置指定的相关信息;
-- 可以获取 slave_relay_log_info表中的信息,就是SQL线程已经回放过的日志信息
2.3 复制原理过程详述(Classic Replication)¶
MySQL的复制原理大致如下:
1、在从库上执行change master to命令,将主库连接信息和binlog位置信息写入master.info文件或 slave_master_info表中;
2、在从库上执行start slave命令,用于启动从库的IO和SQL线程功能;
3、从库IO线程主要用于读取主库连接信息,实现和主库建立连接,从而使主库派生出binlog dump线程(自动监控binlog);
4、从库IO线程根据change master to命令所定义的数据位置点,获取最新的binlog日志信息
5、mysql主库在事务提交时会把数据变更为事件Events记录在二进制日志文件binlog中;
mysql主库上的sync_binlog参数控制binlog日志刷新到磁盘;
6、binlog dump线程会截取binlog日志并投递其日志给从库IO线程,此时主库并不关心投递日志信息的结果;
7、此时从库IO线程接收binlog投递信息(缓存),随之会立即更新master.info文件 或 slave_master_info数据表信息;
8、从库缓存的binlog日志数据信息会被写入到relaylog中继日志中;
主库推送二进制日志文件binlog中的事件到从库的中继日志relay log,之后从库根据中继日志relay log重做数据变更操作,
9、从库SQL线程将会读取relaylog.info文件或者slave_relay_log_info数据表中信息,获取上次数据回放同步位置点;
随之继续向后回放同步数据,一旦回放同步数据完成后,再次更新relay.info或slave_relay_log_info数据表信息;
10、在从库中回放过的relaylog日志信息,会被relay_log_purge线程定期删除处理这些日志;
11、通过逻辑复制以此来达到主库和从库的数据一致;
MySQL通过3个线程来完成主从库间的数据复制:其中binlog dump线程跑在主库上,I/O线程和SQL线程跑在从库上;
当在从库上启动复制(START SLAVE)时,首先创建I/O线程连接主库,主库随后创建binlog dump线程读取数据库事件;
并发送给I/O线程,I/O线程获取到事件数据后更新到从库的中继日志relay log中去,之后从库上的SQL线程读取中继日志relay log,
根据中继日志中的更新的数据库事件并应用;

简述:在两台以上节点进行复制,通过binlog日志实现同步关系,并且采用异步方式进行数据同步;