突然掉电,为啥MySQL也不会丢失数据?(收藏)

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

缓冲池(buffer pool)

写缓冲(change buffer)

日志缓冲(log buffer)

 

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

突然掉电,为啥MySQL也不会丢失数据?(收藏)

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

突然掉电,为啥MySQL也不会丢失数据?(收藏)

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

突然掉电,为啥MySQL也不会丢失数据?(收藏)

如上图所示,当有页数据要刷盘时:
第一步:页数据先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修复页数据的图。

突然掉电,为啥MySQL也不会丢失数据?(收藏)

可以看到,启动过程中:
(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也不会丢失数据?(收藏)

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

相关文章

缓冲池(buffer pool)

写缓冲(change buffer)

日志缓冲(log buffer)

架构师之路,21年干货精选

发布者:糖太宗,转载请注明出处:https://www.qztxs.com/archives/science/technology/5854

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年5月10日 下午10:12
下一篇 2022年5月10日 下午10:16

相关推荐

  • 用户中心,1亿数据,架构如何设计?

    本文较长,可提前收藏。 用户中心,几乎是所有互联网公司,必备的子系统。随着数据量不断增加,吞吐量不断增大,用户中心的架构,该如何演进呢。   什么是用户中心业务? 用户中心是一个通用业务,主要提供用户注册、登录、信息查询与修改的服务。 用户中心的数据结构是怎么样的? 用户中心的核心数据结构为: User(uid, login_name, passwd, se...

    2022年5月14日
    3300
  • 什么是单机 集群 热备 磁盘阵列raid

    单机部署(stand-alone):只有一个饮水机提供服务,服务只部署一份。   集群部署(cluster):有多个饮水机同时提供服务,服务冗余部署,每个冗余的服务都对外提供服务,一个服务挂掉时依然可用。   热备部署(hot-swap):只有一个桶提供服务,另一个桶stand-by,在水用完时自动热替换,服务冗余部署,只有一个主服务对外提供服务,影子服务在...

    2022年5月11日
    4200
  • 旁路监控

    常见的网络监控模式可以分为两种:一种是旁路监控模式,另一种是串联监控模式。 “旁路监控模式”一般是指通过交换机等网络设备的“端口镜像”功能来实现监控,在此模式下,监控设备只需要连接到交换机的指定镜像端口,所以形象的称之为“旁路监控”。 而串联模式一般是通过网关、网桥或者代理服务器的模式来进行监控,由于监控设备做为网关或者网桥串联在网络中,所以称之为“串联监控...

    技术 2022年5月28日
    11600
  • token的使用

    Token,就是令牌,最大的特点就是随机性,不可预测。一般黑客或软件无法猜测出来,那么,Token有什么作用?又是什么原理呢? Token一般用在两个地方: 防止表单重复提交 anti csrf攻击(跨站点请求伪造)   两者在原理上都是通过session token来实现的。当客户端请求页面时,服务器会生成一个随机数Token,并且将Token放...

    技术 2022年5月27日
    1800
  • 老板问我,什么是协同过滤?

    工程架构方向的程序员,看到推荐/搜索/广告等和算法相关的技术,心中或多或少有一丝胆怯。但认真研究之后,发现其实没有这么难。   今天给大家介绍下推荐系统中的“协同过滤”,绝无任何公式,保证大伙弄懂。   什么是协同过滤(Collaborative Filtering)? 答:通过找到兴趣相投,或者有共同经验的群体,来向用户推荐感兴趣的信息。   举例,如何协...

    2022年5月11日
    1500

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信