文章目录
- 系列文章目录
- 前言
- 一、Double Write Buffer是什么?
- 二、Double Write Buffer步骤
- 步骤
- 对性能的影响
- 总结
系列文章目录
1. MySQL innodb引擎架构分析-Buffer Pool
2. MySQL innodb引擎架构分析-Redo log
3. MySQL innodb引擎架构分析- Double Write Buffer
前言
MySQL的buffer一页的大小是16K,文件系统一页的大小是4K,也就是说,MySQL将buffer中一页数据刷入磁盘,要写4个文件系统里的页。MySQL内的页准备刷入磁盘,才刷了3个文件系统里的页,掉电重启后,物理上只有磁盘上的123页,数据完整性被破坏。如果能有一个“副本”,对原来的页进行还原,就能解决这类“页数据损坏”的问题,在MySQL中就是Double Write Buffer。
Redo Log无法修复这类“页数据损坏”的异常,修复的前提是“页数据正确.”并且Redo Log日志正常。innodb的redo log 不会记录完整的一页数据,因为这样日志太大,它只会记录那次(sequence)如何操作了(update,insert)哪页(page)的哪行(row)
一、Double Write Buffer是什么?
Double Write Buffer是mysql 系统表空间的一块存储区域,在系统中Double Write 分为了两个组成部分:内存中的double write buffer,物理磁盘上共享表空间中连续的128个页,即2个区(extent),大小同样为2MB。
二、Double Write Buffer步骤
步骤
(!图片来源百度)
在Innodb将数据页写到数据存储文件之前,存储从Innodb缓存池刷过来的数据页。且只有将数写入doublewriter buffer后,Innodb才会进行数据页的物理存储。如果在数据页写盘时发生操作系统、存储系统、或者myql进程中断,Innodb可以从doublewriter buffer存储中找回丢失的数据页备份。
第一步:页数据先memcopy到DWB的内存里;
第二步:DWB的内存里,会先刷到DWB的磁盘上;
第三步:DWB的内存里,再刷到数据磁盘存储上;
对性能的影响
Double Write Buffer在磁盘上是一块连续的物理空间,在内存中的数据刷盘到Double Write Buffer属于顺序追加写,速度很快;Innodb保存数据刷磁盘,随机写,本来就需要进行,不属于额外操作;第三方测评,评估约10%性能损失;
总结
如果系统本身数据要求没有那么高(比如日志数据库),Double Write Buffer双写是有一定的性能开销的。可以通过参数innodb_doublewrite = 0进行关闭,设置为1表示开启。官方认为,尽管需要写入两次数据,但是写缓冲区不需要两次的 io开销或操作,因为只需要调用一次操作系统的fsync() 就可以将批量数据顺序写入磁盘 -> 系统表空间的Double Write Buffer,这里是顺序写而不是随机写(性能可以保证),当然前提是配置刷盘策略参数innodb_flush_method为默认的O_DIRECT。
在实际生产种还可以用参数控制:
binlog_group_commit_sync_delay:组提交执行fsync() 延迟的微妙数,延迟时间越长批量数据越多,磁盘io越少性能越高。
binlog_group_commit_sync_no_delay_count:组提交执行fsync的批个数。