##=======================================##
目前大部分服务器使用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. python字符串处理内置方法一览表

    python字符串处理内置方法一览表   序号 方法及描述 1 capitalize()将字符串的第一个字符转换为大写 2 center(width, fillchar) 返回一个指定的宽度 widt ...

  2. IDEA配置

    关于IDEA的配置 配置注释模板 CTRL_SHIFT_S,在Live Templates中新增一个TemplateGroup,然后再新建两个模板,如下图: 新增cc-ClassComment /** ...

  3. iOS相关的ARM汇编

    一.iOS汇编1.真机:arm64汇编寄存器指令 堆栈2.模拟器:x86汇编 二.lldb (lldb)register read x0 (lldb)register read w0 (lldb)re ...

  4. Git冲突标记介绍

    <<<<<<< head 是指你本地的分支的 <<<<<<< HEADb789=======b45678910> ...

  5. MySQL千万级数据库查询怎么提高查询效率

    在实际项目中,当MySQL表的数据达到百万级别时候,普通查询效率直线下降,而且当使用的where条件较多,其查询效率是让人无法容忍的.假如一个taobao订单查询详情要几十秒,可想而知的用户体验是多差 ...

  6. linux ssh反向代理

    参考:https://segmentfault.com/a/1190000002718360 内外运行:sshpass -p 123456 ssh -fNR 5000:localhost:22 ser ...

  7. Render Functions & JSX

    Render Functions & JSX Basics Vue recommends using templates to build your HTML in the vast majo ...

  8. linux性能监控(转)

    vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况.这个命令是我查看Linux/Unix最 ...

  9. 【此处有干货~】jmeter+ant+jenkins持续集成配置及过程中问题解决思路

    本人是一枚工作近三年的小测试,大学正好专业为软件测试,在工作中用到最多的是功能测试.接口测试.压力测试.偶尔会涉及到性能测试......(小白,很多观念技术跟大佬差距太大,勿喷) 在接口测试过程当中, ...

  10. ili 一例业务系统框架

    ili即ilinei的简称,像名字一样,是ILINEI团队的内部项目简化而来.2017年金鸡报晓,我们为同行送来了一个简单.快速.轻量级的PHP开源系统,它的任务当然也是唯一的任务,就是提高WEB开发 ...