MySQL的并行复制原理
1. 并行复制的概念
并行复制(Parallel Replication)是一种通过同时处理多个复制任务来加速数据复制的技术。它与并发复制的区别在于,并行复制更多关注的是数据块或事务之间的并行执行,而不是单纯的任务并发。在数据库主从复制中,并行复制允许多个事务在从库上同时执行,这样可以充分利用多核CPU的能力,大大提升复制效率。
2. 并行复制解决的问题
并行复制主要解决的问题是:
- 复制延迟:传统的主从复制采用串行方式进行事务复制,当主库有大量并发事务时,从库难以跟上主库的步伐,造成复制延迟。而并行复制能够同时复制多个事务,大幅降低复制延迟。
- 性能瓶颈:在分布式系统中,单线程复制在高并发场景下会成为性能瓶颈,而通过并行执行多个复制任务,可以有效缓解这一瓶颈。
3. 并行复制的使用场景
- 数据库的主从复制:MySQL、PostgreSQL等数据库都支持并行复制,在高并发场景下能够提高从库的同步速度,降低主从延迟。
- 分布式存储系统:如HDFS、Cassandra等分布式存储系统,数据节点之间的数据复制可以通过并行复制来加速。
- 日志处理:在大规模日志处理系统中,并行复制可以加速日志的备份与同步。
4. 底层原理设计
并行复制的核心原理是在数据同步时,按照事务的独立性或数据块的分片来将复制任务分配到不同的线程进行并行处理,确保多个复制操作可以同时执行。
底层设计的关键点:
- 事务分解:将可以并行执行的事务或者数据分片。
- 多线程执行:为每个独立的事务或分片分配一个线程,保证它们能够并行执行。
- 事务依赖管理:如果某些事务之间有依赖关系,需要确保它们的执行顺序。
- 合并结果:等待所有并行任务执行完成,最终将结果合并。
5. Java 并行复制模拟代码
下面是一个简化的Java代码,模拟并行复制的过程。我们通过使用ExecutorService
来管理多个线程并行处理多个数据块。
import java.util.concurrent.*;
import java.util.*;public class ParallelReplication {// 模拟数据分片private static List<String> dataChunks = new ArrayList<>();// 初始化数据static {for (int i = 1; i <= 10; i++) {dataChunks.add("Chunk-" + i);}}// 模拟复制任务类,实现Callable接口static class ReplicationTask implements Callable<String> {private String dataChunk;public ReplicationTask(String dataChunk) {this.dataChunk = dataChunk;}@Overridepublic String call() throws Exception {// 模拟复制操作System.out.println(Thread.currentThread().getName() + " is replicating: " + dataChunk);Thread.sleep(200); // 模拟复制时间return dataChunk + " replicated successfully.";}}public static void main(String[] args) throws InterruptedException, ExecutionException {int parallelism = 4; // 并行度,表示同时复制的任务数量ExecutorService executor = Executors.newFixedThreadPool(parallelism);List<Future<String>> results = new ArrayList<>();// 提交复制任务到线程池,进行并行处理for (String chunk : dataChunks) {ReplicationTask task = new ReplicationTask(chunk);Future<String> result = executor.submit(task);results.add(result);}// 等待所有任务完成,并输出结果for (Future<String> result : results) {System.out.println(result.get()); // 输出每个任务的结果}// 关闭线程池executor.shutdown();}
}
6. 代码解释
- 数据初始化:
dataChunks
列表中包含10个数据块,表示需要复制的数据,每个块被标记为Chunk-1
到Chunk-10
。 - ReplicationTask:这是实现了
Callable
接口的类,模拟了一个数据块的复制过程。每个任务在执行时会打印当前线程的名称以及正在复制的数据块,并模拟复制需要的时间(200毫秒)。 - ExecutorService:使用
Executors.newFixedThreadPool(parallelism)
创建一个固定大小的线程池。在这个例子中,线程池的大小为4,也就是说系统最多可以同时并行执行4个复制任务。 - Future:每个复制任务的结果由
Future
对象来表示,主线程通过future.get()
方法来获取任务执行的结果。 - 线程池关闭:最后调用
executor.shutdown()
方法来关闭线程池,确保所有线程执行完毕。
7. 运行结果
程序运行时,将会看到以下输出(部分):
pool-1-thread-1 is replicating: Chunk-1
pool-1-thread-2 is replicating: Chunk-2
pool-1-thread-3 is replicating: Chunk-3
pool-1-thread-4 is replicating: Chunk-4
Chunk-1 replicated successfully.
Chunk-2 replicated successfully.
Chunk-3 replicated successfully.
Chunk-4 replicated successfully.
...
- 输出解析:
- 各个线程同时执行不同的数据块复制任务,展示了并行执行的能力。
- 每个线程会输出它正在处理的数据块,并在复制完成时输出“replicated successfully”表示任务完成。
8. 并行复制的底层原理
- 事务或数据块分片:并行复制的第一个步骤是将大事务拆分为多个可以独立执行的小事务(例如数据库事务),或者将数据拆分为多个块(例如分布式文件系统中的数据块)。
- 并行执行:多个线程同时执行不同的数据块的复制任务,充分利用系统的多核CPU资源。
- 依赖管理:在某些情况下,如果不同的任务之间存在依赖关系(如某些事务需要按顺序执行),需要引入事务调度或依赖管理机制,确保任务按照依赖关系执行。
- 故障处理:如果并行复制中的某个任务失败,系统需要有重试机制或者回滚机制,确保数据一致性。
9. 并行复制的应用场景
- 高性能数据库主从复制:在高并发数据库系统中,并行复制可以显著降低主从库之间的延迟,确保从库的数据与主库一致。
- 分布式文件系统:如HDFS或Ceph中的数据块复制,通过并行复制可以加速数据节点之间的同步。
- 大规模日志处理:日志系统中的并行复制可以加速日志的备份与同步过程,提高系统的容错能力。
10. 借鉴并行复制的思想来实现业务场景
你可以借鉴并行复制的思想,用于设计以下业务场景:
- 并行文件上传:将大文件分成多个部分,通过并行上传的方式加速整个上传过程,类似于分片上传的实现。
- 数据批量处理:对于需要处理大量数据的场景,可以将数据分成多个部分,使用多线程并行处理每个部分,提升处理速度。
- 大规模任务调度:在后台任务调度系统中,可以采用并行复制的思想,同时调度多个独立的任务,提高任务处理的吞吐量。
在MySQL的发展历程中,每个版本都引入了新的功能来提升复制性能和一致性,尤其是在并行复制领域。以下是各版本中关键复制相关特性的简要说明:
11. MySQL不同版本
1. MySQL 5.6:库级别并行复制
- 特点:MySQL 5.6引入了库级别的并行复制(schema-based parallel replication),这意味着在主库上同时修改不同数据库的事务可以在从库上并行应用。
- 实现原理:在主库上,所有涉及不同库的事务可以并行执行。在从库上,这些事务会被分配到不同的线程执行,从而提高复制的并发度,减少主从库之间的延迟。
- 局限:只能并行执行不同数据库的事务,如果多个事务作用于同一个库,它们仍然是串行执行。
2. MySQL 5.7:组提交(Group Commit)
- 特点:MySQL 5.7增强了并行复制,增加了组提交(group commit)功能。事务在主库提交时,如果有多个事务同时准备提交,它们会被作为一个组提交。
- 实现原理:组提交的主要目的是通过批量提交来减少IO操作次数,进而提升性能。在从库上,这些事务组也可以并行应用,提升复制性能。
- 优势:不仅减少了单个事务的提交等待时间,也允许多个事务在从库上并行应用,进一步提高了从库同步的效率。
3. MySQL 8.0:WRITESET 并行复制
- 特点:MySQL 8.0引入了更加先进的WRITESET并行复制,允许事务在表级别甚至行级别并行复制,极大提升了复制的并发能力。
- 实现原理:WRITESET会追踪每个事务写入的行(或行的主键),从而判断事务是否冲突。只要多个事务之间没有修改同一行数据,它们就可以并行应用到从库上。
- 优势:相比库级和表级的并行复制,WRITESET能够更精细地控制并行度,减少冲突,进一步提升复制性能,特别是在高并发写入的场景下。
12. 总结
并行复制通过多线程或多进程同时执行多个复制任务,大幅提高了复制效率,适用于数据库主从复制、分布式存储、日志同步等多个高并发场景。通过Java中的ExecutorService
和Callable
,可以实现并行复制的功能,有效提升系统的性能和数据同步速度。
- MySQL 5.6:通过库级别并行复制提升多库场景下的复制效率。
- MySQL 5.7:通过组提交和批量复制,进一步降低提交的IO开销,增强了并行能力。
- MySQL 8.0:通过WRITESET实现了更加精细的行级并行复制,使得复制的并发度大大提高,在高并发写入的场景下表现尤为出色。
相关文章:

