MySQL 组提交(group commit)
前言
- 操作系统使用页面缓存来填补内存和磁盘访问的差距
- 对磁盘文件的写入会先写入道页面缓存中
- 由操作系统来决定何时将修改过的脏页刷新到磁盘
- 确保修改已经持久化到磁盘,须调用fsync或者fdatasync
- 数据库在事务提交过程中调用fsync将数据持久化到磁盘,才满足ACID中的D(持久化)
- fsync是昂贵的操作,对于普通磁盘,每秒能完成几百次fsync
- MySQL中使用了两阶段提交协议,为了满足D(持久化) ,一次事务提交最多会导致3次fsync
- 提交的事务在存储引擎内部(redo log)中准备好,一次fsync;事务写入到binlog中并刷盘持久化,一次fsync;事务在存储引擎内部提交,一次fsync(可以省略,存储引擎准备好的事务可以通过binlog来恢复)
改进
- 为了提高单位时间内的事务提交数,必须减少事务提交过程中的fsync调用次数
- MySQL 从5.6版本开始引入group commit技术(MariaDB 5.3版本引入)
- 基本思想是多个并发提交的事务共用一次fsync操作来实现持久化
group commit
An InnoDB optimization that performs some low-level I/O operations (log write) once for a set of commit operations, rather than flushing and syncing separately for each commit
原理
- 多个并发需要提交的事务共享一次fsync操作来进行数据的持久化
- 将fsync操作的开销平摊到多个并发的事务上去
- group commit 不是在任何时候都能发挥作用,要有足够多并发的需要提交的事务
实现
- 多个并发提交的事务在写redo log或binlog前会被加入到一个队列中
- 队列头部的事务所在的线程称为leader线程,其它事务所在的线程称为follower线程
- leader线程负责为队列中所有的事务进行写binlog操作,此时,所有的follower线程处于等待状态
- 然后leader线程调用一次fsync操作,将binlog持久化
- 最后通知follower线程可以继续往下执行
参数
binlog_group_commit_sync_delay=N
定时发车,在等待N 微秒后,进行binlog刷盘操作
binlog_group_commit_sync_no_delay_count=N
人满发车,达到最大事务等待数量,开始binlog刷盘,忽略定时发车
注意
当binlog_group_commit_sync_delay=0时,binlog_group_commit_sync_no_delay_count参数设置无效,即没有定时发车情况下,人满发车也就没有了~_~
- 当sync_binlog=0或sync_binlog=1,在刷盘前,对每个binlog应用定时发车
- 当sync_binlog=N(N>1),在每N个binlog后应用定时发车
- 设置了定时发车增加了并发提交事务的数量,从而增加slave并行apply的速度(slave开启多线程复制)
- 定时发车增加了事务提交的延迟,在高并发情况下,延迟有可能增加争用从而减少吞吐量
定时发车有优点也有缺点,要更具业务负载持续优化来决定最佳设置
参考
binlog_group_commit_sync_delay
《Mariadb 原理与实现》
MySQL组提交
MySQL 组提交(group commit)的更多相关文章
- MySQL组提交(group commit)
MySQL组提交(group commit) 前提: 以下讨论的前提 是设置MySQL的crash safe相关参数为双1: sync_binlog=1 innodb_flush_log_at_trx ...
- [MySQL 5.6] MySQL 5.6 group commit 性能测试及内部实现流程
[MySQL 5.6] MySQL 5.6 group commit 性能测试及内部实现流程 http://mysqllover.com/?p=581 尽管Mariadb以及Facebook在long ...
- mysql组提交
当mysql开启binlog日志时,会存在一个内部XA的问题:事务在存储引擎层redo log的写入和binlog的写入一致性问题. mysql通过两阶段提交很好的解决了redo log和binlog ...
- (转)MySQL 日志组提交
原文:https://jin-yang.github.io/post/mysql-group-commit.html 组提交 (group commit) 是为了优化写日志时的刷磁盘问题,从最初只支持 ...
- mysql 5.6 binlog组提交1
[MySQL 5.6] MySQL 5.6 group commit 性能测试及内部实现流程 尽管Mariadb以及Facebook在long long time ago就fix掉了这个臭名昭著的 ...
- mysql复制那点事(2)-binlog组提交源码分析和实现
mysql复制那点事(2)-binlog组提交源码分析和实现 [TOC] 0. 参考文献 序号 文献 1 MySQL 5.7 MTS源码分析 2 MySQL 组提交 3 MySQL Redo/Binl ...
- MySQL binlog 组提交与 XA(两阶段提交)
1. XA-2PC (two phase commit, 两阶段提交 ) XA是由X/Open组织提出的分布式事务的规范(X代表transaction; A代表accordant?).XA规范主要定义 ...
- MySQL binlog 组提交与 XA(分布式事务、两阶段提交)【转】
概念: XA(分布式事务)规范主要定义了(全局)事务管理器(TM: Transaction Manager)和(局部)资源管理器(RM: Resource Manager)之间的接口.XA为了实现分布 ...
- mysql 5.6 binlog组提交
mysql 5.6 binlog组提交实现原理 http://blog.itpub.net/15480802/viewspace-1411356 Redo组提交 Redo提交流程大致如下 lock l ...
随机推荐
- Html转成Image
html转图片,原来用了html2image.jar,但是做不到复杂的css js渲染效果. 在网友推荐下,可以用wkhtmltoimage插件,这是用谷歌浏览器的内核webkit,网上搜一下可以下载 ...
- 【ESP8266】、ESP8266通讯使用的AT指令
一.AT指令介绍 AT(Attention), AT指令一般应用于终端设备和PC应用之间建立连接.通过AT指令来控制. 二.常用AT指令 AT指令主要分为: 基础AT指令,WIFI功能AT指令,TCP ...
- CentOS7下安装Gitlab社区版【安装步骤、IP改域名、修改端口】
这两天一直在给公司的服务器配置Gitlab(10.5.4).过程很是痛苦,所以把过程记录一下. 1.安装CentOS7 从官网上下载了最新版CentOS-7-x86_64-DVD-1708.iso.用 ...
- 使用pandas进行数据预处理01
数据预处理有四种技术:数据合并,数据清洗,数据标准化,以及数据转换. 数据合并技术:(1)横向或纵向堆叠合数据 (2)主键合并数据 (3)重叠合并数据 1.堆叠合并数据: 堆叠就是简单的把两个表拼接在 ...
- .NET代码混淆——开源.net 混淆器ConfuserEx介绍
转载:https://blog.csdn.net/xiaoyong_net/article/details/78988264
- SVD及其在推荐系统中的作用
本文先从几何意义上对奇异值分解SVD进行简单介绍,然后分析了特征值分解与奇异值分解的区别与联系,最后用python实现将SVD应用于推荐系统. 1.SVD详解 SVD(singular value d ...
- 【python-dict】dict的使用及实现原理
以下内容是针对:python源码剖析中的第五章——python中Dict对象 的读书笔记(针对书中讲到的内容进行了自己的整理,并且针对部分内容根据自己的需求进行了扩展) 一.Dict的用法 Dict的 ...
- 团队项目NABCD分析
1.卡片分类讨论 我们团队在软件工程课上对准备开发的帮你项目进行激烈的讨论后,得出了两个特点. (1)信息检索 (2)主动推送 之所以得出这两个特点,是因为我们作为学生,平常在校园里面有很多专用群和Q ...
- 如何在3GPP下载协议
以下载AT Commands协议为例. 1. 打开3GPP网址:http://www.3gpp.org/ 2. 打开Specification-Specification Numbering,如图.去 ...
- js的一些总结
函数 函数是一等公民 函数可以有属性,并且能连接到它的构造方法 函数可以像一个变量一样存在内存中 函数可以当做参数传给其他函数 函数可以返回其他函数 加法操作表 Number + Number -&g ...