热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQLDoubleWrite

##=======================================##目前大部分服务器使用4K或512B来格式化磁盘,而Innodb存储引擎使用默认16K的数据页,在写入

##=======================================##
目前大部分服务器使用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

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

文章来源于https://www.cnblogs.com/TeyGao/p/9236208.html


推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
author-avatar
走ln方
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有