mysql主从复制原理
MySQL数据库服务从3.23版本就开始提供复制的功能,复制是指将主数据库的DDL和DML操作语句通过二进制日志传到复制服务器上;
然后在从库上(复制服务器)对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步;
MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他服务器的主库,实现链状的复制;
MySQL复制的优点主要包含以下3个方面:
-
如果主库出现问题,可以快速切换到从库提供服务;
-
可以在从库上执行查询操作,降低主库的访问压力;
-
可以在从库上执行备份操作,以避免备份期间影响主库的服务;
由于MySQL实现的是异步的复制,所以主从库之间存在一定的差距,在从库上进行的查询操作需要考虑到这些数据的差异,
一般只有更新不频繁的数据或者对实时性要求不高的数据可以通过从库查询,实时性要求高的数据仍然需要从主数据库获得;
2 数据库服务主从复制原理
(1)一主一从 , 一主多从
(2)多主同步 ,一般是双主
(3)主从从同步。 (其中一台 从库 做延时从库)
主从同步复制机制:
(1) 异步复制
(2)同步复制
(3)半同步复制机制
(1) 主从复制涉及 线程
在进行主从数据复制时,是依靠相应线程信息来完成数据复制同步操作的,具体涉及到的线程信息如下:
主库线程信息查看:binlog dump
可以通过show processlist命令在主库上查看binlog dump线程,从binlog dump线程的状态可以看到,mysql的复制是主库主动推送
日志到从库去的,是属于推日志的方式来做同步;
从库线程信息查看: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 主从复制原理涉及文件
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线程已经回放过的日志信息
复制原理过程详述(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日志实现同步关系,并且采用异步方式进行数据同步;