MySQL binlog group commit--flush 阶段

来源:互联网 发布:jquery ajax调用json 编辑:程序博客网 时间:2024/05/19 01:11

        在关系数据库中,为了满足ACID的D属性,即事务提交并返回给客户端之后,必须保证该事务的素有修改都持久化了,物理是在数据库崩溃的情况下或者宕机断电情况下,都必须保证数据不能丢失。这就需要事务提交过程中调用fsync或者fdatasync将数据持久化到磁盘。fsync是一个昂贵的系统调用,对于普通磁盘,每秒只能完成几百次fsync操作。fsync会限制每秒钟提交的事务数成为关系数据库瓶颈。

       为了提高开启binlog情况下单位时间内事务提交数,就必须减少每个事务提交过程中fsync次数。MySQL5.6开始引入了binlog group commit技术。将commit分为3个阶段。

FLUSH_STAGE、SYNC_STAGE、COMMIT_STAGE。本文介绍flush阶段的操作。




说明:

1、将thd放到m_queue[FLUSH_STAGE]队列中,并将队列的首thd作为leader。

2、leader操作:加LOCK_log锁;将队列的所有thd的binlog写入IO_CACHE;将IO_CACHE的内容写入binlog文件(这里写入操作系统缓存);sinal_update广播update_cond,唤醒binlog dump线程,注意这里唤醒后会继续等待LOCK_log锁;

3、绿色部分是半同步操作:repl_semisync.writeTranxInBinlog保存binlog文件及写入位置(半同步操作后面详细介绍)

4、follower:将thd放入队列后,进入等待。直到signal_done广播m_cond_done信号(leader commit完成后调用);然后follower调用finish_commit结束commit

5、process_flush_stage_queue:将队列中thd一个一个pop,然后将其binlog内容写到IO_CACHE中,如果超时binlog_max_flush_queue_time并且队列不为空,则将队列中所有的thd都刷写走

6、flush_cache_to_file:将IO_CACHE内容写入操作系统文件。第5、6合起来实际上是write、flush的步骤

原创粉丝点击