点击上方“IT那活儿”公众号--专注于企业全栈运维技术分享,不管IT什么活儿,干就完了!!!
概述
案例分析

prepare阶段 innodbwrite/sync事务redo、undo log,binlog 不做任何操作。 commit阶段 mysql层write/sync binlog,innodb 写 commit 至redo log。
FLUSH 阶段 持有Lock_log mutex [leader持有,follower等待]。 获取队列中的一组binlog(队列中的所有事务)。 将binlog buffer到I/O cache。 通知dump线程dump binlog。 SYNC阶段 释放Lock_log mutex,持有Lock_sync mutex[leader持有,follower等待]。 将一组binlog 落盘(sync动作,最耗时,假设sync_binlog为1)。 COMMIT阶段 释放Lock_sync mutex,持有Lock_commit mutex[leader持有,follower等待]。 遍历队列中的事务,逐一进行innodb commit。 释放Lock_commit mutex。 唤醒队列中等待的线程。
binlog_group_commit_sync_delay=N 在等待N μs后,开始事务刷盘。 binlog_group_commit_sync_no_delay_count=N 如果队列中的事务数达到N个,就忽视binlog_group_commit_sync_delay的设置。
![]() |
当sync_binlog设置为0或1时,binlog_group_commit_sync_delay时间后sync一组binlog; 当sync_binlog设置N(N>1)时,binlog_group_commit_sync_delay时间后sync N组binlog。
总 结
设置sync_binlog为1,则commit操作需要等待binlog_group_commit_sync_delay时间才能完成,阻塞了commit操作; 设置太大的值(如:1000),则一次sync binlog量比较大,很容易造成IO波动,如果存大大事务,则IO波动会更大。


本文作者:carl(上海新炬中北团队)
本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。





