MySQL--Double Write
##=======================================##
目前大部分服务器使用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的更多相关文章
- MySQL double 类型查询不准确的问题
问题 有如下查询: SELECT * FROM <table-name> WHERE price > 32.99; 结果竟然包含了 32.99 的数据行. 原因 price 的类型是 ...
- mysql double 乘法 缺失精度
CREATE TABLE tmp_decimal( id BIGINT auto_increment PRIMARY KEY , amount DOUBLE ); 创建测试表 插入测试数据 INSER ...
- MySQL高可用架构之MHA
简介: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是 ...
- 使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟
使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟 Sqoop 大数据 Hive HBase ETL 使用Sqoop从MySQL导入数据到Hive和HBase 及近期感悟 基础环境 ...
- MySQL MHA 搭建&测试
一:背景介绍 MHA(Master HA)是一款开源的MySQL的高可用工具,能在MySQL主从复制的基础上,实现自动化主服务器故障转移.虽然MHA试图从宕机的主服务器上保存二进制日志,但并不是总是可 ...
- MySQL高可用之MHA的搭建 转
http://www.cnblogs.com/muhu/p/4045780.html http://www.cnblogs.com/gomysql/p/3675429.html http://www ...
- MySQL高可用方案MHA自动Failover与手动Failover的实践及原理
集群信息 角色 IP地址 ServerID 类型 Master ...
- MySQL系列:高可用架构之MHA
前言 从11年毕业到现在,工作也好些年头,入坑mysql也有近四年的时间,也捣鼓过像mongodb.redis.cassandra.neo4j等Nosql数据库.其实一直想写博客分享下工作上的零零碎碎 ...
- MySQL高可用架构之MHA 原理与实践
MHA简介 关于MHA MHA(Master HA)是一款开源的MySQL的高可用程序,它为MySQL主从复制架构提供了automating master failover 功能.MHA在监控到mas ...
- MySQL高可用之MHA的搭建
MySQL MHA架构介绍: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Face ...
随机推荐
- 记录-springcloud -mybatis(代码)
代码部分: 1:pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...
- 生成式对抗网络(GAN)实战——书法字体生成练习赛
https://www.tinymind.cn/competitions/ai 生成式对抗网络(GAN)是近年来大热的深度学习模型. 目前GAN最常使用的场景就是图像生成,作为一种优秀的生成式模型,G ...
- python note 17 random、time、sys、os模块
1.random模块(取随机数模块) # 取随机小数 : 数学计算 import random print(random.random())# 取0-1之间的小数 print(random.unifo ...
- Java中关于quartz定时任务时间设置
每天凌晨2点 0 0 2 * * ?和每天隔一小时 0 * */1 * * ? 例1:每隔5秒执行一次:*/5 * * * * ? 例2:每隔5分执行一次:0 */5 * * * ?在26分.29分. ...
- js 14位字符串 转日期
const pattern = /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/; const newDate = new Date(timeEnd.repla ...
- Scrapy Spider MiddleWare 设置
# -*- coding: utf-8 -*- # Define here the models for your spider middleware # # See documentation in ...
- 服务管理之mysql基础
目录 mysql基础 1. 关系型数据库介绍 1.1 数据结构模型 1.2 RDBMS专业名词 2. mysql安装与配置 2.1 mysql安装 2.2 mysql配置 3. mysql的程序组成 ...
- git 一些实用的api
v3 获取原始文件内容: curl -H "PRIVATE-TOKEN: <token>" -H "Content-Type: application/jso ...
- Vb6调用C#生成的dll
namespace ClassLibrary1 { [ClassInterface(ClassInterfaceType.AutoDispatch)] //注意这行,这行是关键 pub ...
- java中的Condition协作线程接口类
在Java的Condition接口中,存在的几个方法跟Synchronized中的wait(),waitall(),wait(time ^),这个几个方法一一对应起来,但是在Lock.newCondi ...