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 ...
随机推荐
- How to change system keyboard keymap layout on CentOS 7 Linux
The easiest way to swap between keymaps and thus temporarily set keys to different language by use o ...
- 5N - 考试排名
C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点.它的功能是怎么实现的呢? 我们做好了题目的解答,提交之后,要么“AC”,要么错误,不管怎样错法,总是给你记上一笔,表明你曾经有过一次错误提 ...
- Python-docx 读取word.docx内容
第一次写博客,也不知道要写点儿什么好,所以就把我在学习Python的过程中遇到的问题记录下来,以便之后查看,本人小白,写的不好,如有错误,还请大家批评指正! 中文编码问题总是让人头疼,想要用Pytho ...
- PNP的学习-P3P
PNP方法是为了解决在当前两帧图像中,已知前一帧图像上的3dLandmark点和当前帧的2d特征点,求取当前帧的pose. PNP主要有P3P.EPNP.UPNP.DLT.MRE(LS Iterati ...
- [Bat]UNC路径不支持的2种解决方法
UNC(Universal Naming Convention),\\servername\sharename,其中servername是服务器名.sharename是共享资源的名称 1.使用push ...
- java 排序算法
1.冒泡排序 public static void main(String[] args) { int[] arr={6,3,8,2,9,1}; System.out.println("排序 ...
- truncate和delete命令的优缺点和原理解析,适用场合
1.相同点:truncate和delete只删除数据不删除表的结构2.不同点:truncate.drop是数据库定义语言,操作立即生效,元数据不会放到rollback segement中,不能回滚,操 ...
- MySQL远程连接失败(错误码:2003)
一 环境信息 服务器系统:Ubuntu 18.04 服务器MySQL版本:14.14 Distrib 5.7.25 本地系统:Kali Linux 本地客户端:python3交互模式 本地开发环境:p ...
- poi实现Excel文件的读取
1.前端代码 $("#upload").on('click', function() { var formData = new FormData(); var name = $(& ...
- centos 6.5升级openssl
1.下载升级版本 wget https://www.openssl.org/source/openssl-1.1.0i.tar.gz 2.安装 zlib zlib-devel yum -y insta ...