概述
对于支持事务的关系型数据库来说,事务的完成需要执行commit命令,用于保存该事务操作的相关日志、标记该事务已完成,确保数据的一致性。通常情况下,commit命令执行很快,但也会存在commit是性能瓶颈,影响整体数据库性能的情况发生。
案例分析
慢日志分析
对慢日志分析可见,commit操作平均耗时近1分钟是非正常现象。
MySQL commit机制
mysql数据库为了保证binlog、redolog中事务的一致性,事务采用了两阶段提交(2pc)机制:
prepare阶段
innodb write/sync事务redo、undolog,binlog不做任何操作。
commit阶段
mysql层write/syncbinlog,innodb写 commit 至redolog。
从这个机制可以看出,commit操作包括binlog的落地动作。这就延长了commit动作的时间,也成了一个性能瓶颈,为了优化这一性能问题,mysql5.6推出了组提交机制。
binlog组提交的基本思想是,引入队列机制保证innodb commit顺序与binlog落盘顺序一致,并将事务分组,组内的binlog刷盘动作交给一个事务进行,实现组提交目的。
binlog提交将提交分为了3个阶段,FLUSH阶段,SYNC阶段和COMMIT阶段。基本流程如下:
FLUSH 阶段
持有Lock_log mutex [leader持有,follower等待]
获取队列中的一组binlog(队列中的所有事务)
将