前提:

以下讨论的前提 是设置MySQL的crash safe相关参数为双1:

sync_binlog=1

innodb_flush_log_at_trx_commit=1

背景说明:

WAL机制 (Write Ahead Log)定义:

WAL指的是对数据文件进行修改前,必须将修改先记录日志。MySQL为了保证ACID中的一致性和持久性,使用了WAL。

Redo log的作用:

Redo log就是一种WAL的应用。当数据库忽然掉电,再重新启动时,MySQL可以通过Redo log还原数据。也就是说,每次事务提交时,不用同步刷新磁盘数据文件,只需要同步刷新Redo log就足够了。相比写数据文件时的随机IO,写Redo log时的顺序IO能够提高事务提交速度。

组提交的作用:

在没有开启binlog时

Redo log的刷盘操作将会是最终影响MySQL TPS的瓶颈所在。为了缓解这一问题,MySQL使用了组提交,将多个刷盘操作合并成一个,如果说10个事务依次排队刷盘的时间成本是10,那么将这10个事务一次性一起刷盘的时间成本则近似于1。

当开启binlog时

为了保证Redo log和binlog的数据一致性,MySQL使用了二阶段提交,由binlog作为事务的协调者。而 引入二阶段提交 使得binlog又成为了性能瓶颈,先前的Redo log 组提交 也成了摆设。为了再次缓解这一问题,MySQL增加了binlog的组提交,目的同样是将binlog的多个刷盘操作合并成一个,结合Redo log本身已经实现的 组提交,分为三个阶段(Flush 阶段、Sync 阶段、Commit 阶段)完成binlog 组提交,最大化每次刷盘的收益,弱化磁盘瓶颈,提高性能。

图解:

下图我们假借“渡口运输”的例子来看看binlog 组提交三个阶段的流程:

在MySQL中每个阶段都有一个队列,每个队列都有一把锁保护,第一个进入队列的事务会成为leader,leader领导所在队列的所有事务,全权负责整队的操作,完成后通知队内其他事务操作结束。

Flush 阶段 (图中第一个渡口)

首先获取队列中的事务组

将Redo log中prepare阶段的数据刷盘(图中Flush Redo log)

将binlog数据写入文件,当然此时只是写入文件系统的缓冲,并不能保证数据库崩溃时binlog不丢失 (图中Write binlog)

Flush阶段队列的作用是提供了Redo log的组提交

如果在这一步完成后数据库崩溃,由于协调者binlog中不保证有该组事务的记录,所以MySQL可能会在重启后回滚该组事务

Sync 阶段 (图中第二个渡口)

这里为了增加一组事务中的事务数量,提高刷盘收益,MySQL使用两个参数控制获取队列事务组的时机:

binlog_group_commit_sync_delay=N:在等待N μs后,开始事务刷盘(图中Sync binlog)

binlog_group_commit_sync_no_delay_count=N:如果队列中的事务数达到N个,就忽视binlog_group_commit_sync_delay的设置,直接开始刷盘(图中Sync binlog)

Sync阶段队列的作用是支持binlog的组提交

如果在这一步完成后数据库崩溃,由于协调者binlog中已经有了事务记录,MySQL会在重启后通过Flush 阶段中Redo log刷盘的数据继续进行事务的提交

Commit 阶段 (图中第三个渡口)

首先获取队列中的事务组

依次将Redo log中已经prepare的事务在引擎层提交(图中InnoDB Commit)

Commit阶段不用刷盘,如上所述,Flush阶段中的Redo log刷盘已经足够保证数据库崩溃时的数据安全了

Commit阶段队列的作用是承接Sync阶段的事务,完成最后的引擎提交,使得Sync可以尽早的处理下一组事务,最大化组提交的效率

缺陷分析:

本文最后要讨论的bug(可通过阅读原文查看)就是来源于Sync 阶段中的那个binlog参数binlog_group_commit_sync_delay,在MySQL 5.7.19中,如果该参数不为10的倍数,则会导致事务在Sync 阶段等待极大的时间,表现出来的现象就是执行的sql长时间无法返回。该bug已在MySQL 5.7.24和8.0.13被修复。

原文发布时间为:2018-07-23

本文作者:黄炎 王悦 周海鸣

本文来自云栖社区合作伙伴“老叶茶馆”,了解相关信息可以关注“老叶茶馆”

