Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >double write buffer,你居然没听过?

double write buffer,你居然没听过?

作者头像
架构师之路
发布于 2020-03-23 10:15:18
发布于 2020-03-23 10:15:18
1.2K1
举报
文章被收录于专栏:架构师之路架构师之路

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

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

如上图所示,MySQL里page=1的页,物理上对应磁盘上的1+2+3+4四个格。

那么,问题来了,这个操作并非原子,如果执行到一半断电,会不会出现问题呢? 会,这就是所谓的“页数据损坏”。

如上图所示,MySQL内page=1的页准备刷入磁盘,才刷了3个文件系统里的页,掉电了,则会出现:重启后,page=1的页,物理上对应磁盘上的1+2+3+4四个格,数据完整性被破坏。

画外音:redo无法修复这类“页数据损坏”的异常,修复的前提是“页数据正确”并且redo日志正常。

如何解决这类“页数据损坏”的问题呢?

很容易想到的方法是,能有一个“副本”,对原来的页进行还原,这个存储“副本”的地方,就是Double Write Buffer。

Double Write Buffer,但它与传统的buffer又不同,它分为内存磁盘的两层架构。

画外音:传统的buffer,大部分是内存存储;而DWB里的数据,是需要落地的。

如上图所示,当有页数据要刷盘时:

第一步:页数据先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修复页数据的图。

可以看到,启动过程中:

