mysql-主从复制理论

Posted shark_西瓜甜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql-主从复制理论相关的知识,希望对你有一定的参考价值。

主从复制原理

mysql 复制功能使用三个主线程实现,一个在 master 服务器上,两个在 slave上:

Binary log 转储线程。 当 slave 连接时到 master,master 创建一个线程将二进制日志内容发送到 slave 。该线程可以在 master 的 MySQL命令行中执行SHOW PROCESSLIST命令,输出中标识为Binlog Dump线程。

二进制日志转储线程获取 master 二进制日志的锁,用于读取要发送到 slave 的每个事件。一旦事件被读取,锁就会被释放,甚至在事件被发送到 slave 之前。

Replication I/O 线程。 当在 slave 服务器上发出一条START SLAVE语句时, slave 会创建一个 I/O 线程,该线程连接到 master 并要求它发送记录在其二进制日志中的更新。

slave 的复制 I/O 线程读取 master Binlog Dump线程发送的更新 (请参阅上一项)并将它们复制到包含中继日志的本地文件。

在 slave 上执行 SHOW SLAVE STATUS语句的输出中,该线程的状态显示为: Slave_IO_running。

Replication SQL 线程。 slave 创建一个 SQL 线程来读取由 Replication I/O 线程写入的中继日志并执行其中包含的事务。

每个 master / slave 连接有三个主线程。具有多个 slave 的 master 为每个当前连接的 slave 创建一个二进制日志转储线程,每个 slave 都有自己的复制 I/O 和 SQL 线程。

slave 使用两个线程将读取更新与 master 分开,并将它们执行到独立的任务中。因此,如果应用它们的过程很慢,读取事务的任务不会减慢。例如,如果 slave 服务器有一段时间没有运行,它的 I/O 线程可以在 slave 启动时快速从 master 中获取所有二进制日志内容,即使 SQL 线程远远落后。如果 slave 在 SQL 线程执行完所有获取的语句之前停止,则 I/O 线程至少获取了所有内容,以便将事务的安全 slave 本地存储在 slave 的中继日志中,以备下次执行 slave 开始。

您可以通过将slave_parallel_workers系统变量设置为大于 0 的值(默认值)来为 slave 上的任务启用进一步的并行化 。设置此系统变量后, slave 将创建指定数量的工作线程来应用事务,以及一个协调器线程来管理它们。如果您使用多个复制通道,则每个通道都有此数量的线程。与 slave slave_parallel_workers设置为一个值大于0被称为一个多线程的复制品。通过此设置,可以重试失败的事务。

复制格式

复制之所以有效是因为写入二进制日志的事件是从源读取然后在副本上处理的。事件根据事件的类型以不同的格式记录在二进制日志中。使用的不同复制格式对应于在源的二进制日志中记录事件时使用的二进制日志格式。二进制日志格式与复制期间使用的术语之间的相关性是:

  • 使用基于语句的二进制日志时,源将 SQL 语句写入二进制日志。将源复制到副本的工作方式是在副本上执行 SQL 语句。这称为 基于语句的复制(可以缩写为 SBR),它对应于 MySQL 基于语句的二进制日志格式。
  • 使用基于行的日志记录时,源将事件写入 二进制日志,指示单个表行的更改方式。将源复制到副本的工作方式是将表示表行更改的事件复制到副本。这称为基于行的复制(可以缩写为 RBR)。
  • 您还可以将 MySQL 配置为混合使用基于语句和基于行的日志记录,具体取决于哪种最适合记录的更改。这称为 混合格式日志记录。使用混合格式日志时,默认使用基于语句的日志。根据某些语句以及所使用的存储引擎,日志在特定情况下会自动切换为基于行。使用混合格式的复制称为 基于混合的复制 或混合格式复制。有关更多信息,请参阅 第 5.4.4.3 节,“混合二进制日志记录格式”

在 MySQL 5.7.7 之前,基于语句的格式是默认格式。在 MySQL 5.7.7 及更高版本中,基于行的格式是默认值。

例外:在 NDB Cluster 中,默认值为MIXED; NDB Cluster 不支持基于语句的复制。

设置二进制日志格式

binlog_format

命令行格式--binlog-format=format
系统变量binlog_format
范围全局,会话
动态的是的
类型枚举
默认值ROW
有效值MIXED STATEMENT ROW
  • ROW 行
  • STATEMENT 语句
  • MIXED 混合

设置时机

可以在启动时或运行时设置。
但在某些情况下,无法在运行时更改此变量或将导致复制失败。

如下情况下,无法在运行时切换复制格式:

  • 从存储的函数或触发器中。

  • 如果会话当前处于基于行的复制模式并且具有打开的临时表。

  • 从交易中。

⚠️注意: master 和 slave 的复制格式必须一致,并且需要各自单独设置生效。

slave 中的变量

忽略某些逻辑库

不复制某些逻辑库的更新操作

命令行格式 --replicate-ignore-db=db_name
变量格式 replicate_ignore_db=name

告诉复制SQL线程不要更新 db_name 数据库中的任何表。默认数据库无效。

要指定多个要忽略的数据库,请多次使用此选项,每个数据库一次。由于数据库名称可以包含逗号,如果您提供逗号分隔列表,则该列表将被视为单个数据库的名称。

忽略某些表

--replicate-ignore-table=db_name.tbl_name

更多参考官方文档

异步复制

传统的 MySQL 复制提供了一种简单的主从复制方法。有一个 master(源)和一个或多个 slave(副本)。
master 节点执行事务,提交它们,然后它们稍后发送到辅助节点在基于语句的复制中或在基于行的复制中重新执行。
它是一个无共享系统,默认情况下所有服务器都有数据的完整副本。

在这里插入图片描述

半同步复制

半同步复制,它为协议增加了一个同步步骤。

这意味着 master 节点在提交时等待 slave节点确认它已收到事务。只有这样,主节点才会进行提交操作。
在这里插入图片描述

以上是关于mysql-主从复制理论的主要内容,如果未能解决你的问题,请参考以下文章

MySQL主从复制与读写分离的理论+实操(配有详细图释)

从理论到实战,彻底搞懂MySQL主从复制原理

mysql-主从复制理论

为啥mysql主从复制,从刚开始能复制一会就不行了

MySQL主从架构

Java面试题及答案2020,java理论知识总结