MySQL的并行复制原理
1. 并行复制的概念 并行复制(Parallel Replication)是一种通过同时处理多个复制任务来加速数据复制的技术。它与并发复制的区别在于,并行复制更多关注的是数据块或事务之间的并行执行,而不是单纯的任务并发。在数据库主从复制中&…...

2023年五一杯数学建模C题双碳目标下低碳建筑研究求解全过程论文及程序
2023年五一杯数学建模 C题 双碳目标下低碳建筑研究 原题再现: “双碳”即碳达峰与碳中和的简称,我国力争2030年前实现碳达峰,2060年前实现碳中和。“双碳”战略倡导绿色、环保、低碳的生活方式。我国加快降低碳排放步伐,大力推进…...

信息安全工程师(57)网络安全漏洞扫描技术与应用
一、网络安全漏洞扫描技术概述 网络安全漏洞扫描技术是一种可以自动检测计算机系统和网络设备中存在的漏洞和弱点的技术。它通过使用特定的方法和工具,模拟攻击者的攻击方式,从而检测存在的漏洞和弱点。这种技术可以帮助组织及时发现并修补漏洞ÿ…...

练习题 - Scrapy爬虫框架 Spider Middleware 爬虫页中间件
在 web 爬虫开发中,Scrapy 是一个非常强大且灵活的框架,它可以帮助开发者轻松地从网页中提取数据。Scrapy 的下载器中间件(Downloader Middleware)是 Scrapy 处理下载请求和响应的一个重要组件。通过使用和编写下载器中间件,开发者可以自定义请求的处理过程,增加请求头信…...

