前言

  • 操作系统使用页面缓存来填补内存和磁盘访问的差距
  • 对磁盘文件的写入会先写入道页面缓存中
  • 由操作系统来决定何时将修改过的脏页刷新到磁盘
  • 确保修改已经持久化到磁盘,须调用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)的更多相关文章

  1. MySQL组提交(group commit)

    MySQL组提交(group commit) 前提: 以下讨论的前提 是设置MySQL的crash safe相关参数为双1: sync_binlog=1 innodb_flush_log_at_trx ...

  2. [MySQL 5.6] MySQL 5.6 group commit 性能测试及内部实现流程

    [MySQL 5.6] MySQL 5.6 group commit 性能测试及内部实现流程 http://mysqllover.com/?p=581 尽管Mariadb以及Facebook在long ...

  3. mysql组提交

    当mysql开启binlog日志时,会存在一个内部XA的问题:事务在存储引擎层redo log的写入和binlog的写入一致性问题. mysql通过两阶段提交很好的解决了redo log和binlog ...

  4. (转)MySQL 日志组提交

    原文:https://jin-yang.github.io/post/mysql-group-commit.html 组提交 (group commit) 是为了优化写日志时的刷磁盘问题,从最初只支持 ...

  5. mysql 5.6 binlog组提交1

    [MySQL 5.6] MySQL 5.6 group commit 性能测试及内部实现流程   尽管Mariadb以及Facebook在long long time ago就fix掉了这个臭名昭著的 ...

  6. mysql复制那点事(2)-binlog组提交源码分析和实现

    mysql复制那点事(2)-binlog组提交源码分析和实现 [TOC] 0. 参考文献 序号 文献 1 MySQL 5.7 MTS源码分析 2 MySQL 组提交 3 MySQL Redo/Binl ...

  7. MySQL binlog 组提交与 XA(两阶段提交)

    1. XA-2PC (two phase commit, 两阶段提交 ) XA是由X/Open组织提出的分布式事务的规范(X代表transaction; A代表accordant?).XA规范主要定义 ...

  8. MySQL binlog 组提交与 XA(分布式事务、两阶段提交)【转】

    概念: XA(分布式事务)规范主要定义了(全局)事务管理器(TM: Transaction Manager)和(局部)资源管理器(RM: Resource Manager)之间的接口.XA为了实现分布 ...

  9. mysql 5.6 binlog组提交

    mysql 5.6 binlog组提交实现原理 http://blog.itpub.net/15480802/viewspace-1411356 Redo组提交 Redo提交流程大致如下 lock l ...

随机推荐

  1. java导出excel模板数据

    Java导出excel数据模板,这里直接贴代码开发,流程性的走下去就是步骤: String[] colName=new String[]{"期间","科目代码" ...

  2. (转)VS2010反编译dll之后存在的resource修改为resx

    https://www.cnblogs.com/tangbaono1/p/6897183.html 1.找到安装VS的时候,存在的ResGen.exe,我的电脑是win7的,路径是在C:\Progra ...

  3. Jquery中的 Deferred分析

    参考:https://www.idaima.com/a/1627.html http://www.cnblogs.com/aaronjs/p/3356505.html 未完!

  4. VMware12上安装CentOS7无法上网问题

    常安装使用VMware的搭建集群环境,VMare安装后虚拟机默认的是自动获取IP,有时候用的过程中突然XSHELL中断或者需要固定IP上网,遇到几次居然,但忘了步骤,总结一下,省的每次去找资料 环境配 ...

  5. spring boot项目升级到2.0.1,提示java.lang.ClassNotFoundException: org.apache.log4j.Logger错误

    首先肯定是版本出现了一点兼容问题 所以我就进入项目,查看依赖树,cd到项目目录下,mvn dependency:tree 我看到我的项目原先是1.5.9和现在2.0.1的区别在于org.slf4j的依 ...

  6. python基础之Day6

    一.元组 定义:t=(1,2,3,4) 总结:存多个值,值为任意类型 只有读的需求,没有改的需求 有序,不可变(元组里每个值对应的索引内存地址不能变) 在元素个数相同的情况下,元组比列表更节省空间 二 ...

  7. tian_lie

    后台托管:nohup ./re_start_job.sh kg_fk_etl >>log.log 2>&1 & 查看进程:ps -ef|grep kg_fk_etl ...

  8. 【APP测试(Android)】--交叉事件

  9. JavaScript 函数定义和调用

    普通的函数定义方法: function abs(x):{ if (x >= 0){ return x; }else { return -x ; } } 两种方法是等价的 var abs = fu ...

  10. 消息模式Toast.makeText的几种常见用法

    Toast 是一个 View 视图,快速的为用户显示少量的信息. Toast 在应用程序上浮动显示信息给用户,它永远不会获得焦点,不影响用户的输入等操作,主要用于 一些帮助 / 提示. Toast 最 ...