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的步骤
- MySQL binlog group commit--flush 阶段
- MySQL binlog group commit--commit stage
- MySQL binlog group commit--sync stage
- 【mysql】sqlalchemy commit 和 flush
- MySQL Group Commit理解
- MySQL Group Commit 笔记
- MySQL innodb的group commit失效问题
- MySQL/InnoDB和Group Commit(1)
- MySQL/InnoDB和Group Commit(2)
- Binary Log Group Commit in MySQL 5.6
- MySQL Group Commit 组提交(BLGC)
- MySQL binlog 组提交与 XA(两阶段提交)
- MySQL binlog 组提交与 XA(两阶段提交)
- MySQL binlog 组提交与 XA(两阶段提交)
- Hibernate session flush commit
- hibernate commit和flush
- hibernate flush与commit
- HIbernate commit() and flush()
- 实验13 编写、应用中断
- 【HD水】A+B
- 那些年,我们在Java ArrayList Remove方法遇到的坑
- A1120. Friend Numbers (20)
- Git学习笔记二:Git的使用
- MySQL binlog group commit--flush 阶段
- POJ
- hdu 2059
- 2017.9.17 选数 失败总结
- 搭建Account Book v2项目过程
- laravel 表单验证及错误消息输出
- 反汇编基本算法
- RxJava之一
- [Swift]iOS仿QQ消息气泡拉拽动画