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 ...
 
随机推荐
- TXLSReadWriteII2 读取数据
			
TXLSReadWriteII2 按行读取数据(写得复杂了点,实际项目中的,可以自己简化) procedure TformMain.LoadGeneralObject(_type, _col, _ro ...
 - DOCKER解析(转)
			
Docker基本概念详解 本文只是对Docker的概念做了较为详细的介绍,并不涉及一些像Docker环境的安装以及Docker的一些常见操作和命令. 阅读本文大概需要15分钟,通过阅读本文你将知道一下 ...
 - k8s之创建etcd集群
			
主机规划 maste01——192.168.10.63 master02——192.168.10.64 node01——192.168.10.65 node02——192.168.10.66 1.为保 ...
 - 最小费用最大流 HDU1533
			
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1533 #include<bits/stdc++.h> #define fi first ...
 - OKHttp使用详解
			
一,OKHttp介绍 okhttp是一个第三方类库,用于android中请求网络. 这是一个开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso和Leak ...
 - Spark升级--在CDH-5.15.1中添加spark2
			
一.环境准备 jdk-1.8+scala-2.11.X+python-2.7 二.创建目录 mkdir -p /opt/cloudera/csd 修改权限 chown cloudera-scm:clo ...
 - DB2(Procedure)存储过程遍历循环!
			
有时候一些复杂的业务逻辑将要通过存储过程的循环语句进行处理;以下列出2种DB2存储过程的循环语句,方便以后的查看并使用! 推荐第一种方式的使用,最大的优点就是比较直观;在需要操作很多字段的情况下,不需 ...
 - linux 磁盘空间被占满但找不到目标文件的问题处理 lsof命令
			
lsof简介 在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能. 直接输入lsof部分输出为: 每行 ...
 - ASP.NET Boilerplate-AbpSession
			
/------2016-05-15/------介绍 如果一个应用支持登录,也许需要知道当前登录用户的一些操作,然而ASP.NET 本身对于展现层提供了Session的支持,ABP提供了 IAbpSe ...
 - python狂犬病大数据分析
			
一.被动物咬伤.抓伤者,年龄以45-59岁年龄组为最多(占30.66%). 45-59岁年龄段的人与动物接触较多.被侵害的机会最多.其次受伤机会较多的是15-44岁年龄阶段的人,而7岁及以下儿童受伤比 ...