【MySQL篇09】:binlog与主从同步(主从复制)

文章目录

  • MySQL主从同步原理:构建高可用和读写分离的基础
  • 核心原理:基于二进制日志 (`Binlog`) 的事件传递
    • 主从同步的详细步骤
      • 步骤 1: 主库记录 Binlog
      • 步骤 2: 从库读取主库的 Binlog 并写入中继日志
      • 步骤 3: 从库重做中继日志中的事件
    • 通俗易懂的类比
  • 总结

MySQL主从同步原理:构建高可用和读写分离的基础

MySQL主从同步,也称为主从复制,是MySQL数据库中一种非常重要的技术,它允许你将一个MySQL数据库服务器(主库,Master)的数据变更实时地同步到另一个或多个MySQL数据库服务器(从库,Replica/Slave)。

这项技术在实际应用中有着广泛的应用,主要为了解决以下几个核心问题:

  1. 高可用性 : 当主库发生故障时,可以快速地将一个从库提升为新的主库,从而保证业务的连续性,减少停机时间。
  2. 读写分离 x: 大部分应用场景下,读操作的频率远高于写操作。通过主从同步,可以将大量的读请求分发到从库上,减轻主库的压力,提升整体数据库的吞吐量。
  3. 数据备份与灾难恢复 : 从库可以作为主库的实时备份,当主库数据丢失或损坏时,可以通过从库进行数据恢复。
  4. 数据分发与报表分析 : 可以将数据同步到多个从库,用于不同的目的,例如一个从库用于读写分离,另一个从库用于报表分析,避免报表查询对主库造成性能影响。

核心原理:基于二进制日志 (Binlog) 的事件传递

MySQL主从同步的核心思想是通过记录主库上发生的数据变更事件,并将这些事件传递给从库,让从库按照同样的顺序执行这些事件,从而达到数据一致性。这个记录数据变更事件的关键文件就是二进制日志 (Binlog)

你可以把Binlog想象成一本详细记录了主库上所有“操作指令”的日记。每当你在主库上执行一个INSERT、UPDATE、DELETE等修改数据的SQL语句时,MySQL都会把这个操作记录到Binlog中。

主从同步的详细步骤

为了更好地理解这个过程,我们可以将其分解为三个主要步骤,并用一个简单的流程图来表示:

+-----------------+       +-------------------+       +------------------+
|   主库 (Master) |       |     网络传输       |       |  从库 (Replica)  |
|                 |       |                   |       |                  |
| 1. 事务提交     | ----> | 2. 读取 Binlog     | ----> | 3. 写入 Relay Log|
|    记录 Binlog  |       |  发送 Binlog Event |       |                  |
|                 |       |                   |       | 4. 重做 Relay Log|
|                 |       |                   |       |    应用到数据    |
+-----------------+       +-------------------+       +------------------+

下面我们来详细解释每一个步骤:

步骤 1: 主库记录 Binlog

  • 触发时机: 当主库上的一个事务成功提交时,MySQL会将该事务中所有对数据进行的修改操作记录到 Binlog 文件中。
  • Binlog 的内容: Binlog 记录的不是SQL语句本身,而是数据变更事件 (Binlog Event)。这些事件包含了修改了哪些数据、修改后的值是什么等信息。Binlog 有不同的格式,常见的有 Statement、Row 和 Mixed 格式,其中 Row 格式记录的是行级别的变更,是最常用也是最推荐的格式,因为它能保证更准确的复制。
  • 重要性: Binlog 是主从同步的基础,如果 Binlog 丢失或损坏,将导致主从数据不一致。

步骤 2: 从库读取主库的 Binlog 并写入中继日志

  • 角色: 在从库上,有两个关键的线程在工作:
    • I/O 线程 (I/O Thread): 这个线程负责连接到主库,并请求主库发送 Binlog 事件。它会不断地从主库读取 Binlog 文件,并将读取到的事件写入到从库本地的一个特殊文件,称为中继日志 (Relay Log)
    • 主库的 Binlog 发送线程 (Binlog Dump Thread): 在主库上,有一个专门的线程负责响应从库的 I/O 线程的请求,并将 Binlog 事件发送给从库。
  • 过程: I/O 线程会记录自己已经读取到主库 Binlog 的哪个位置(文件名和偏移量)。当主库有新的 Binlog 事件产生时,I/O 线程会感知到并将其拉取到本地,然后写入到 Relay Log 中。
  • Relay Log 的作用: Relay Log 相当于从库本地的一个临时缓存,用于存储从主库拉取过来的 Binlog 事件,等待 SQL 线程进行重做。

步骤 3: 从库重做中继日志中的事件

  • 角色: 在从库上,还有一个重要的线程:
    • SQL 线程 (SQL Thread): 这个线程负责读取 Relay Log 中的事件,并按照事件的顺序在从库上执行这些操作,从而将数据变更反映到从库的数据库中。
  • 过程: SQL 线程会按照 Relay Log 中记录的事件顺序,逐个执行这些事件。例如,如果 Relay Log 中记录了一个 INSERT 事件,SQL 线程就会在从库上执行相应的 INSERT 操作。
  • 数据一致性: 通过重做 Relay Log 中的事件,从库最终会达到与主库相同的数据状态,实现数据的一致性。

通俗易懂的类比

你可以将主从同步想象成以下场景:

  • 主库 (Master): 想象一下你正在写一本非常重要的日记 (Binlog),记录了你每天做的所有重要的事情 (数据变更事件)。
  • 从库 (Replica): 你的朋友 (从库) 想要知道你每天做了什么,所以他会定期来你这里,把你的日记内容抄写到他自己的笔记本 (Relay Log) 上。
  • I/O 线程: 你的朋友负责抄写日记的人。
  • SQL 线程: 你的朋友抄写完日记后,会按照日记的内容,在他自己的生活中重复一遍你做的事情,这样他和你做的事情就一样了,你们俩的状态也就同步了。

总结

MySQL主从同步的核心原理就是通过主库记录 Binlog,从库通过 I/O 线程拉取 Binlog 并写入 Relay Log,最后由 SQL 线程重做 Relay Log 中的事件,从而实现数据的同步。

你可能感兴趣的:(MySQL篇,mysql,数据库,java,后端,面试)