https://mp.weixin.qq.com/s/6k1Go9P7xGtYY8MCC_Qzcg

基础篇

第1章 复制的概述

​ “复制”就是将来自一个MySQL Server(这里指 master角色,即主库)的数据变更,通过其逻辑的二进制日志 (binlog)传输到其他的一个或多个MySQL Server(这里指slave角 色,即从库)中,其他MySQL Server通过应用(回放)这些逻辑的二 进制日志来完成数据的同步。这些MySQL Server之间的逻辑关系,我 们称为“复制拓扑”(也可以称为“复制架构”)。

​ 默认情况下,复制是异步的,即主库将二进制日志传输到从库之 后,并不关心从库是否成功收到。从库是否收到这些二进制日志,不 影响主库的任何读/写访问;而从库的复制线程也可以随意暂停或停 止,并不影响主库的读/写访问。通常,异步模式能够发挥数据库的最高性能,但数据安全性却得不到很好的保证,如果对数据安全性的要 求较高,可以考虑使用半同步复制

MySQL 5.7支持以下两种数据同步方法(也可以称为复制模式或复制方法):

  • 传统复制:也可以称为基于二进制日志文件和位置的复制,在 从库中配置复制时,要求指定从主库中获取的二进制日志文件 (binlog file)和位置(binlog position),以便从库中的复制线 程启动时,能够以指定的二进制日志文件和位置为起点,持续读取主 库中的二进制日志,并在从库中应用,从而达到数据同步的目的。
  • 基于GTID的复制(本书中为了表述上的方便,简称为GTID复 制):GTID(全局事务标识符)是新的事务性复制方法,利用GTID可 以自动在主库中寻找需要复制的二进制日志记录,因此不需要关心日 志文件或位置,极大地简化了许多常见的复制任务。使用GTID复制可 确保主库和从库之间的一致性。有关GTID的更多细节,详见4.2节 “GTID复制”。

4种的数据同步类型

  • 异步复制:MySQL内置支持
  • 半同步复制:使用半同步复制时,主 库的会话在提交事务之前,会等待至少一个从库返回收到二进制日志 的ACK消息。
  • 延迟复制:以便在出现误操作时,有时间对误操作的数据进行补救。
  • 同步复制:

MySQL支持两种二进制日志格式

​ 一种是记录语句原始文本(即statement格式,语句文本按原 样记录到二进制日志),另一种是记录数据的逐行变更(即row格式, 将一个语句记录到二进制日志中,可能产生多行数据变更记录)。

  • 基 于 statement 的 复制:当系统变量binlog_format设置为statement时表示使用SBR。 SBR复制的是整个SQL语句的原始文本,日志量较小,但容易出现主从 库数据不一致。对于SBR,当执行的某个语句被判定为不安全时,是否 允许其执行还取决于事务的隔离级别。
  • 基于row的复制(Row Based Replication,RBR):当系统变量 binlog_format设置为row时表示使用RBR。RBR复制的是发生更改的数据行的实际记录(原始语句会被转换为发生变更的行数据记录),日志量较大,但可以保证主从库数据的一致性。
  • 混 合 复 制 ( Mixed Based Replication , MBR ) : 系 统 变 量 binlog_format设置为mixed时表示使用MBR。MBR实际上是由MySQL自行 判断的,即在不影响数据一致性的情况下,使用SBR;如果可能影响数 据一致性,则自动转换为RBR。

第4章 传统复制与GTID复制

MySQL 5.6之前的版本只支持传统复制,即“基于二进制日志文件 (binlog file)和位置(binlog pos)的复制”。在该复制模式中, 复制拓扑的初始化配置和变更、复制的高可用切换等操作都需要找到 正确的二进制日志文件和位置,否则就无法正确复制。GTID复制,它利用GTID自动定位的特性,不再需要二进制 日志的位置信息,也就省去了寻找这些信息所需的烦琐步骤,极大地 简化了复制拓扑的初始化配置和变更,以及复制的高可用切换等操 作。