Double Write

优质博文:IT-BLOG-CN

一、存在的问题

为什么需要Double Write InnoDBPageSize16kb,其数据校验也是针对这16KB来计算的,将数据写入磁盘是以Page为单位的进行操作的。而计算机硬件和操作系统,写文件是以4KB作为基本单位,那么将一个Page写到磁盘上,在OS级别需要4个块。当发生数据库宕机时,并不能保证这一操作的原子性。例如Innodb存储引擎正在写入某个页到表中,而这个页只写了一部分4KB。之后就发生了宕机,这种现象被称为部分写失效partial page write。在Innodb存储引擎未使用doublewrite技术前,曾经出现过因为部分写失效而导致数据丢失的现象,磁盘上是一个不完整的数据页。因为系统恢复后MySQL是不是可以根据 redolog 进行恢复。redolog记录的是物理位置(即变更向量)binlog记录的是逻辑日志(即纯粹的SQL),他们都无法恢复这个数据页的数据,毕竟每一次更改不是改变了整个数据页,而是改变一个数据页的一小部分

下面做一个数据写入过程的大致描述:

当发起一个update,首先需要从os存储.ibd文件中读取对应的数据页到buffer cache中;然后SQL对其进行更改,更改的数据物理位置(位置偏移量)写入redo log;完成日志落盘后buffer刷脏时,需要将buffer中更改的脏数据页dirty page完完整整的写入OS存储中,这里就会出现数据库和OS调用IO次数不同的鸿沟。

脏页: 当数据从磁盘加载到缓冲池的数据页后,数据页内容被修改后,此数据页称为脏页

Insert Buffer是用来提高存储引擎性能上的提升,Double Write就是为了在数据库崩溃恢复时保证数据不丢失的一个重要特性,保证了数据的可靠性。

二、Double Write

自己先想想如何能够解决上述问题,思想很重要。

Double Write的思想就是:给当前的这个Page做一个备份,如果写脏页的时候发生宕机,在重启后使用下备份先恢复下数据页再写磁盘就可以了。

如图,其实Double Write分为了两个组成部分:
【1】内存中的double write buffer
【2】物理磁盘上共享表空间中连续的128个页,即2个区extent,大小同样为2MB

数据库表空间由段segment、区extent、页page组成。
  ■ 段segment:包括了数据段(B+树的叶子结点)、索引段、回滚段。
  ■ 区extent:由连续的页组成,任何情况下每个区都为1M,一个区中有64个连续页16k
  ■ 页page:,数据页B-tree Node默认大小为16KB

使用Double Write后的脏页刷新流程就是多了几步操作:
【1】在对缓冲池的脏页进行刷新时,并不直接写磁盘,而是会通过memcpy函数将脏页先复制到内存中的Double write buffer
【2】通过double write buffer再分两次,每次1MB顺序地写入共享表空间的物理磁盘上,然后马上调用fsync函数,同步磁盘,避免缓冲写带来的问题

如图,如果操作系统在将页写入磁盘的过程中发生了崩溃,在恢复过程中,InnoDB存储引擎可以从共享表空间中的Double write中找到该页的一个副本,将其复制到表空间文件,再应用重做日志。

共享表空间Doublewrite Buffer中的数据是修改前的数据。在写入数据页到磁盘之前,首先将数据页写入到共享表空间中,然后再将共享表空间中的数据页复制一份写入到磁盘上的数据文件。这个过程中,共享表空间中的数据页保存的是事务执行之前的数据,也就是修改前的数据。这样做的目的是为了保证数据页写入磁盘的原子性。如果在写入数据页到磁盘时发生故障,可以通过共享表空间中的数据页来恢复数据,保证数据的一致性。当发生故障后,需要使用共享表空间的备份来覆盖磁盘上的数据文件,将修改前的数据重新写入到磁盘。然后,通过redo log来进行数据恢复,重新执行事务的修改操作,将修改后的数据写入到磁盘,从而完成数据的恢复。

