Mysql的数据同步机制

162 阅读3分钟

Mysql的数据同步机制是构建数据库高可用以及高扩展性的核心技术,Mysql支持同步主从模式、异步主从模式、半同步模式(其中包括after_sync,after_commit),接下来分别介绍下其中的原理。

主从复制原理图

image.png

主从复制整体分为以下三个步骤:

  1. 主库将数据库的变更操作记录到Binlog日志文件中。

  2. 从库读取主库中的Binlog日志文件信息写入到从库的Relay Log中继日志中

  3. 从库读取中继日志信息在从库中进行Replay,更新从库数据信息

    在上述三个过程中,涉及了Master的BinlogDump Thread和Slave的I/O Thread、SQL Thread,它们的作用如下:

  • Master服务器对数据库更改操作记录在Binlog中,BinlogDump Thread接到写入请求后,读取Binlog信息推送给Slave的I/O Thread。
  • Slave的I/O Thread将读取到的Binlog信息写入到本地Relay Log中。
  • Slave的SQL Thread检测到Relay Log的变更请求,解析relay log中内容在从库上执行

同步主从模式

同步主从模式性能最差,需要等待所有的slave节点ack后才能提交事务,但是其数据一致性最好。

image.png

异步主从模式

master事务的提交不需要经过slave的确认,slave是否接收到master的binlog,master并不关心。slave接收到master binlog后先写relay log,最后异步地去执行relay log中的sql应用到自身。由于master的提交不需要确保slave relay log是否被正确接受,当slave接受master binlog失败或者relay log应用失败,master无法感知。

image.png mysql主从复制存在的问题:

  1. 主库宕机后,数据可能丢失。
  2. 从库只有一个SQL Thread,主库写压力大,复制很可能延时。

解决方法:

  1. 半同步复制---解决数据丢失的问题
  2. 并行复制----解决从库复制延迟的问题

半同步复制

为了提升数据安全,MySQL让Master在某一个时间点等待Slave节点的 ACK(Acknowledge character)消息,接收到ACK消息后才进行事务提交,这也是半同步复制的基础,MySQL从5.5版本开始引入了半同步复制机制来降低数据丢失的概率。Mysql的半同步复制分为after_commit,和after_sync两种模式,其中after_commit极端情况下会造成数据丢失,after_sync 可以使RPO 0,但是极端情况下slave会存在多数据的场景;

after_commit模式

image.png

after_sync模式

image.png

半同步复制之前先快速过一下 MySQL 事务写入碰到主从复制时的完整过程,主库事务写入分为4个步骤:

  1. InnoDB Redo File Write (Prepare Write)
  2. Binlog File Flush & Sync to Binlog File
  3. InnoDB Redo File Commit(Commit Write)
  4. Send Binlog to Slave

当Master不需要关注Slave是否接受到Binlog Event时,即为传统的主从复制。
当Master需要在第三步等待Slave返回ACK时,即为 after-commit,半同步复制(MySQL 5.5引入)。
当Master需要在第二步等待 Slave 返回 ACK 时,即为 after-sync,增强半同步(MySQL 5.7引入)。