探索C++的工具箱:双向链表容器类list(1)
引言 在C中,std::list 是一个标准库提供的容器类,属于C STL(标准模板库)。std::list 是一种独特而强大的容器,它使用双向链表结构来管理元素。无论是在处理动态数据集合,还是在需要频繁进行插入和删除操作时…...

大厂高频算法考点--单调栈
什么是单调栈: 单调栈就是借助一个栈,在仅仅使用当前栈的条件下,时间复杂度是N(n),将每个节点最有离这他最近的大于或者是小于的数据返回,将已知数组的元素放到栈里。再自我实现的代码里面我们使用数组实现…...

Unity使用Git及GitHub进行项目管理
git: 工作区,暂存区(存放临时要存放的内容),代码仓库区1.初始化 git init 此时展开隐藏项目,会出现.git文件夹 2.减小项目体积 touch .gitignore命令 创建.gitignore文件夹 gitignore文件夹的内容 gitignore中添加一下内容 # This .gitignore file should be place…...

如何将本地 Node.js 服务部署到宝塔面板:完整的部署指南
文章简介: 将本地开发的 Node.js 项目部署到线上服务器是开发者常见的工作流程之一。在这篇文章中,我将详细介绍如何将本地的 Node.js 服务通过宝塔面板(BT 面板)上线。宝塔面板是一个强大的服务器管理工具,具有简洁的…...