下面显示了一个由Double write进行恢复的情况:

090923 12:36:32 mysqld restarted
090923 12:26:33 InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Crash recovery may have faild for some .ibd files!
InnoDB: Restoring possible half-written data pages from the doublewrite.
InnoDB: buffer...

三、Double Write 的问题

Double write buffer它是在物理文件上的一个buffer, 其实也就是file,所以它会导致系统有更多的fsync操作,而因为硬盘的fsync性能问题,所以也会影响到数据库的整体性能。Double write页是连续的,因此这个过程是顺序写的,开销并不是很大。经测试开启DBWinnodb的写入时间仅仅比不开启高10%,为了数据安全方式写丢失,这个代价是可以承受的。

在完成Double write页的写入后,再将Double write buffer中的页写入各个数据文件中,此时的写入则是离散的

如果有double write buffer,会检查double writer的数据的完整性,如果不完整直接丢弃double write buffer内容,重新执行那条redo log,如果double write buffer的数据是完整的,用double writer buffer的数据更新该数据页,跳过该redo log

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/425478.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python基础语法(1)上

常量和表达式 我们可以把 Python 当成一个计算器,来进行一些算术运算。 print(1 2 - 3) print(1 2 * 3) print(1 2 / 3) 这里我们可能会有疑问,为什么不是1.6666666666666667呢? 其实在编程中,一般没有“四舍五入”这样的规则…

基于Python DoIPClient库的DoIP上位机开发手顺

