MySql 主从同步会不会影响到SQL执行速度?

异步复制(默认):

主库在执行完客户端提交的事务后会立即将结果返给客户端,并不关心从库是否已经接受处理 客户端体验好,所以并不会影响到SQL执行速度

全同步复制

放主库执行完一个事物,会等待--(所有从库)--都执行了该事务才返回给客户端

半同步复制

介于异步和同步之间,主库在执行完客户端提交事务后不是立刻返回给客户端,而是等待--(至少一个)--从库接受到并写到relay log 中才返回给客户端

全同步复制

 原文链接:https://blog.csdn.net/m0_45036821/article/details/105933929

主从同步开启的时候,slave上会创建两个线程:I\O线程和Sql线程。

I\O线程连接到master机器,master机器上的binlog dump 线程会将binlog的内容发送给该I\O线程。该I/O线程接收到binlog内容后,再将内容写入到本地的relay log;

sql线程。该线程读取到I/O线程写入的ralay log。并且根据relay log。并且根据relay log 的内容对slave数据库做相应的操作。

总结一下主从同步原理:

主库(Master)线程

Binlog Dump 线程(Binlog Dump Thread)

作用:负责将主库的二进制日志(binary log)数据传输到从库。

工作方式:当从库连接到主库时,主库会为每个连接的从库开启一个 Binlog Dump 线程。这个线程从主库的二进制日志中读取日志记录,并将其发送给从库。

Binlog Dump GTID 线程(Binlog Dump GTID Thread)

作用:处理与 GTID(Global Transaction Identifier)相关的复制任务。

工作方式:在 GTID 模式下,主库会开启一个专门处理 GTID 的线程,以确保 GTID 复制的正确性和一致性。

从库(Slave)线程

I/O 线程(I/O Thread)

作用:负责从主库接收二进制日志并将其写入到从库的中继日志(relay log)。

工作方式:从库的 I/O 线程连接到主库,读取主库的二进制日志,然后将这些日志记录写入到从库的中继日志中。

SQL 线程(SQL Thread)

作用:在从库上执行主库的变更操作。

工作方式:从库的 SQL 线程读取从中继日志中提取的日志记录,并在从库上执行这些记录中的 SQL 语句,从而实现数据同步。

Relay Log Writer 线程(Relay Log Writer Thread)

作用:负责将从主库接收到的二进制日志写入到从库的中继日志。

工作方式:Relay Log Writer 线程从 I/O 线程接收到的日志数据中写入中继日志文件,为 SQL 线程提供执行的输入。

Relay Log Reader 线程(Relay Log Reader Thread)

作用:读取从库的中继日志。

工作方式:Relay Log Reader 线程读取中继日志中的数据,并将其传递给 SQL 线程进行执行。

总结

主库:

Binlog Dump 线程:将二进制日志传输给从库。

Binlog Dump GTID 线程(在启用 GTID 模式时):处理 GTID 相关的复制任务。

从库:

I/O 线程:从主库接收二进制日志并写入中继日志。

SQL 线程:读取中继日志并执行日志记录中的 SQL 语句。

Relay Log Writer 线程:将二进制日志写入中继日志。

Relay Log Reader 线程:读取中继日志并传递给 SQL 线程。

这些线程在主从复制过程中各司其职,确保主库和从库之间的数据一致性和同步。

什么是GTID模式?

启用 GTID 模式(Global Transaction Identifier)之后,你通常不需要在配置从库时指定 MASTER_LOG_FILE 和 MASTER_LOG_POS 这两个参数。这是因为 GTID 模式提供了更为先进的复制方式,可以自动管理和跟踪事务的状态,无需手动指定日志文件和位置。

GTID 模式的工作原理

GTID 模式 通过全局唯一的事务标识符(GTID)来跟踪和管理事务。这些标识符是全球唯一的,能确保主库和从库之间的一致性。

主库 在 GTID 模式下会为每个事务分配一个唯一的 GTID,并将其记录到二进制日志中。

从库 在同步过程中,通过 GTID 来确定哪些事务已经应用,从而实现与主库的数据一致性。GTID 可以自动处理事务的应用,无需从库知道具体的日志文件和位置。

那么主从同步为什么发生从库同步延迟问题呢?

MySQL 主从复制基本原理

主库写入操作:

当主库(Master)上有写操作(如 DDL 和 DML 操作,即数据定义语言和数据操作语言)时,这些操作会被记录到二进制日志(binlog)中。

Binlog 是顺序写入的,所以效率很高。

从库读取日志:

从库(Slave)有一个 Slave_IO_Running 线程,它的工作是从主库读取 binlog 并存储在自己的中继日志(relay log)中。

这一过程效率较高,因为它主要是顺序读取和写入。

从库应用日志:

从库有一个 Slave_SQL_Running 线程,它从中继日志中读取记录并在从库上执行这些操作。

这些操作在从库上可能是随机写入的,这样会导致更多的 I/O 操作和潜在的锁竞争,成本比顺序写高很多。

为什么从库会有延迟

单线程限制:

Slave_SQL_Running 线程是单线程的,这意味着从库在执行 DDL 和 DML 操作时是顺序执行的。如果一个操作(比如一个耗时10分钟的 DDL 操作)阻塞了,那么所有后续的操作都要等它完成后才能执行。

主库并发执行:

主库可以并发地执行多个操作,因此即使一个操作需要10分钟,其它操作也可以继续执行,不会阻塞。而从库由于单线程的限制,会导致操作被顺序阻塞,从而产生延迟。也就是当主库的TPS并发较高时,产生的DDL数量超过slave一个sql线程所能承受的范围,那么延时就产生了

主从数据不同步的解决方案是什么?

主从数据库开启后可能出现什么问题

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

解决方案

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

异步复制原理、半同步复制和并行复制原理比较



事务在主库写完binlog后需要从库返回一个已接受,才放回给客户端;5.5集成到mysql,以插件的形式存在,需要单独安装确保事务提交后binlog至少传输到一个从库不保证从库应用完成这个事务的binlog性能有一定的降低网络异常或从库宕机,卡主库,直到超时或从库恢复

相关推荐
LUCIAZZZ3 分钟前
Https解决了Http的哪些问题
java·网络·网络协议·spring·http·rpc·https
hxung21 分钟前
MySQL面试学习
学习·mysql·面试
论迹24 分钟前
【JavaEE】-- 多线程(初阶)2
java·开发语言·java-ee
桃子是唯一的水果33 分钟前
java 单例模式(Lazy Initialization)实现遍历文件夹下所有excel文件且返回其运行时间
java·单例模式·maven
+72034 分钟前
如何在java中用httpclient实现rpc post 请求
java·开发语言·rpc
ybq1951334543136 分钟前
javaEE-SpringBoot日志
java·spring boot·后端
火烧屁屁啦40 分钟前
【JavaEE进阶】图书管理系统 - 贰
java·spring
xzzd_jokelin40 分钟前
Spring AI 接入 DeepSeek:开启智能应用的新篇章
java·人工智能·spring·ai·大模型·rag·deepseek
刘什么洋啊Zz1 小时前
剖析IO原理和零拷贝机制
java·运维·网络
莳花微语1 小时前
使用MyCAT实现分布式MySQL双主架构
分布式·mysql·架构