SpringBoot项目启动报错:命令行太长解决
文章目录 SpringBoot项目启动报错:命令行太长解决1. 第一种方法1. 第二种方法1-1 旧版本Idea1-2 新版本Idea 3. 重新启动SpringBoot项目即可解决 SpringBoot项目启动报错:命令行太长解决 报错信息: 1. 第一种方法 1. 第二种方法 找到项目…...

使用Docker启动的Redis容器使用的配置文件路径等问题以及Python使用clickhouse_driver操作clickhouse数据库
一、使用Docker启动的Redis容器使用的配置文件路径等问题 1.docker启动的redis使用的配置文件路径是什么 使用docker搭建redis服务,本身redis启动的时候可以指定配置文件的, redis-server /指定配置文件路径/redis.conf。 但手上也没有一个redis配置文件…...

硬盘格式化后能恢复数据吗?4款好用的数据恢复软件,格式化后也能安心
咱们今天来谈谈一个挺烦人的问题——硬盘格式化后能恢复数据吗?别担心,能的!只要你用对方法,就算硬盘被清空了,那些重要文件还是能找回来的。下面,我就给你们介绍几款超给力的数据恢复软件,让你…...

【选择C++游戏开发技术】
在选择C游戏开发技术时,以下几个因素是需要考虑的: 1. 游戏类型:不同类型的游戏可能需要不同的技术。例如,2D游戏通常采用基于精灵的引擎,而3D游戏通常采用基于物理模拟的引擎。根据游戏类型选择适合的技术是很重要的…...

Oracle数据库系统表空间过大,清理SYSTEM、SYSAUX表空间
一.前言 在oracle数据库中,system为系统表空间,存放着一些我们经常用到的系统表和视图,sysaux为辅助表空间,辅助着系统表空间。这两个表空间不宜添加数据文件,会使系统表空间过于臃肿,从而影响数据库的使用…...

LaTeX参考文献工具和宏包bibmap项目简介
LaTeX参考文献工具和宏包bibmap项目简介 LaTeX 中的参考文献生成方式主要有三种:第一种是手动写thebibliography环境的,第二种事基于bibtex程序的,第三种则是基于biblatex宏包和biber程序的。本文介绍的bibmap项目则提供了第四种方法。目前b…...

微软的 Drasi:一种轻量级的事件驱动编程方法
微软的开源数据变化处理平台有望提供一种全新的方式来构建和管理可产生持续事件流的云应用程序。 Microsoft Azure 孵化团队是微软超大规模云中比较有趣的组成部分之一。它介于传统软件开发团队和研究组织之间,致力于构建大规模分布式系统问题的解决方案。 这些解决…...

vue3 笔记-插槽
结构类似的模块,我们可以考虑用插槽,以便后续复用: 代码: 1.插槽 <script setup> defineProps({title: {required: true,type: String},number: {required: true,type: Number} }) </script><template><d…...

