mysql8的并行复制介绍

server/2025/2/7 10:06:40/

mysql8_0">mysql8的并行复制介绍

一、写在前面

大家平时在维护数据库时,肯定遇到过主从复制延迟的问题。传统的复制方式是单线程按顺序执行,这就像排队买票,每个事务只能一个一个处理,遇上高并发场景,等待时间就会变长。为了解决这个问题,MySQL 从 5.6 版本起就开始支持多线程复制,而到了 MySQL8,更是把这个机制玩出了新花样——并行复制。今天就来聊聊这个话题,轻松理解背后的原理和实际应用。


二、MySQL8 并行复制的原理

1. 基础知识

在 MySQL 的复制架构中,主库会把所有的数据变动记录在 binlog(binary log)中,从库再根据这些日志更新数据。传统复制中,从库会按照 binlog 记录的顺序逐条执行事务,就像一列人依次通过闸机,而并行复制则是找出那些互不干扰的事务,让它们同时“闯关”,从而大幅度提升效率。

2. 并行复制如何做到“分组闯关”

MySQL8 并行复制的核心在于对事务依赖关系的判断,主要有两种模式来决定事务能否并行执行:

  • DATABASE 模式(默认)
    系统认为同一数据库内的事务可能有关联,所以这些事务必须按顺序执行;而操作不同数据库的事务可以同时执行。例如:

    • 事务 A 更新 db1.t1
    • 事务 B 更新 db2.t2
      因为操作的数据库不同,它们就可以并行执行。
  • LOGICAL_CLOCK 模式
    这种模式下,不仅仅以数据库作为判断依据,而是引入了一种“逻辑时钟”的机制。每个事务在提交时都会带上一个逻辑时钟值,这个值反映了事务的执行顺序。即使两个事务操作同一个数据库,只要逻辑时钟检测到它们之间不存在冲突,也可以允许并行执行。这样可以更精细地利用系统资源,提高并发处理能力。

3. 事务调度的小秘密

在实际运行时,从库有一个专门的主线程读取 relay log(中继日志),然后将事务分发到多个工作线程。每个线程负责执行一组无依赖的事务。整个过程会检查事务的“标识符”(比如操作的数据库、表信息或者逻辑时钟值):

  • 如果两个事务涉及相同的标识符(比如同一数据库,或者在 LOGICAL_CLOCK 模式下逻辑时钟判断出有依赖),后面的事务就要等待前面的事务提交;
  • 否则,它们就可以同时执行。

这种机制既保证了数据的一致性,又让从库能更充分地发挥多核 CPU 的性能。


三、优缺点全解析

优点

  • 显著提升性能
    并行执行无依赖事务,能让从库在高并发场景下大幅度降低复制延迟,就像多个窗口同时办理业务,效率翻倍。

  • 更高的资源利用率
    多线程机制让 CPU、磁盘 I/O 能同时得到利用,避免了单线程复制中资源闲置的情况。

  • 灵活配置
    通过调整 slave_parallel_workers(指定工作线程数)和 slave_parallel_type(复制模式),DBA 可以根据业务特点进行调优,达到最佳效果。

缺点

  • 额外的依赖检测开销
    在进行事务依赖判断时,会消耗一些额外的 CPU 资源,特别是在事务依赖复杂时,检测的成本会增加。

  • 部分事务无法并行
    即便在 LOGICAL_CLOCK 模式下,某些看似独立的事务由于依赖关系被判定为相关,仍需顺序执行,从而限制了并行带来的性能提升。

  • 调试与监控较为复杂
    多线程和依赖检测机制使得故障排查和性能调优需要更多经验和细致的监控手段。



http://www.ppmy.cn/server/165650.html

相关文章

ES6 对象扩展:对象简写,对象属性 表达式,扩展运算符 ...,Object.assign,Object.is,用法和应用场景

1. 对象属性简写 1.1 基本语法 // 传统写法 const name John; const age 25; const user {name: name,age: age };// ES6 简写语法 const user {name,age };1.2 实际应用场景 // 1. 函数返回对象 function createUser(name, age, email) {return {name,age,email}; }// …

visual studio安装

一、下载Visual Studio 访问Visual Studio官方网站。下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 在主页上找到并点击“下载 Visual Studio”按钮。 选择适合需求的版本,例如“Visual Studio Community”(免费版本)&#x…

Clion开发STM32时使用stlink下载程序与Debug调试

一、下载程序 先创建一个文件夹: 命名:stlink.cfg 写入以下代码: # choose st-link/j-link/dap-link etc. #adapter driver cmsis-dap #transport select swdsource [find interface/stlink.cfg]transport select hla_swdsource [find target/stm32f4x.…

零碎的知识点(十二):“期望” 是什么?

“期望” 是什么? 期望(数学期望)的详细解释与示例1. 期望的定义2. 期望的意义 3. 计算步骤与示例示例1:掷骰子的期望示例2:抽奖活动的期望收益示例3:投资决策的期望回报 4. 期望的性质5. 期望的常见误区6.…

【Golang学习之旅】Go 语言数据类型详解(string、slice、map等)

文章目录 前言1. Go语言数据类型概览2. Go语言基本数据类型2.1 整型(int,uint,float)2.2 布尔类型(bool)2.3 字符串(string) 3. Go 语言复合数据类型3.1 数组(Array&…

go-zero学习笔记(四)

在api中访问rpc服务 必备条件 api端(客户端)有rpc端的pb文件,以及客户端文件(非必要),且已知rpc端的服务注册方式(etcd、k8s)及地址,端口等 api端配置文件编写 # 新增如…

【探商宝】DeepSeek 最新模型对 ChatGPT 的影响及行业新变革

在人工智能领域的激烈竞争中,DeepSeek 发布的最新模型无疑给 ChatGPT 带来了巨大的冲击,同时也促使整个行业出现了一系列引人注目的变化,如 ChatGPT 的降价以及搜索功能无需登录即可使用等。 一、DeepSeek 最新模型的技术优势 架构创新与效…

React 第二十二节 useSyncExternalStore Hook 常见问题及用法详解

1、概述 在React 中我们通常会使用 useState useReducer 进行数据状态更新,但是当我们需要对外部的数据状态进行处理时候,我们需要使用React 提供的新Hook,useSyncExternalStore 让我们可以在React 内部订阅外部数据属性的状态,当…