mysql的组提交

学习笔记(二)MySQL并行复制与提交 binlog_group_commit_sync_no_delay_count = N,表示如果队列中的事务数达到 N 个,就忽视binlog_group_commit_sync_delay 的设置,直接调用 fsync,将处于文件系统中 page cache 中的 binlog 刷盘。不同schema下的表并发提交时的数据不会相互影响,即slave节点可以用对relay log中不同的schema各分配一个类似SQL功能的线程,来重放relay log中主库已经提交的事务,保持数据与主库一致。 阅读详情

mysql的组提交

​ 组提交(group commit)是mysql处理日志的一种优化方式,主要为了解决写日志时频繁刷磁盘的问题。组提交伴随着mysql的发展,已经支持了redo log和bin log的组提交。

1、redo log的组提交

​ WAL(Write-Ahead-Logging)是实现事务持久性的一个常用技术,基本原理是在提交事务时,为了避免磁盘页面的随机写,只需要保证事务的redo log写入磁盘即可,这样可以通过redo log的顺序写代替页面的随机写,并且可以保证事务的持久性,提高了数据库系统的性能。虽然WAL使用顺序写替代了随机写,但是,每次事务提交,仍然需要有一次日志刷盘动作,受限于磁盘IO,这个操作仍然是事务并发的瓶颈。

​ 组提交思想是,将多个事务redo log的刷盘动作合并,减少磁盘顺序写。Innodb的日志系统里面,每条redo log都有一个LSN(Log Sequence Number),LSN是单调递增的。每个事务执行更新操作都会包含一条或多条redo log,各个事务将日志拷贝到log_sys_buffer时(log_sys_buffer 通过log_mutex保护),都会获取当前最大的LSN,因此可以保证不同事务的LSN不会重复。

​ 假设现在有三个并发事务(tx1,tx2,tx3),这三个事务所对应的LSN的值分别是50,120,160。

在这里插入图片描述

​ 从图中可以看到:

​ 1、trx1是第一个到达的,会被选为这组的leader;

​ 2、等trx1要开始写盘的时候,这个组里面已经有了三个事务,这时候LSN也变成了160,;

​ 3、trx1去写盘的时候,带的就是LSN=160,因此等trx1返回时,所有LSN小于等于160的redo log都已经被持久化到磁盘;

​ 4、这时候trx2和trx3就可以直接返回了

​ 因此,在一个组提交里面,组员越多,节约磁盘IOPS的效果就越好。但如果只有单线程压测,那就只能老老实实地一个事务对应一次持久化操作了。

2、bin log的组提交

​ 在之前的版本中,mysql的binlog是无法实现组提交的,原因在于redo log和binlog的刷盘串行化问题,而实现串行化的目的也是为了保证两份日志保持一致,而在5.6版本之后提供了一种解决方案,能够保证binlog实现组提交。基本思想是:引入队列机制保证 innodb commit顺序与binlog落盘顺序一致,并将事务分组,组内的binlog刷盘动作交给一个事务进行,实现组提交的目的。binlog提交将提交分为了3个阶段,flush阶段,sync阶段和commit阶段。每个阶段都有一个队列,每个队列有一个mutex保护,预定进入队列的第一个线程为leader,其他线程为follower,所有事情交给leader去做,leader做完所有的动作之后,通知follower刷盘结束。

具体流程可以看这篇帖子:

https://mp.weixin.qq.com/s/_LK8bdHPw9bZ9W1b3i5UZA

​ 其实就是说如果想要提高binlog组提交的效率的话,那么可以通过设置一下两个参数:

​ binlog_group_commit_sync_delay 参数,表示延迟多少微秒后才调用fsync;

​ binlog_group_commit_sync_no_delay_count 参数,表示累积多少次以后才调用 fsync。

MySQL Binlog 提交实现 因此,判断 sync_counter + 1 >= get_sync_period(),表示当前的 leader 可以 sync 了,那么该线程继续等一会儿,等待更多的线程进入 sync queue 在一起提交,具体等多久,由 opt_binlog_group_commit_sync_no_delay_count 和 opt_binlog_group_commit_sync_delay 决定。后来提交和流水线提交的引入,不仅减少了 IO 次数,还提高了事务执行的并发度,减小了加锁的粒度。 阅读详情

相关推荐

