##=======================================##
目前大部分服务器使用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来将数据写到磁盘,分两次写操作来将脏页刷新到磁盘。
1、如果在脏页写入到共享表空间时发生宕机,那么数据库在磁盘上的数据页面未受破坏,可以通过redo log来恢复到宕机前的状态。
2、如果在脏页写入到数据库在磁盘对应的页面时发生宕机,那么由于共享表空间中有最新数据,可以通过该数据来恢复,然后再根据redo log来恢复。

##=======================================##
MySQL在共享表空间(system tablespace)中存在2M的空间,分为2个单元功128个数据页,主要分为两类操作:
1、批量刷新脏页:该类操作由后台线程发起,不会影响前台操作,属于异步写操作,使用128个数据页中的120个。
2、Single Page Flash:该类操作由用户线程发起,在只有在Buffer pool中的free page不够时触发,需要尽快刷新脏页以替换出空闲页面,属于同步写操作,使用128个数据页中的8个。

在MySQL的提供两个状态值来展示脏页刷新情况:
1、Innodb_dblwr_pages_written :刷新到磁盘的脏页总数
2、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%的性能。

对于SDD硬盘,Double Write会增加磁盘磨损。

##=======================================##
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检查是否存在页面损坏,如果损坏则通过从库或备份来恢复数据。

##=======================================##
Percona 5.7版本改进
在Percona 5.7版本中,将Double Write Buffer扩展到每个Buffer Pool中,按照每个Buffer Pool的lru链表来进行脏页刷新,提升刷新效率。

##=======================================##
摘抄自:
https://m.aliyun.com/yunqi/articles/80423
https://yq.aliyun.com/articles/50627
http://stor.51cto.com/art/201804/570942.htm

##=======================================##

MySQL--Double Write的更多相关文章

  1. MySQL double 类型查询不准确的问题

    问题 有如下查询: SELECT * FROM <table-name> WHERE price > 32.99; 结果竟然包含了 32.99 的数据行. 原因 price 的类型是 ...

  2. mysql double 乘法 缺失精度

    CREATE TABLE tmp_decimal( id BIGINT auto_increment PRIMARY KEY , amount DOUBLE ); 创建测试表 插入测试数据 INSER ...

  3. MySQL高可用架构之MHA

    简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是 ...

  4. 使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟

    使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟 Sqoop 大数据 Hive HBase ETL 使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟 基础环境 ...

  5. MySQL MHA 搭建&测试

    一:背景介绍 MHA(Master HA)是一款开源的MySQL的高可用工具,能在MySQL主从复制的基础上,实现自动化主服务器故障转移.虽然MHA试图从宕机的主服务器上保存二进制日志,但并不是总是可 ...

  6. MySQL高可用之MHA的搭建 转

     http://www.cnblogs.com/muhu/p/4045780.html http://www.cnblogs.com/gomysql/p/3675429.html http://www ...

  7. MySQL高可用方案MHA自动Failover与手动Failover的实践及原理

    集群信息 角色                             IP地址                 ServerID      类型 Master                     ...

  8. MySQL系列:高可用架构之MHA

    前言 从11年毕业到现在,工作也好些年头,入坑mysql也有近四年的时间,也捣鼓过像mongodb.redis.cassandra.neo4j等Nosql数据库.其实一直想写博客分享下工作上的零零碎碎 ...

  9. MySQL高可用架构之MHA 原理与实践

    MHA简介 关于MHA MHA(Master HA)是一款开源的MySQL的高可用程序,它为MySQL主从复制架构提供了automating master failover 功能.MHA在监控到mas ...

  10. MySQL高可用之MHA的搭建

    MySQL MHA架构介绍: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Face ...

随机推荐

  1. 记录-springcloud -mybatis(代码)

    代码部分: 1:pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...

  2. 生成式对抗网络(GAN)实战——书法字体生成练习赛

    https://www.tinymind.cn/competitions/ai 生成式对抗网络(GAN)是近年来大热的深度学习模型. 目前GAN最常使用的场景就是图像生成,作为一种优秀的生成式模型,G ...

  3. python note 17 random、time、sys、os模块

    1.random模块(取随机数模块) # 取随机小数 : 数学计算 import random print(random.random())# 取0-1之间的小数 print(random.unifo ...

  4. Java中关于quartz定时任务时间设置

    每天凌晨2点 0 0 2 * * ?和每天隔一小时 0 * */1 * * ? 例1:每隔5秒执行一次:*/5 * * * * ? 例2:每隔5分执行一次:0 */5 * * * ?在26分.29分. ...

  5. js 14位字符串 转日期

    const pattern = /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/; const newDate = new Date(timeEnd.repla ...

  6. Scrapy Spider MiddleWare 设置

    # -*- coding: utf-8 -*- # Define here the models for your spider middleware # # See documentation in ...

  7. 服务管理之mysql基础

    目录 mysql基础 1. 关系型数据库介绍 1.1 数据结构模型 1.2 RDBMS专业名词 2. mysql安装与配置 2.1 mysql安装 2.2 mysql配置 3. mysql的程序组成 ...

  8. git 一些实用的api

    v3 获取原始文件内容: curl -H "PRIVATE-TOKEN: <token>" -H "Content-Type: application/jso ...

  9. Vb6调用C#生成的dll

    namespace ClassLibrary1 { [ClassInterface(ClassInterfaceType.AutoDispatch)]     //注意这行,这行是关键     pub ...

  10. java中的Condition协作线程接口类

    在Java的Condition接口中,存在的几个方法跟Synchronized中的wait(),waitall(),wait(time ^),这个几个方法一一对应起来,但是在Lock.newCondi ...