代码 address, announcement DoIPClient.await_vehicle_announcement()logical_address announcement.logical_addressip, port addressprint(ip, port, logical_address) 效果 代码 address, announcement DoIPClient.get_entity(ecu_ip_addresssIp, protocol_version3…

二叉树OJ题——相同的树

文章目录 一、题目链接二、解题思路三、解题代码 一、题目链接 相同的树 二、解题思路 时间复杂度:O(min(n,m)) 三、解题代码

解决IDEA每次创建新项目时都要指定Maven仓库和Maven配置文件的问题

文章目录 0. 前言1. 打开新项目的设置2. 搜索 Maven 相关的配置3. 更改Maven主路径、配置文件、本地仓库4. 更改新项目的Maven配置后没生效 0. 前言 在 IDEA 中每次创建新项目时,使用的都是默认的 Maven 仓库和默认的配置文件,需要我们手动修改&#xf…

利用AI驱动智能BI数据可视化-深度评测Amazon Quicksight(三)

简介 随着生成式人工智能的兴起,传统的 BI 报表功能已经无法满足用户对于自动化和智能化的需求,今天我们将介绍亚马逊云科技平台上的AI驱动数据可视化神器 – Quicksight,利用生成式AI的能力来加速业务决策,从而提高业务生产力。…

SpringSecurity原理解析(八):CSRF防御解析

一、CsrfFilter CsrfFilter 主要功能是用来防止csrf攻击 一、什么是CSRF攻击 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF&#xff0c…

【IP协议】IP协议报头结构

文章目录 IP 协议报头结构4位版本4位首部长度8位服务类型16位总长度16位标识、3位标志、13位片偏移8位生存时间8位协议16位首部校验和32源 IP 地址、32位目的 IP 地址 IP 协议报头结构 4位版本 实际上只有两个取值 4 > IPv4(主流)6 > IPv6 IPv2&…

浅谈人工智能之基于ollama本地大模型结合本地知识库搭建智能客服

浅谈人工智能之基于ollama本地大模型结合本地知识库搭建智能客服 摘要 随着人工智能技术的飞速发展,基于大型语言模型(LLMs)的智能客服系统逐渐成为提升企业服务质量和效率的关键工具。然而,对于注重数据隐私和安全的企业而言,使用云服务可能会引发数据泄露的风险。因此…

【C++题解】1996. 每个小组的最大年龄

欢迎关注本专栏《C从零基础到信奥赛入门级(CSP-J)》 问题:1996. 每个小组的最大年龄 类型:二维数组 题目描述: 同学们在操场上排成了一个 n 行 m 列的队形,每行的同学属于一个小组,请问每个小…

2022高教社杯全国大学生数学建模竞赛C题 问题一(1) Python代码演示

目录 问题 11.1 对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析数据探索 -- 单个分类变量的绘图树形图条形图扇形图雷达图Cramer’s V 相关分析统计检验列联表分析卡方检验Fisher检验绘图堆积条形图分组条形图分类模型Logistic回归随机森林import matplotlib…

SPI学习笔记

SPI SPI是一种同步串行通信接口规范,它允许一个主设备与一个或多个从设备进行全双工通信。SPI用于短距离通信,主要应用于嵌入式系统。 SPI通信过程 1.初始化:SPI主机首先将SS或CS线拉低,以选择特定的从设备并开始通信。 2.数据…

linux文件系统权限详解

注:目录的执行权限代表是否可以进入。 一、文件权限控制对文件的访问: 可以针对文件所属用户、所属组和其他用户可以设置不同的权限 权限具有优先级。user权限覆盖group权限,后者覆盖other权限。 有三种权限类别:读取、写入和执行 读权限:对文件:可读取文件…

集群聊天服务器项目【C++】(五)网络模块和业务模块

经过前面介绍相关的库和工具,比如Json、CMake、muduo等,我们可以开始编写本项目的代码了。 1.项目目录创建 一般一个项目由以下结构组成: bin文件夹存放:可执行程序build文件夹存放:编译过程中的临时文件include文…

电子竞技信息交流平台|基于java的电子竞技信息交流平台系统小程序(源码+数据库+文档)

电子竞技信息交流平台系统小程序 目录 基于java的电子竞技信息交流平台系统小程序 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设…

“拍照赚钱”的任务定价(2017数学建模国赛b题)

文章目录 题目说明解题思路第一问第二问第三问第四问 部分结果图项目地址 题目 赛题地址 说明 数模国赛前的练手题。其实我个人感觉这道题很散,都是找一些规律进行总结统计,最多结合一些机器学习算法进行预测拟合之类的我刚开始用matlab,后…

【演化博弈论】:双方演化博弈的原理与过程

目录 一、演化博弈的原理1. 基本概念2. 参与者的策略3.演化过程 二、MATLAB 代码解读(博弈参与主体(双方)策略选择的动态演化讨程)三、MATLAB 代码解读(博弈主体随着时间策略选择的动态演化讨程)四、结论 演…

Java 枚举 新特性

Java 枚举(enum)自JDK 1.5引入以来,随着版本的升级不断增强。本文将回顾枚举的演进,尤其是结合switch语句的应用,展示枚举如何在现代Java中变得更加灵活。 1. JDK 1.5:Java 枚举的诞生 在JDK 1.5之前&…

TAG:BladeLLM 的纯异步推理架构

作者:张子鹏 PAI引擎团队 随着 GQA/MLA/MoE 等模型结构不断发展,大语言模型的推理逐步解除了显存限制,逐渐向着高并发、高吞吐的方向发展。推理引擎的运行时开销也变得不可忽视。主流 LLM 推理框架的运行时开销大致来自: Python …

黑马十天精通MySQL知识点

一. MySQL概述 安装使用 MySQL安装完成之后,在系统启动时,会自动启动MySQL服务,无需手动启动。 也可以手动的通过指令启动停止,以管理员身份运行cmd,进入命令行执行如下指令: 1 、 net start mysql80…

Excel图片批量插入单元格排版处理插件【图片大师】

为了方便大家在图片的插入排版的重复工作中解放出来,最近发布了一款批量插入图片的插件,欢迎大家下载,免费试用。 这是图片的文件夹: 主要功能如下: 1,匹配单元格名称的多张图批量插入到一个单元格 该功能支持设置图…