Python加密库encryptech:轻量级数据安全解决方案

数据加密是保障信息安全的核心技术,通过算法将明文转换为密文,确保数据在存储和传输过程中的机密性与完整性。其原理基于密码学理论,利用密钥对数据进行变换,防止未授权访问。在技术价值上,加密技术为数字世界提供了信任基础,广泛应用于隐私保护、身份认证和防篡改等场景。Python作为主流开发语言,其生态中涌现了多种加密库以满足不同需求。其中,encryptech库以其轻量化和易用性脱颖而出,特别适合常见的数据安全处理任务。该库封装了AES对称加密和SHA-256等哈希算法,通过简化密钥管理和初始化向量等复杂流程,让开

weixin_33724059的博客 542

MYSQL之两阶段提交提交(数据一致性)

3. 到了InnoDB中,会先开启事务,并在InnoDB 层更新记录前,首先会在undo log中做相应的记录,即通过生产一条undo log把更新的列的旧值记下来,undo log 会写入 Buffer Pool 中的 Undo 页面,不过在修改该 Undo 页面前需要先记录对应的 redo log,所以。,修改数据页面的过程是修改 Buffer Pool 中数据所在的页,然后将其页设置为脏页,为了减少磁盘I/O,不会立即将脏页写入磁盘,后续由后台线程选择一个合适的时机将脏页写入到磁盘。

sanylove的博客 2485

MySQL事物实现原理之提交(group commit).pdf

MySQL事物实现原理之提交(group commit).pdf

MySQL实战45讲》——学习笔记23 “binlog&redolog 的写入机制/提交机制“

本篇主要介绍数据的可靠性有关的知识,包括binlog的写入机制和redolog 的写入机制;

娜娜米的博客 1333

mysql 提交_MySQL Group Commit 提交详解

提交 (group commit) 是为了优化写日志时的刷磁盘问题,从最初只支持 InnoDB redo log 提交,到 5.6 官方版本同时支持 redo log 和 binlog 提交,大大提高了 MySQL 的事务处理性能。下面将以 InnoDB 存储引擎为例,详细介绍提交在各个阶段的实现原理。简介自 5.1 之后,binlog 和 innodb 采用类似两阶段提交的方式,不过不支...

weixin_36006615的博客 2207

MySQL提交

转自【https://www.cnblogs.com/cchust/p/4439107.html】 提交(group commit)是MYSQL处理日志的一种优化方式,主要为了解决写日志时频繁刷磁盘的问题。提交伴随着MYSQL的发展不断优化,从最初只支持redo log 提交,到目前5.6官方版本同时支持redo log 和binlog提交提交的实现大大提高了mysql的事务处理性能,下文将以innodb 存储引擎为例,详细介绍提交在各个阶段的实现原理。 redo log的提交 WAL(W

flyweight_visitor的博客 526

MYSQL提交和二阶段提交

提交和二阶段提交前,先了解下BINLOG和REDO LOG; 两个日志关系 在ORACLE 对应的是REDO LOG和ARCHIVE LOG ,只是两者关系不一样。 在ORACLE数据库里 ARCHIVE LOG 是 REDO LOG的 历史日志记录。 REDO LOG 就记录当前数据库修改行为的日志。 REDO LOG 一般分成3, 每里面必须有1个日志文件,自然可以1个以上的日志文件...

haponchang的博客 951

Mysql什么版本支持提交_MYSQL提交

提交(group commit)是MYSQL处理日志的一种优化方式,主要为了解决写日志时频繁刷磁盘的问题。提交伴随着MYSQL的发展不断优化,从最初只支持redo log 提交,到目前5.6官方版本同时支持redo log 和binlog提交提交的实现大大提高了mysql的事务处理性能,下文将以innodb 存储引擎为例,详细介绍提交在各个阶段的实现原理。redo log的提交WA...

weixin_34433661的博客 122

mysql提交

相当于把数据库的最高吞吐量限制在了磁盘的IOPS(每秒输入输出次数)上,这在高并发的写场景下是灾难性的,CPU会空转等待I/O,性能急剧下降。为了保证事务在Binlog中的写入顺序与在InnoDB中的提交顺序严格一致(这对于复制和恢复至关重要),MySQL在步骤2和3期间必须持有。之间的一致性(即一个事务在Binlog和InnoDB中要么都提交,要么都不提交),MySQL使用了。即使有100个事务已经准备好了,它们也必须一个一个地排队,获取锁,执行耗时的。操作,打包成一个低频率的、批量的。

