mysql并行复制_浅析MySQL并行复制

2023-11-22 18:10

本文主要是介绍mysql并行复制_浅析MySQL并行复制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

01 并行复制的概念

在MySQL的主从复制架构中,主库上经常会并发的执行很多SQL,只要这些SQL没有产生锁等待,那么同一时间并发好几个SQL线程是没有问题的。

我们知道,MySQL的从库是要通过IO_thread去拉取主库上的binlog的,然后存入本地,落盘成relay-log,通过sql_thread来应用这些relay-log。

在MySQL5.6之前的版本中,当主库上有多个线程并发执行SQL时,sql_thread只有一个,在某些TPS比较高的场景下,会出现主库严重延迟的问题。MySQL为了解决这个问题,将sql_thread演化了多个worker的形式,在slave端并行应用relay log中的事务,从而提高relay log的应用速度,减少复制延迟。这就是并行复制的由来。

dc02443bed96740e215877261694a8ba.png

在MySQL中,复制线程是由参数slave_parallel_workers来控制的,通常情况下,在8G内存、8核CPU的机器上,将该值设置为8比较合适,如果你的CPU核数比较高,那么可以适当调整为8~16之间的数字。

mysql> show variables like 'slave_parallel_workers';

+------------------------+-------+

| Variable_name | Value |

+------------------------+-------+

| slave_parallel_workers | 8 |

+------------------------+-------+

1 row in set, 1 warning (0.00 sec)

02 并行复制的演进

并行复制的本质是同时执行的SQL不存在锁争用。

在MySQL5.6版本,MySQL支持的粒度是按照数据库进行并行执行relay log,这种方式能够解决一部分问题,因为不同数据库上的SQL,肯定不会修改表中的同一行内容。这样也就不会产生锁争用。在一些数据库均匀分布,每个数据库使用频率都差不多的场景下,这种并行复制的方法比较好。如果你的业务的数据都集中在一个热点表,这种情况下,并行复制会退化为单线程复制。

随后,在MariaDB中对并行复制做了一定的改进,它的做法是:

1、主库上能够并行提交的事务,也就是已经进入到了redo log commit阶段的事务,在从库上也一定能够并行提交,所以在主库上并行提交的事务,它用一个commit_id对这组事务来进行标识,下一组并行事务的commit_id为本组的commit_id+1

2、将所有的事务的commit_id写入binlog中

3、在从库上应用binlog的时候,将所有的binlog按照commit_id进行划分到不同的worker上

4、本组commit_id的事务全部在从库上提交完成之后,再去拿下一批事务。

这种方法大大增加了从库应用relay log的速度,但是问题是从库在应用前一组事务的时候,后一组事务是处于等待中的,即使前一组的worker有些已经空闲。而在主库上,可能无时无刻不在写入,这样,系统的吞吐量上主从节点就不匹配,主库的吞吐量严重高于从库。

3f459352fd440f2f847c70c4e716bf94.png

MySQL5.7的并行复制在MariaDB的基础上做了改进,我们知道,事务进入到redo log prepare阶段的时候,由于WAL技术,说明此时事务已经经过了所冲突检测阶段了。MySQL5.7的并行复制时将所有在主库上处于redo log prepare阶段的事务,和该阶段之后的事务,也就是处于redo log commit阶段的事务,在从库并行执行,从而减少worker线程不必要的等待。

这里,有必要再说两个参数,

binnlog_group_commit_sync_delay参数,表示redo log prepare阶段完成之后,延迟多少微秒后才调用fsync;

binlog_group_commit_sync_no_delay_count参数,表示累积多少次redo log prepare:write的操作以后才调用fsync

这两个参数是用于故意拉长binlog从write到fsync的时间,以此减少binlog的写盘次数。在MySQL 5.7的并行复制策略里,它们可以用来制造更多的“同时处于prepare阶段的事务”。这样就增加了备库复制的并行度。

它们既可以“故意”让主库提交得慢些,又可以让备库执行得快些。在MySQL 5.7处理备库延迟的时候,可以考虑调整这两个参数值,来达到提升备库复制并发度的目的。

以上就是浅析MySQL并行复制的详细内容,更多关于MySQL并行复制的资料请关注脚本之家其它相关文章!

这篇关于mysql并行复制_浅析MySQL并行复制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/411961

相关文章

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

MySQL修改密码的四种实现方式

《MySQL修改密码的四种实现方式》文章主要介绍了如何使用命令行工具修改MySQL密码,包括使用`setpassword`命令和`mysqladmin`命令,此外,还详细描述了忘记密码时的处理方法,包... 目录mysql修改密码四种方式一、set password命令二、使用mysqladmin三、修改u