(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%"

来进行查询。

结尾

MySQL有很强的数据安全性机制

(1)在异常崩溃时,如果不出现“页数据损坏”,能够通过redo恢复数据;

(2)在出现“页数据损坏”时,能够通过double write buffer恢复页数据;

double write buffer

(1)不是一个内存buffer,是一个内存/磁盘两层的结构,是InnoDB里On-Disk架构里很重要的一部分;

(2)是一个通过写两次,保证页完整性的机制;

知其然,知其所以然。

思路比结论重要,希望大家有收获。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
逻辑清晰,简明易懂。
逻辑清晰,简明易懂。
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
一些补充的知识点-MySQL的双写缓冲区Doublewrite Buffer
常见的服务器一般都是Linux操作系统,Linux文件系统页(OS Page)的大小默认是4KB。而MySQL的页(Page)大小默认是16KB。可以使用如下命令查看MySQL的Page大小:
用户4283147
2023/12/28
3470
一些补充的知识点-MySQL的双写缓冲区Doublewrite Buffer
深入解析MySQL双写缓冲区
在数据库系统的世界中,保障数据的完整性和稳定性是至关重要的任务。为了实现这一目标,MySQL内部使用了许多精巧而高效的机制。
BookSea
2023/10/12
9890
阿里天猫二面:MySQL Double Write Buffer是什么?架构是怎样的?为什么能保证崩溃恢复...
《Redis 高手心法》作者,后端架构师,精通Java与Go,宗旨是拥抱技术和对象,面向人民币编程。
码哥字节
2025/06/08
1100
阿里天猫二面:MySQL Double Write Buffer是什么?架构是怎样的?为什么能保证崩溃恢复...
MySQL写缓冲(change buffer),终于懂了!!!(收藏)
上篇《MySQL缓冲池(buffer pool),终于懂了》,介绍了InnoDB缓冲池的工作原理。 简单回顾一下: (1)MySQL数据存储包含内存与磁盘两个部分; (2)内存缓冲池(buffer pool)以页为单位,缓存最热的数据页(data page)与索引页(index page); (3)InnoDB以变种LRU算法管理缓冲池,并能够解决“预读失效”与“缓冲池污染”的问题; 画外音:细节详见《MySQL缓冲池(buffer pool),终于懂了》。 毫无疑问,对于读请求,缓冲池能够减少磁盘IO,
架构师之路
2022/03/30
1.8K0
MYSQL Double Write 我关掉行不?
这个问题是在某个群里面,看见有人问的,已经2020年了,到底Double write 能不能关,这是一个好问题。因为有些数据库压根没有 Double write 也就没有性能上的损耗了。那为什么MYSQL 要有DOUBLE WRITE ,并且可以关吗?
AustinDatabases
2020/04/10
2.3K0
MYSQL  Double Write 我关掉行不?
敲黑板:InnoDB的Double Write,你必须知道
上一次我们讲过Insert Buffer 是用来提高存储引擎性能上的提升,Double Write 就是为了在数据库崩溃恢复时保证数据不丢失的一个重要特性,保证了数据的可靠性。
鲁大猿
2020/11/03
1.3K0
MySQL的Double Write如何保证可靠性?
前几篇对MySQL的知识介绍,让我们知道MySQL基本单位是数据页,默认情况下每个数据页的大小是16kb。数据页被读取到内存(Buffer Pool)中后被称为缓存页,,当对Buffer Pool中的数据页做了更新后,此时的数据页叫做:脏页,脏页最终是要刷入磁盘的,那么问题来了。
小许code
2023/06/15
7721
MySQL的Double Write如何保证可靠性?
详解mysql数据库double write原理,性能影响及相关参数
InnoDB的页面大小通常是16KB,其数据校验也是针对这16KB来计算的,将数据写入到磁盘并以页面为单位进行操作的。而计算机硬件和操作系统,在极端情况下(有时断电) )通常并不能保证这一步的原子性,16K的数据,写入4K时,发生了系统断电/ os崩溃,只有一部分写是成功的,这种情况下就是局部页面写问题。
TASKCTL 任务调度平台
2020/07/16
4.7K0
详解mysql数据库double write原理,性能影响及相关参数
MySQL中的double write(二)(r12笔记第17天)
MySQL里的double write是InnoDB的三大闪亮特性,另外两个是insert buffer 和自适应哈希,其实还有几个比如异步IO,Flush neighbour Page(刷新邻接页),这个和系统层面的关联性较高,所以三大亮点还是更有针对性的。 当然一说到MySQL里的double write,其实主要是要应对一个很自然的问题,那就是partial write。 经典的partial write问题 这个问题比较经典,很多数据库设计中都需要考虑到这样一个临界点的问题,M
jeanron100
2018/03/21
8390
MySQL中的double write(二)(r12笔记第17天)
关于MySQL,这篇都没人赞,太没天理了!
mysqldump的产出物是一个包含了建表,插入数据的SQL语句集合,类似于这样:
架构师之路
2021/09/07
4350
ARIES,数据恢复算法,万变不离其宗...
1. 如果缓冲池(buffer pool)满了,哪些数据页(page)要刷盘,哪些数据页不刷盘?
架构师之路
2024/07/03
2390
ARIES,数据恢复算法,万变不离其宗...
MySQL的double write和Oracle对比学习(r4笔记第47天)
之前有网友希望我对mysql的double write和oracle能够做一个对比,其实这种对比方式挺好,能够触类旁通,举一反三。不过限于本人水平有限,欢迎拍砖。 关于MySQL的double wri
jeanron100
2018/03/15
9670
MySQL的double write和Oracle对比学习(r4笔记第47天)
写缓冲 change buffer
(1)MySQL数据存储包含内存与磁盘两个部分; (2)内存缓冲池(buffer pool)以页为单位,缓存最热的数据页(data page)与索引页(index page); (3)InnoDB以变种LRU算法管理缓冲池,并能够解决“预读失效”与“缓冲池污染”的问题;
名字是乱打的
2022/03/04
5700
写缓冲 change buffer
一个可视化数据流平台,做大数据的看过来
InnoDB 是 MySQL 中一种常用的事务性存储引擎,它具有很多优秀的特性。其中,Doublewrite Buffer 是 InnoDB 的一个重要特性之一。
码哥字节
2025/06/08
700
一个可视化数据流平台,做大数据的看过来
MySQL事务已提交,数据却丢了,赶紧检查下这个配置!!!(收藏)
有个水友提问: 沈老师,我们有一次MySQL崩溃,重启后发现有些已经提交的事务对数据的修改丢失了,不是说事务能保证ACID特性么,想问下什么情况下可能导致“事务已经提交,数据却丢失”呢? 这个问题有点复杂,得先从redo log说起。 为什么要有redo log? 事务提交后,必须将事务对数据页的修改刷(fsync)到磁盘上,才能保证事务的ACID特性。 这个刷盘,是一个随机写,随机写性能较低,如果每次事务提交都刷盘,会极大影响数据库的性能。 随机写性能差,有什么优化方法呢? 架构设计中有两个常见的优化方法
架构师之路
2022/04/08
1.3K0
MySQL事务已提交,数据却丢了,赶紧检查下这个配置!!!(收藏)
重温MySQL的ACID实现原理:深入探索底层设计与机制
原子性是数据库事务的核心特性之一,它要求事务中的所有操作要么全部完成,要么全部不完成。这种“全或无”的特性确保了数据库在事务处理过程中的一致性。在MySQL中,原子性的实现主要依赖于事务日志,特别是redo log(重做日志)和undo log(撤销日志)。
公众号:码到三十五
2024/03/19
7040
MySQL缓冲池(buffer pool),终于懂了!!!(收藏)
应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库。 操作系统,会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据的访问。 MySQL作为一个存储系统,同样具有缓冲池(buffer pool)机制,以避免每次查询数据都进行磁盘IO。 今天,和大家聊一聊InnoDB的缓冲池。 InnoDB的缓冲池缓存什么?有什么用? 缓存表数据与索引数据,把磁盘上的数据加载到缓冲池,避免每次访问都进行磁盘IO,起到加速访问的作用。 速度快,那为啥不把
架构师之路
2022/03/24
1.7K0
innodb为什么需要double write?
因为Innodb的数据页一般是16K,但是磁盘的页一般是4K,所以写一次磁盘数据,会有4次写磁盘的原子操作,在极端情况下就可能在磁盘写完前面4K后系统断点,此时4K是新数据,后面的12K是老数据,出现了数据被破坏的情况,这就叫做页分裂。
十毛
2021/02/02
1.3K0
MySQL是如何保证不丢数据的(一)
数据的一致性和完整性对于在线业务的重要性不言而喻,如何保证数据不丢呢?今天我们就探讨下关于数据的完整性和强一致性,MySQL做了哪些改进。
MySQL数据库技术栈
2020/08/05
2.8K0
MySQL性能测试 : 新的InnoDB Double Write Buffer
新的MySQL8.0.20版本重新设计了InnoDB Double Write(DBLWR),确实是一个大的历史烦人的事情。为什么在过去这么痛苦,让我们付出了这么多精力,我无法更好地解释,因为从2018年开始,我已经在下面一篇关于MySQL基于IO负载的文章中说过了。这个故事并不完整,因为它缺少2019年的那一篇(稍后再讲),但是如果你(重新)读过上面的这篇文章提到的内容,您会更好理解接下来的内容。
田帅萌
2020/05/20
2.8K0
推荐阅读
相关推荐
一些补充的知识点-MySQL的双写缓冲区Doublewrite Buffer
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档