一条大河 544

MySQL中的提交(group commit)是什么?如何优化写入性能?

MySQL中的提交(group commit)是一种优化技术,用于将多个事务的提交操作合在一起,以减少I/O操作和日志同步的次数,从而提高数据库写入性能。在MySQL中,特别是InnoDB存储引擎,提交主要涉及到redo日志的写入和同步。

长风破浪会有时的博客 828

[图解MySQL]MySQL提交(group commit)

前提:以下讨论的前提 是设置MySQL的crash safe相关参数为双1:sync_binlog=1innodb_flush_log_at_trx_commit=1 背景说明:WAL机制 (Write Ahead Log)定义:WAL指的是对数据文件进行修改前,必须将修改先记录日志。MySQL为了保证ACID中的一致性和持久性,使用了WAL。Red...

weixin_34179968的博客 373

记录些MySQL题集(11)

记录些MySQL题集(11)

安静的软件工程师 1049

提交_并行复制

MYSQL的InnoDB存储引擎中,如果开启了binlog情况下,MYSQL会同时维护binlog和InnoDB中的redo log,为了保证这两个日志的一致性问题,它使用了内部XA事务(当然也有外部XA事务)解决。内部XA事务是由binlog作为协调者,redo log 作为参与者。

细致-专业-实操 984

MySQL提交(group commit)

引 言 本文是由爱可生研发团队出品的「图解MySQL」系列文章,不定期更新,但篇篇精品。欢迎大家持续关注~ 前提: 以下讨论的前提 是设置MySQL的crash safe相关参数为双1: sync_binlog=1 innodb_flush_log_at_trx_commit=1 背景说明: WAL机制 (Write Ahead Log)定义: WAL指的是对数据文件进行修改前,必须将修改先记录日志。MySQL为了保证ACID中的一致性和持久性,使用了WAL。 Redo log的作用.

changyanmanman的专栏 2876

提交mysql

数据库相关视频讲解:Windows Server 2008备份关键卷提交MySQL:新手入门指南 作为一名刚入行的开发者,你可能会遇到需要批量提交MySQL数据库操作的情况。这种操作被称为“提交”,可以提高数据库操作的效率。下面,我将为你详细介绍提交MySQL的流程和具体实现步骤。 提交MySQL流程 首先,让我...

weixin_41289302的博客 198

mysql提交原理_mysql 5.6 binlog提交实现原理

Redo提交Redo提交流程大致如下lock log->mutexwrite redo log buffer to diskunlock log->mutexfsyncFsync写磁盘耗时较长且不占用log->mutex,也就是其执行期间其他线程可以write log buffer;假定一次fsync需要10ms,而写buffer只需要1ms,则fsync执行期间最多可以有10...

weixin_31965935的博客 422

5.Update执行流程之提交

highlight: arduino-light 提交的作用 为了解决两阶段提交性能问题,MYSQL引入了binlog提交机制,就是当有多个事务提交时,会将多个刷盘操作合并成一个,从而减少磁盘 I/O 的次数。 在没有开启binlog时 redo log的刷盘操作将会是最终影响MySQL TPS的瓶颈所在。为了缓解这一问题,MySQL使用了提交,将多个刷盘操作合并成一个,如果...

qq_30635523的博客 186

MySQL的两阶段提交

为什么需要两阶段提交?要理解这个问题,先要理解redo log 和 binlog 有什么区别?这两个日志有四个区别。相关问题:如果不小心整个数据库的数据被删除了,能使用 redo log 文件恢复数据吗?不可以使用 redo log 文件恢复,只能使用 binlog 文件恢复。因为 redo log 文件是循环写,是会边写边擦除日志的,只记录未被刷入磁盘(主库磁盘)的数据的物理日志,已经刷入磁盘的数据都会从 redo log 文件里擦除。

个人专长:数据结构和算法、大数据、数据库、主流框架 3837
上一篇: Linux运行java文件报错:Error: Could not find or load main class
下一篇: 一致性hash原理
紫荆之后-
博客等级 码龄9年 2347粉丝 · 79原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫荆之后-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值