MySQL主从复制(7)——MySQL的三种复制方式:异步复制、半同步复制、全同步复制

MySQL主从复制(7)——MySQL的三种复制方式:异步复制、半同步复制、全同步复制

MySQL3.23.15版本引入了复制技术,复制的实现涉及到两个线程,一个在 Master,一个在 Slave。Slave的 I/O 和 SQL 功能作为一个线程,从 Master 获取到 event 后直接 apply,没有 relay log。这种复制方式使主备存在较大延迟,可能导致大量 binary log 没有备份到 Slave 端。从 MySQL4.0.2 版本开始将 Slave 端 event 读取和执行独立成两个线程,即 IO 线程和 SQL 线程,并引入了 relay log。IO 线程读取 event 后写入 relay log,SQL 线程从 relay log 中读取 event 然后执行。以上的复制方式为异步复制:主库的事务执行不考虑备库的同步进度,如果备库延迟时间较长,当主库宕机后,可能会导致数据丢失。

在MySQL在5.5中引入了半同步复制技术:主库在应答客户端提交的事务前需要保证至少一个从库接收并写到 relay log中。

在 MySQL5.7.17中引入了 InnoDB Group Replication 的概念,提供了基于 Group replication 的全同步技术。

下面分别介绍异步复制、半同步复制、全同步复制:

一、异步复制

MySQL默认的复制就是异步复制,主库在执行完客户端提交的事务后会立即将结果返回给客户端,并不关心从库是否已经接收并处理。主库将事务 Binlog 事件写入到 Binlog 文件中,此时主库只是通知 Dump 线程发送这些新的 Binlog,然后主库就会继续处理提交操作,并不保证这些 Binlog 传到任何一个从库节点上。这样就会存在一个问题,如果主库出现故障,此时主库已经提交的事务可能并没有传到从库上,可能导致数据丢失。

MySQL 的异步复制,依靠二进制日志进行数据复制。比如有两台机器:一台主库(master),一台从库(slave)。

(1)正常的复制:事务一(t1)写入 binlog buffer;dumper 线程通知 slave 有新的事务 t1;binlog buffer 进行checkpoint;slave 的 IO 线程接收到 t1 并写入到自己的的 relay log;slave 的 SQL 线程写入到本地数据库。 这种情况下,master 和 slave 都能看到这条新的事务,如果 master 宕机,slave 可以提升为新的 master。

(2)异常的复制:事务一(t1)写入 binlog buffer;dumper 线程通知 slave 有新的事务t1;binlog buffer 进行checkpoint;slave 因为网络不稳定,一直没有收到 t1;如果 master 宕机,slave 提升为新的 master,则 t1 丢失。

(3)存在的问题:主库和从库事务更新不同步,导致从库和主库的数据不一致。

二、全同步复制

当主库提交事务之后,所有的从库节点必须收到、APPLY并且提交这些事务,然后主库线程才能继续做后续操作。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

三、半同步复制

介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到 relay log 中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟。

半同步复制的出现,就是为了保证在任何时刻主备数据一致的问题。相对于异步复制,半同步复制要求执行的每一个事务,都要求至少有一个备库成功接收后,才返回给用户。实现原理也很简单,主库本地执行完毕后,等待备库的响应消息(包含最新备库接收到的binlog(file,pos)),接收到备库响应消息后,再返回给用户,这样一个事务才算真正完成。在主库实例上,有一个专门的线程(ack_receiver)接收备库的响应消息,并以通知机制告知主库备库已经接收的日志,可以继续执行。

半同步复制原理如下图所示:

在这里插入图片描述

半同步复制的过程:master 将每个事务写入 binlog(sync_binlog=1),传递到 slave 刷新到磁盘(sync_relay=1),同时主库提交事务(commit)。master 等待 slave 反馈收到 relay log,只有收到 ACK 后 master 才将 commit OK 结果反馈给客户端。

半同步复制的特点:

(1)从库会在连接到主库时告诉主库,它是不是配置了半同步。
(2)如果半同步复制在主库端开启,并且至少有一个半同步复制的从库节点,那么此时主库的事务线程在提交时会被阻塞并等待,结果有两种可能:(a)至少一个从库节点通知它已经收到了所有这个事务的Binlog事件;(b)一直等待直到超过配置的某一个时间点为止,此时,半同步复制将自动关闭,转换为异步复制。
(3)从库节点只有在接收到某一个事务的所有 Binlog,将其写入到 Relay Log 文件之后,才会通知对应主库上面的等待线程。
(4)如果在等待过程中,等待时间已经超过了配置的超时时间,没有任何一个从节点通知当前事务,那么此时主库会自动转换为异步复制,当至少一个半同步从节点赶上来时,主库便会自动转换为半同步方式的复制。
(5)半同步复制必须是在主库和从库两端都开启时才行,如果在主库上没打开,或者在主库上开启了而在从库上没有开启,主库都会使用异步方式复制。

参考文献:

1、https://blog.csdn.net/xihuanyuye/article/details/81220524?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight

2、https://blog.csdn.net/qq_41977453/article/details/103851419?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.edu_weight

3、https://www.cnblogs.com/zero-gg/p/9057092.html

猜你喜欢

转载自blog.csdn.net/weixin_44377973/article/details/107520467
今日推荐