揭秘MySQL主从复制:数据同步的幕后故事

数据库 MySQL
在全同步复制模式下,主库在完成事务后,会等待所有从库完成数据复制后,才向客户端反馈。这种方式虽然提高了安全性,但性能较差,尤其在从库数量较多时,整个过程将显得更加漫长。

MySQL 的主从复制基于 binlog 实现,其主要过程如下:

图片图片

  1. 从服务器在开启主从复制后,将会创建两个线程:I/O 线程与 SQL 线程。
  2. 从服务器的 I/O 线程会尝试与主服务器建立连接,主服务器中则有一个专门与从服务器的 I/O 线程进行交互的 binlog dump 线程。
  3. 从服务器的 I/O 线程会向主服务器的 dump 线程指明其接收 binlog 的起始位置。
  4. 在主服务器的更新过程中,更改记录会被保存到其 binlog 中,依据不同的 binlog 格式,记录的内容可能有所不同。
  5. 当 dump 线程检测到 binlog 发生变化时,将从指定位置开始读取内容,并由从服务器的 I/O 线程将其拉取过来。

这里需要注意的是,尽管某些资料提到主服务器向从服务器推送数据,实际上,过程是从服务器主动向主服务器拉取的。(https://dev.mysql.com/doc/refman/8.0/en/replication-implementation.html)

拉的模式,从库可以自行管理同步进度和处理延迟。

  • 从服务器的 I/O 线程在接收到通知事件后,会将内容保存至 relay log 中。
  • 从服务器的 SQL 线程则会不断读取自身的 relay log,将内容解析为具体操作,并将其写入数据表中。

复制方式

MySQL 目前支持多种复制方式,包括全同步复制、异步复制和半同步复制。

异步复制:这是 MySQL 的默认复制方式。在异步复制中,主库在执行完事务后会立即向客户端返回,无需关心从库是否完成该事务的执行。这种方式可能导致问题:当主库发生故障时,尽管事务已执行完毕,但数据可能尚未同步至从库,导致从库在升级为主库时丢失此次事务的变更内容。

全同步复制:在全同步复制模式下,主库在完成事务后,会等待所有从库完成数据复制后,才向客户端反馈。这种方式虽然提高了安全性,但性能较差,尤其在从库数量较多时,整个过程将显得更加漫长。

半同步复制:半同步复制介于全同步与异步之间。当主库执行完事务后,它不会立即反馈给客户端,而是等待至少一个从库完成接收事件后再反馈。在这一方案中,主库会在事务提交的两个阶段完成后,等待从库接收到 binlog 后,再返回成功。

在上面这篇中所绘制的图示中,如果将半同步复制的过程也纳入其中,那么图示将会变为:

图片图片

责任编辑:武晓燕 来源: 码上遇见你
相关推荐

2012-11-26 10:17:44

InnoDB

2024-03-01 18:33:59

MySQL节点数据

2021-06-08 07:48:27

MySQL主从配置

2024-07-04 08:00:24

2017-09-05 16:00:49

MySQL主从复制备份

2017-10-11 15:40:20

MySQL主从复制拓扑结构

2023-03-19 22:38:12

逻辑复制PostgreSQL

2023-03-19 11:53:27

2021-03-19 11:33:42

MySQL数据库备份

2023-02-27 07:33:14

MySQL数据库服务器

2021-01-12 09:03:17

MySQL复制半同步

2017-06-23 22:00:13

MySqlsslcentos

2020-04-14 16:26:22

MySQL线程同步

2023-09-24 14:32:15

2023-07-03 08:57:45

Master服务TCP

2022-12-20 08:46:41

MySQL主从复制

2011-06-16 14:45:11

2011-04-06 09:59:00

MySQL数据库主从复制

2023-04-06 13:15:48

MySQL复制原理应用实践

2024-07-04 17:22:23

点赞
收藏

51CTO技术栈公众号