章
目
录
MySQL主从复制也可以称为MySQL主从同步,而实时热备只是它的其中一种用途,MySQL主从复制是构建数据库高可用集群架构的基础。因此掌握MySQL主从复制(实时热备)的实现原理是非常有必要的,而且在Java数据库面试题中也是经常会被问到的。
一、MySQL主从复制概念
首选先我们需要了解下主从复制的概念:
主从复制是将主库的DDL和DML操作通过二进制日志传递到复制服务器(从库)上,然后从库对这些日志重新执行(重做),从而使得主库和从库保持数据一致。
二、MySQL主从复制优点
主从复制的优点是显而易见的,这也是我们为什么要做主从复制的原因,其优点大概如下:
- 如果主库出现问题,可以快速切换到从库提供服务。
- 可以在从库执行查询操作,降低主库的访问压力。
- 可以在从库进行备份,以免备份期间影响主库的服务。
三、MySQL主从复制的用途
- 数据备份(Backups) ,保证数据安全
- 高可用性和容错行(High availability and failover)
- 实现读写分离,缓解数据库压力
四、MySQL主从复制的原理
以上铺垫了这么多,就是为了让你清楚主从复制的重要性,因此我们才必须好好掌握其实现原理与过程,从而能够在以后的工作开发中,面对MySQL的主从复制显得游刃有余,遇到问题也能及时处理。下面我们先看下MySQL主从复制的原理图:
具体的复制流程如下:
1)master主库的更新事件(如update、insert、delete)被写到binlog(二进制日志文件),记录任何修改了数据库数据的事件(前提是主库必须启用二进制日志)
2)从服务器开启一个线程(I/O Thread)把自己扮演成 MySQL 的客户端,通过 MySQL 协议,请求主服务器的二进制日志文件中的事件;
3)主服务器启动一个线程(Dump Thread),检查自己二进制日志中的事件,跟对方请求的位置对比,如果不带请求位置参数,则主服务器就会从第一个日志文件中的第一个事件一个一个发送给从服务器;
4)从服务器接收到主服务器发送过来的数据把它放置到中继日志(relay log)文件中。并记录该次请求到主服务器的具体哪一个二进制日志文件内部的哪一个位置(主服务器中的二进制文件会有多个,其名结尾以6位数递增);
5)从服务器启动另外一个线程(SQL Thread ),把 relay log 中的事件读取出来,并在本地再执行一次。
这里主服务器上的更改就同步到从服务器上了,这种复制和重复都是mysql自动实现的,我们只需要配置即可。其中涉及到3个线程,主服务器一个(Dump Thread),从服务器两个(I/O Thread和SQL Thread),这3个线程缺一不可。
五、MySQL主从复制的几种架构类型
MySQL主从复制常用的几种架构类型如下:
- 一主一从
- 主主复制
- 一主多从
- 多主一从(5.7开始支持)
- 联级复制
看下面图应该就理解了:

六、MySQL主从复制的模式
MySQL主从复制的模式主要有如下几种:
1、异步模式(mysql async-mode)
MySQL 主从复制默认是异步的模式,在异步模式下,主节点不会主动推送bin-log到从节点,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主节点如果崩溃掉了,此时主节点上已经提交的事务可能并没有传到从节点上,如果此时,强行将从提升为主,可能导致新主节点上的数据不完整。
2)半同步模式(mysql semi-sync)
半同步模式介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay-log中才返回成功信息给客户端(只能保证主库的bin-log至少传输到了一个从节点上,但并不能保证从节点将此事务执行更新到数据库中),否则需要等待直到超时时间然后切换成异步模式再提交。
相对于异步复制,半同步复制提高了数据的安全性,一定程度的保证了数据能成功备份到从库,同时它也造成了一定程度的延迟,但是比全同步模式延迟要低,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。
另外,同步模式不是mysql内置的,从mysql 5.5开始集成,需要master 和slave 安装插件开启半同步模式。
3)全同步模式
全同步模式,指当主库执行完一个事务,然后所有的从库都复制了该事务并成功执行完才返回成功信息给客户端。因为需要等待所有从库执行完该事务才能返回成功信息,所以全同步复制的性能必然会收到严重的影响。
4)GTID复制模式
GTID (global transaction identifier) 即全局事务ID, 保证了在每个在主库上提交的事务在集群中有一个唯一的ID。
在传统的复制里面,当发生故障,需要主从切换,需要找到bin-log和pos点(指从库更新到了主库bin-log的哪个位置,这个位置之前都已经更显完毕,这个位置之后未更新),然后将主节点指向新的主节点,相对来说比较麻烦,也容易出错。在MySQL 5.6里面,不用再找bin-log和pos点,我们只需要知道主节点的ip,端口,以及账号密码就行,因为复制是自动的,MySQL会通过内部机制GTID自动找点同步。
5)多线程复制
多线程复制(基于库),在MySQL 5.6以前的版本,slave的复制是单线程的,而master是并发写入的,所以延时是避免不了的。在MySQL 5.6里面,我们可以把多个表放在多个库,这样就可以使用多线程复制。Mysql 5.7 对 “多线程复制” 进行了改善,可以按照逻辑时钟的方式来分配线程,大大提高了复制性能
七、总结
以上就是MySQL主从复制(实时热备)的实现原理详解的全部内容,当然还有很多细节知识没有列出来,大家可以自己去钻研下。