C# 字符串常用方法
文章目录 Length:获取字符串中字符的个数(不包括末尾的空字符)ToLower() 和 ToUpper():将字符串转换为小写或大写形式Substring(int startIndex, int length):从指定索引开始截取指定长度的子字符串Remove(int startIn…...

字节跳动青训营——入营考核解答(持续更新中~~~)
考核内容: 在指定的题库中自主选择不少于 15 道算法题并完成解题,其中题目难度分配如下: 简单题不少于 10 道中等题不少于 4 道困难题不少于 1 道 解答代码 8.进制求和转换(难) 代码实现: import jav…...

JavaWeb合集15-Apache POI
十五、Apache POI Apache POI是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用POI在Java 序中对Miscrosoft Office各种文件进行读写操作。一般情况下,POI都是用于操作Excel文件。 使用场景:银行网银系统导出交…...

Threejs 实现3D 地图(01)创建基本场景
"d3": "^7.9.0", "three": "^0.169.0", "vue": "^3.5.10" <script setup> import { onMounted,ref } from vue import * as THREE from three import * as d3 from "d3"; //莫开托坐标 矫正地图…...

snmpdelta使用说明
1.snmpdelta介绍 snmpdelta命令是用来获取下一个节点的OID的值。 2.snmpdelta安装 1.snmpdelta安装 命令: yum -y install net-snmp net-snmp-utils [root@logstash ~]# yum -y install net-snmp net-snmp-utils Loaded plugins: fastestmirror Loading mirror speeds f…...

Hadoop集群安装
集群规划 node01node02node03角色主节点从节点从节点NameNode√DataNode√√√ResourceManager√NodeManager√√√SecondaryNameNode√Historyserver√ 上传安装包到node01 解压到指定目录 tar -zxvf /bigdata/soft/hadoop-3.3.3.tar.gz -C /bigdata/server/ 创建软链接 cd…...

VuePress集成到Vue项目的方法
VuePress 可以作为一个独立的静态站点生成器来使用,也可以集成到现有的 Vue 项目中。以下是将 VuePress 集成到 Vue 项目的几种方法: 1. 作为本地依赖集成 如果你想在现有的 Vue 项目中使用 VuePress 来管理文档,你可以将 VuePress 安装为本…...

【ROS】ROS局域网下多机通讯方法
最近工作中需要用到多机通讯,这里稍微总结一下使用方法。 目录 一、网络配置 二、修改两个设备的hosts文件 三、修改两个ros设备的.bashrc 四、launch文件中给节点设定运行的设备 一、网络配置 首先确保两个ros设备连接到同一局域网下,然后查询两个…...

linux 系统怎么使用
Linux系统的使用涉及多个方面,包括文件管理、目录操作、用户管理、进程管理、网络配置等。以下是对Linux系统基础使用的详细介绍: 一、文件管理 查看文件和目录 ls:列出当前目录的内容。ls -l:以长格式列出当前目录的内容&#x…...

Java线程池知识点梳理
Java线程池知识点梳理 什么是线程池? 线程在系统中创建的成本是相对比较高的,所以使用”池化“的思想,设计线程池,有大量任务需要执行时,可以直接从线程池中使用已经创建好的线程直接去执行。减少线程的创建和销毁带…...

SFT、RLHF、DPO、IFT —— LLM 微调的进化之路_如何搭建自己的dpo
TL;DR • SFT、RLHF 和 DPO 都是先估计 LLMs 本身的偏好,再与人类的偏好进行对齐; • SFT 只通过 LLMs 生成的下一个单词进行估计,而 RLHF 和 DPO 通过 LLMs 生成的完整句子进行估计,显然后者的估计会更准确; • 虽然…...

CSS 选择器简单回顾
引言 当我们探讨网页设计和开发时, CSS(层叠样式表) 无疑是一个不可或缺的技术, 它使我们能够精确控制网页的外观和布局, 为用户创造出独特的视觉体验、以及良好的交互体验!! 而一个完整的 CSS 规则则是由两个主要部分组成: 选择器和声明块 那么今天我们就来盘点下常见的几种选…...

uniapp配置微信小程序分包(分包优化)
1.manifest.json中 源码视图中找到mp-weixin,新增代码"optimization":{"subPackages":true},如下图所示 "optimization" : {"subPackages" : true } 2.pages.json中 分包内静态文件示例 "subPackages&…...

MySQL-10.DML-添加数据insert
一.DML(INSERT) -- DDL:数据操作语言 -- DML:插入数据 - insert -- 1.为tb_emp表的username,name,gender字段插入值 insert into tb_emp (username,name,gender) values (wuji,无忌,1); -- 这样会报错,因为create_ti…...