##=======================================##
目前大部分服务器使用4K或512B来格式化磁盘,而Innodb存储引擎使用默认16K的数据页,在写入16KB数据页时,可能存在页面部分数据写入到磁盘便发生宕机的状况,该问题被称为部分写失效(Partial page write)。虽然Innodb存储引擎提供redo log来保证事务ACID特性和数据库宕机恢复,但redo log中存放的是页面的物理操做,而非页面的数据,所以没法利用redo log来解决部分写失效的问题。数据库
##=======================================##
为避免部分写失效问题,MySQL引入double write特性,即在刷新脏页过程当中,先使用memcopy把脏页数据复制到内存的double write buffer,而后先将1MB数据写到共享表空间,最后调用fsync来将数据写到磁盘,分两次写操做来将脏页刷新到磁盘。
一、若是在脏页写入到共享表空间时发生宕机,那么数据库在磁盘上的数据页面未受破坏,能够经过redo log来恢复到宕机前的状态。
二、若是在脏页写入到数据库在磁盘对应的页面时发生宕机,那么因为共享表空间中有最新数据,能够经过该数据来恢复,而后再根据redo log来恢复。服务器
##=======================================##
MySQL在共享表空间(system tablespace)中存在2M的空间,分为2个单元功128个数据页,主要分为两类操做:
一、批量刷新脏页:该类操做由后台线程发起,不会影响前台操做,属于异步写操做,使用128个数据页中的120个。
二、Single Page Flash:该类操做由用户线程发起,在只有在Buffer pool中的free page不够时触发,须要尽快刷新脏页以替换出空闲页面,属于同步写操做,使用128个数据页中的8个。异步
在MySQL的提供两个状态值来展现脏页刷新状况:
一、Innodb_dblwr_pages_written :刷新到磁盘的脏页总数
二、Innodb_dblwr_writes:刷新脏页的次数性能
在Buffer pool够用时,MySQL主要经过批量刷新方式来完成写脏页操做,而批量刷新每次刷新64个脏页(1MB)到磁盘,所以Innodb_dblwr_pages_written:Innodb_dblwr_writes的比值远远低于61:1时,代表系统压力较低。测试
##=======================================##
Double Write影响
因为Double Write写共享表空间时是顺序写操做,且将脏页从double write buffer中写到正在的物理磁盘时,系统自动合并相邻的脏页,实现一次刷新多个脏页,所以Double Write对影响影响较小,Percona测试发现约影响5%的性能。atom
对于SDD硬盘,Double Write会增长磁盘磨损。spa
##=======================================##
Mariadb/MySQL的改进
引入Double Write特性是为解决部分写失效问题,最根本缘由是16KB的数据页没法原子写入到磁盘,但若是使用FusionIO/DirectFS文件系统时,能够得到原子写特性。
在Mariadb中使用innodb_use_atomic_writes来控制原子写行为,当该开始开启时,若是启动时检查到支持atomic write时,会自动关闭掉double write特性。
在MySQL 5.7版本中一样支持FusionIO的Atomic Write特性,对于支持原子写的文件系统,会自动关闭double write特性。线程
##=======================================##
Facebook改进
因为服务器宕机并致使部分写失效问题的几率较低,因而Facebook提供选项来关闭DoubleWrite特性,仅在刷新Page的过程前记录要刷新Page号,服务器宕机恢复时,根据这些Page号读取出相关页面根据checksum检查是否存在页面损坏,若是损坏则经过从库或备份来恢复数据。htm
##=======================================##
Percona 5.7版本改进
在Percona 5.7版本中,将Double Write Buffer扩展到每一个Buffer Pool中,按照每一个Buffer Pool的lru链表来进行脏页刷新,提高刷新效率。blog
##=======================================##
摘抄自:
https://m.aliyun.com/yunqi/articles/80423
https://yq.aliyun.com/articles/50627
http://stor.51cto.com/art/201804/570942.htm
##=======================================##