mysql启组提交 阿里_[图解MySQL]MySQL组提交(group commit)-阿里云开发者社区相关推荐

  1. mysql group commit_MySQL5.7 核心技术揭秘:MySQL Group Commit-阿里云开发者社区

    一.大纲 一阶段提交 二阶段提交 三阶段提交 组提交总结 二.一阶段提交 2.1 什么是一阶段提交 先了解下含义,其实官方并没有定义啥是一阶段,这里只是我为了上下文和好理解,自己定义的一阶段commi ...

  2. mysql 5.7.14编译安装_源码编译安装mysql-5.7.14-阿里云开发者社区

    1.下载并上传 mysql-5.7.14.tar.gzview plain tar -zxf msql-5.7.14.tar.gz yum -y install gcc gcc-c++ ncurses ...

  3. python开发sqlite3完整_让Python更加充分的使用Sqlite3-阿里云开发者社区

    我最近在涉及大量数据处理的项目中频繁使用 sqlite3.我最初的尝试根本不涉及任何数据库,所有的数据都将保存在内存中,包括字典查找.迭代和条件等查询.这很好,但可以放入内存的只有那么多,并且将数据从 ...

  4. mysql double 存储_关于MYSQL中FLOAT和DOUBLE类型的存储-阿里云开发者社区

    关于MYSQL中FLOAT和DOUBLE类型的存储 重庆八怪 2016-04-12 844浏览量 简介: 关于MYSQL中FLOAT和DOUBLE类型的存储 其实在单精度和双精度浮点类型存储中其存储方 ...

  5. freebsd mysql 安装_Freebsd中mysql安装及使用笔记-阿里云开发者社区

    Freebsd中mysql安装及使用笔记 x3d 2009-07-31 662浏览量 简介: 1.安装 一开始连mysql的软件包在freebsd中叫什么都不知道: 依稀属于databases类,先到 ...

  6. mysql join 索引 无效_ORACLE MYSQL中join 字段类型不同索引失效的情况-阿里云开发者社区...

    ORACLE MYSQL中join 字段类型不同索引失效的情况 重庆八怪 2016-12-29 780浏览量 简介: 关于JOIN使用不同类型的字段类型,数据库可能进行隐士转换,MYSQL ORACL ...

  7. rcs开机启动mysql_linux添加开机自启动脚本示例详解-阿里云开发者社区

    linux添加开机自启动脚本示例详解 double2li 2017-04-14 1652浏览量 简介: linux下(以RedHat为范本)添加开机自启动脚本有两种方法,先来简单的;一.在/etc/r ...

  8. pg数据库生成随机时间_postgresql 时区与时间函数-阿里云开发者社区

    postgresql 时区与时间函数 rudygao 2016-02-03 1951浏览量 简介: --把时间戳转成epoch值 postgres=# select extract(epoch fro ...

  9. 阿里古谦:阿里互联网架构的6大最佳实践-博客-云栖社区-阿里云

    阿里古谦:阿里互联网架构的6大最佳实践-博客-云栖社区-阿里云

  10. 博客同步至阿里云开发者社区,快来帮我涨人气吧

    博客同步至阿里云开发者社区,快来帮我涨人气吧! 直达链接! 直达链接! 直达链接! 直达链接! 直达链接! https://developer.aliyun.com/profile/sijaicxpx ...

最新文章

  1. 《那些年啊,那些事——一个程序员的奋斗史》——38
  2. Debug时如何跳过(不执行)某些代码
  3. jQuery UI全教程之一(dialog的使用教程)
  4. cad细等线体不显示_CAD图纸乱码、钢筋符号不显示解决办法(内含万能字体)
  5. android找不到符号_快速搭建Android开发环境——Android Studio(附ADB找不到设备)...
  6. 三和韓長庚 著 易學原理總論 對讀 021_040
  7. Android RecyclerView加载复杂布局
  8. 降低成本,提高生产力—8句话讲清RPA的部署 1
  9. Python全栈开发之2、运算符与基本数据结构
  10. eclipse Filter web.xml 问题解决 异步请求@WebServlet
  11. 企业打造自己的数据中台,需要的是一套硅谷方法论(文末有福利!)
  12. File类与FileInfo类
  13. 已知两点坐标,求两点连成的直线中的某一点坐标
  14. Django的下载与基本操作
  15. 视频一键识别生成字幕
  16. 数学符号的读音——那些你总是记不住的数学符号的读音(α,β,γ,δ,ε,λ,ζ,η,θ,ξ,σ,φ,ψ,ω...)
  17. OPENCV LOMO效果
  18. 德国GMX Email免费邮箱服务65GB超大邮件存储空间
  19. Dialog dismiss 和 cancel的区别
  20. MaXmaPLe v1.0 for v0.62冒险岛服务端发布

热门文章

  1. 线程基础8-quene讲解
  2. 解决ValueError: Expected 2D array, got 1D array instead
  3. [黑苹果EFI]Lenovo ThinkPad T490电脑 Hackintosh 黑苹果引导文件
  4. 直流电机速度闭环控制(结合vofa+经行串口调试)
  5. 一对一语音聊天系统的私聊约单机制居然是这样
  6. 基于粒子群算法的配电网重构研究matlab程序
  7. 读懂才会用 : 带你见识 Redis 的 zset
  8. 干货||常见软件测试管理工具
  9. Android简单实现搜索功能 显示清除历史搜索记录
  10. 《逆向管理——先行动后思考》读书笔记