double write buffer,你居然没听过?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: double write buffer,不是一个内存buffer,是一个内存/磁盘两层的结构,是InnoDB里On-Disk架构里很重要的一部分;是一个通过写两次,保证页完整性的机制。

MySQL采用buffer机制,避免每次读写进行磁盘IO,提升效率:

MySQL的buffer一页的大小是16K,文件系统一页的大小是4K,也就是说,MySQL将buffer中一页数据刷入磁盘,要写4个文件系统里的页。
image.png

如上图所示,MySQL里page=1的页,物理上对应磁盘上的1+2+3+4四个格。 那么,问题来了,这个操作并非原子,如果执行到一半断电,会不会出现问题呢?
会,这就是所谓的“
页数据损坏”。
image.png

如上图所示,MySQL内page=1的页准备刷入磁盘,才刷了3个文件系统里的页,掉电了,则会出现:重启后,page=1的页,物理上对应磁盘上的1+2+3+4四个格,数据完整性被破坏。画外音:redo无法修复这类“页数据损坏”的异常,修复的前提是“页数据正确”并且redo日志正常。 如何解决这类“页数据损坏”的问题呢?很容易想到的方法是,能有一个“副本”,对原来的页进行还原,这个存储“副本”的地方,就是Double Write Buffer Double Write Buffer,但它与传统的buffer又不同,它分为内存磁盘的两层架构。画外音:传统的buffer,大部分是内存存储;而DWB里的数据,是需要落地的。
image.png

如上图所示,当有页数据要刷盘时:第一步:页数据先memcopy到DWB的内存里;第二步:DWB的内存里,会先刷到DWB的磁盘上;第三步:DWB的内存里,再刷到数据磁盘存储上;画外音:DWB由128个页构成,容量只有2M。 步骤2和步骤3要写2次磁盘,这就是“Double Write”的由来。 DWB为什么能解决“页数据损坏”问题呢?假设步骤2掉电,磁盘里依然是1+2+3+4的完整数据。画外音:只要有页数据完整,就能通过redo还原数据。假如步骤3掉电,DWB里存储着完整的数据。所以,一定不会出现“页数据损坏”问题。画外音:写了2次,总有一个地方的数据是OK的。 自己实验了几十次,仍没能复现“页数据损坏”,在网上找了一个“页数据损坏”时,MySQL重启过程利用DWB修复页数据的图。
image.png

可以看到,启动过程中:(1)InnoDB检测到上一次为异常关闭;(2)尝试恢复ibd数据,失败;(3)从DWB中恢复写了一半的页; 能够通过DWB保证页数据的完整性,但毕竟DWB要写两次磁盘,会不会导致数据库性能急剧降低呢?


分析DWB执行的三个步骤: (1)第一步,页数据 memcopy 到DWB的内存,速度很快; (2)第二步,DWB的内存 fsync 刷到DWB的磁盘,属于 顺序追加写 ,速度也很快; (3)第三步,刷磁盘,随机写,本来就需要进行,不属于额外操作;   另外,128页(每页16K)2M的DWB,会分两次刷入磁盘,每次最多64页,即1M的数据,执行也是非常之快的。   综上,性能会有所影响,但影响并不大。 画外音: (1)write­-ahead-log之所以性能高,就是因为顺序追加写; (2)有第三方测评,评估约10%性能损失;   更具体的,InnoDB里有两个变量可以查看 double write buffer 相关的情况: Innodb_dblwr_pages_written 记录写入DWB中页的数量。   Innodb_dblwr_writes 记录DWB写操作的次数。   可以通过: show global status like "%dblwr%" 来进行查询。
image.png

结尾

MySQL有很强的数据安全性机制 (1)在异常崩溃时,如果不出现“页数据损坏”,能够通过redo恢复数据; (2)在出现“页数据损坏”时,能够通过double write buffer恢复页数据;   double write buffer (1)不是一个内存buffer,是一个内存/磁盘两层的结构,是InnoDB里 On-Disk 架构里很重要的一部分; (2)是一个通过写两次,保证页完整性的机制;   知其然,知其所以然。 思路比结论重要 ,希望大家有收获。

本文转自“架构师之路”公众号,58沈剑提供。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
存储 SQL 缓存
MySQL的Double Write并不难理解
今天为大家介绍一个新的名词:double write。 相信你还记得,我之前有写笔记跟大家分享过,在MySQL组织数据的基本单位是存在于磁盘上的数据页。数据页被读取到内存(Buffer Pool)中后被称为缓存页。默认情况下每个数据页的大小是16kb,数据页中存储的就是一行行真实的记录,也叫做数据行。
229 0
|
存储 关系型数据库 分布式数据库
【DB吐槽大会】第11期 - FPW | Double Write
大家好,这里是DB吐槽大会,第11期 - FPW | Double Write
|
存储 关系型数据库 数据库
敲黑板:InnoDB的Double Write,你必须知道
InnoDB引擎有几个重点特性,为其带来了更好的性能和可靠性: - 插入缓冲(Insert Buffer) - 两次写(Double Write) - 自适应哈希索引(Adaptive Hash Index) - 异步IO(Async IO) - 刷新邻接页(Flush Neighbor Page)
|
关系型数据库 MySQL 数据库管理
|
Oracle 关系型数据库 MySQL
MySQL中的double write(二)(r12笔记第17天)
    MySQL里的double write是InnoDB的三大闪亮特性,另外两个是insert buffer 和自适应哈希,其实还有几个比如异步IO,Flush neighbour Page(刷新邻接页),这个和系统层面的关联性较高,所以三大亮点还是更有针对性的。
1334 0
|
关系型数据库 MySQL