2.8、MySQL主从复制
2.8.1、简介
MySQL复制:为保证主服务器和从服务器的数据一致性,在向主服务器插入数据后,从服务器会自动将主服务器中修改的数据同步过来。
主从复制的原理:将数据库中DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行,从而使从数据库和主数据库的数据保持一致。
主从复制的作用:
-
当主数据库出现问题时,可以随时切换一个从数据库成为新的主数据库
-
在数据库层面进行读写分离
- 主服务器负责写,从服务器负责读,缓解了锁的竞争
- 从服务器可以使用MyISAM,提升查询性能及节约系统开销
- 增加冗余,提高可用性
-
在从数据库上进行日常的备份
-
进行升级测试时,数据可以恢复
2.8.2、主从的形式
-
一主一从
-
一主多从
-
多主一从:可以将多个mysql数据库备份到一台存储性能比较好的服务器上
-
双主复制:每个master既是master,又是另外一台服务器的slave,任何一方所做的变更,都会通过复制应用到另外一方的数据库中。
-
级联复制:部分slave的数据同步不连接主节点,而是连接从节点。因为如果主节点有太多的从节点,就会损耗一部分性能用于replication,那么我们可以让3~5个从节点连接主节点,其它从节点作为二级或者三级与从节点连接,这样不仅可以缓解主节点的压力,并且对数据一致性没有负面影响
2.8.3、MySQL的主从
MySQL实现主从复制主要是有三个线程:binlog线程(主节点),I/O线程(从节点),SQL线程(从节点)。默认是异步的模式。
- binlog线程:负责将主服务器上的数据更改写入到二进制日志(Binary log)中。
- I/O线程:负责从主服务器上读取二进制日志(Binary log),并写入从服务器的中继日志(Relay log)中。
- SQL线程:负责读取中继日志,解析出主服务器中已经执行的数据更改并在从服务器中重放
![image-20220806110425104](https://i-blog.csdnimg.cn/blog_migrate/8eeb5169558d6b31306e144312356f80.png)
- 主节点为每一个从节点都启动一个binlog dump线程。主节点在每个事务更新数据完成之前,会将将操作记录写入到binlog中,保存在日志文件(bin log file)。
- 从节点每隔一段时就对主节日志文件进行探测,如果探测到发生改变,则发送I/O请求,请求从指定日志文件(bin log file)的指定位置(bin log position)之后的日志内容。
- 当主节点收到I/O请求后,读取指定文件的指定位置之后的日志信息,返回给从节点(包括本次返回的信息的 bin-log file 以及 bin-log position)。
- 从节点通过I/O线程接收到binlog内容后,将日志内容写入到中继日志(Relay log)中,并将读取到的 bin log file(文件名)和position(位置)保存到 master-info 文件中,方便下一次的获取。
- 从节点的SQL线程读取中继日志,解析 relay-log 的内容,并在本数据库中执行。
2.8.3、复制模式
mysql默认的复制是异步的,为了解决数据丢失的问题,引入了半同步复制机制,同时为了解决主库写压力大,从库复制可能出现延迟的问题,可以开启多线程并行复制。mysql的一主一从、一主多从、双主都是一个复制源,而mysql5.7开始支持多源复制,允许多个主库同时对一个从库进行复制。
-
异步复制:主库在将事件写入binlog后即成功返回客户端,但并不知道从库是否以及何时会获取和处理日志,这样不会影响效率,但如果Binlog 还没有同步到从库的时候,主库宕机了,这时候从从库中选择一个作为新主,那么新主会缺少原来主服务器中刚刚改写的数据,导致数据不一致。所以,这种复制模式下的数据一致性是最弱的。
-
半同步复制:MySQL5.5 版本之后开始支持半同步复制的方式。主库在提交后执行事务提交的线程将一直等待,直到至少有一个半同步从库确认已接收到所有事件,从库在将事件写入其中继日志(relay log)并刷新到磁盘后,才会对接收到事务的事件进行确认,主库收到确认后才会对客户端进行响应。相比于异步复制来说,提高了数据的一致性,但是增加了一个网络连接的延迟,降低了主库写的效率。(当主库等待超时后,会还原为默认的异步复制)。
MySQL5.7 提供rpl_semi_sync_master_wait_for_slave_count参数,让我们自己对应答从库设置,默认为 1,只要有 1 个从库进行了响应,就可以返回给客户端。参数越大,数据一致性越高,但主库等待从库响应的时间也会增加。
-
并行复制(组复制,简称 MGR(MySQL Group Replication)):MySQL 5.7 中引入基于组提交的并行复制,是基于 Paxos 协议的状态机复制。
将多个节点共同组成一个复制组,在执行读写(RW)事务的时候,需要经过组里大多数节点的同意(数量大于N/2+1)后,可以进行提交。而针对只读(RO)事务则不需要经过组内同意,直接 提交 即可。
在一个复制组内有多个节点组成,它们各自维护了自己的数据副本,并且在一致性协议层实现了原子消息和全局有序消息,从而保证组内数据的一致性。
其核心思想:一个组提交的事务都是可以并行回放,因为这些事务都已进入到事务的 准备 阶段,则说明事务之间没有任何冲突。判断事务是否处于一个组是通过 last_committed 变量(表示事务提交的时候,上次事务提交的编号),如果事务具有相同的 last_committed,则表示这些事务都在一组内,可以进行并行的回放。
-
多源复制:多主一从的复制方式,5.7版本开始支持,在此前只能实现一主一从、一主多从或者多主多从的复制(多源复制至少需要两个Master和一个Slave)。