探秘原子写:为数据完整性再加一分!

对存储设备来说,确保数据的准确记录和读取是其核心使命。鉴于NAND Flash独特的工作原理,当数据需要更新时,SSD往往会将新的数据直接存储到空白的PBA物理块地址上,随后建立LBA逻辑块地址与PBA的映射关系,并将LBA原先指向的旧数据标记无效。在这个过程中,如果遇到意外掉电导致数据未完整写入,或映射关系未正确更新,则可能会返回新旧数据混合的结果。

诚然,企业级SSD掉电数据保护功能可以极大程度防止此类情况发生,但对于数据库等数据准确性要求极高的应用场景,如果能有额外的数据完整性保障措施,那无疑将是锦上添花。今天我们来一起盘一盘保证数据完整性的另一个重要功能——原子写。

原子作为构成世间万物的基本单元,其概念在数据存储领域被赋予了新的意义。原子写保证了每一笔数据写入时的原子性,即,当单个写入命令的数据量不超过SSD的原子写能力时,数据要么完全写入,在读取时返回准确无误的新数据,要么完全没有写入,在读取时返回未经改动的旧数据,而不存在混合结果。

在这里插入图片描述

如图所示,该命名空间采用512B分区格式,一笔16KB数据写入,需使用LBA1-32地址。假设这32个LBA依次写入,当写入LBA16时系统意外掉电,对于不支持原子写的设备,LBA16之后的数据将保持原状,而LBA1至LBA15将指向新写入的数据,LBA16的状态则变得未知。当读取这笔数据时,会返回一个混乱、不确定的结果。

对于支持原子写的设备,由于新的数据并没有完整写入,因此并不会标记LBA1至LBA16的旧数据无效,读取时会返回全旧数据的结果;只有当16KB数据全部完成写入,旧数据才会被标记为无效并等待合适时机进行垃圾回收。这种机制确保了数据的一致性和完整性,避免了因意外断电而导致的数据混乱问题。

NVMe Spec 原子写规范解读

NVMe Spec定义了三种情况下的原子写:正常工作状态下的原子写、异常掉电时的原子写,以及 Compare & Write 融合操作下的原子写。前两个比较容易理解,异常掉电时的原子写能力通常不超过正常状态;融合操作下的原子写主要用于防止错误覆盖,即,写入前会先对LBA原本数据进行比对,避免“误伤”。

同时,原子写又被分为两个层级,首先是控制器层级,它是SSD可以提供的最基本的原子写能力,在所有支持的命名空间格式下都可以生效;其次是命名空间层级,其能力不低于控制器层级,二者也可以相等,NVMe Spec允许同一个NVMe SSD的不同命名空间支持的原子写能力存在差异,以便为不同业务带来各自所需的最佳性能和数据完整性要求。

此外,NVMe Spec还明确界定了命名空间原子写的边界,即,任何基于命名空间的原子写操作均不得跨过边界进行,这一概念和我们熟知的“4K对齐”有些相似,旨在增强原子写的性能和完整性。

原子写场景、层级、边界关系如下:

在这里插入图片描述

问题1:假设多个写命令均符合原子写要求,但写入地址存在重合,会发生什么?
例如,命令A和命令B均符合原子写要求,命令A需要在 LBA 0-3 中写入A,A,A,A;命令B需要在LBA 1-4 中写入B,B,B,B。控制器会对两个命令进行序列化处理,即命令A之后是命令B,或者命令B之后是命令A,每个命令都会以原子写的方式完成,而不是混合状态,最终结果如下:

在这里插入图片描述

问题2:假设写命令符合正常工作状态下的原子写要求,但执行时发生意外掉电,会发生什么?
此时原子写是否被执行,需参考AWUPF、NAWUPF以及NABSPF三个参数的设定情况,如果该命令需写入的数据量不超过AWUPF、NAWUPF,且不需要跨越NABSPF边界,则可以保证写入的原子性,即,数据完整写入,或数据完全没有写入并返回完整的旧数据。

NABO定义了命名空间允许的最大原子写边界的偏移量,其数值不会超过NABSN和NABSPF的限制。在部分写操作中,有时会遇到写命令符合原子写大小要求,但是与NABSN或NABSPF没有完全对齐的情况,通过引入NABO,将允许原子边界做出一定的偏移调整,确保该笔写命令能够以原子写的方式顺利完成。如果偏移后仍然有部分LBA跨越原子边界,将无法保证写入的原子性,如下图所示。

引自 NVMe Spec

是否还有其它保证数据完整写入的方法?

在一些应用,特别是事务型交易中,需要保证在存储设备上的数据是完整的。如,MySQL的Double Write Buffer机制,它是针对InnoDB存储引擎的一个特性,旨在解决因系统故障导致的数据写入不完整的问题,以遵循数据库的ACID准则(Atomicity,Consistency,Isolation,Durability)。

  • A:原子性,每个事务要么被完全执行,要么全都不被执行
  • C:一致性,无论何种情况,甚至极端情况下,事务需要保持数据库数据的正确性、完整性和一致性
  • I:隔离性,在并发执行多个事务时,数据库需要保证每一个事务在它的修改全部完成之后,其他事务才可以看到该事务的最终状态,换句话说,不能让其他事务看到该事务的中间状态
  • D:持久性,事务完成后,它对于数据库的影响是永久性的

当InnoDB要写入一个数据页到硬盘时,首先会将这个数据页内容写入到Double Write Buffer中,写入完成后,再将这些内容写入到最终的数据文件中。如果过程中发生意外,InnoDB首先会检查Double Write Buffer,如果它的内容完整,那么直接采用它来重写数据文件,否则利用Redo Log来重新更新数据文件并舍弃Double Write Buffer中的不完整数据。

双重更新的机制有效确保了数据安全和关系一致,在处理一些极端情况下的数据恢复时可能更为灵活,但代价是写入数据量的成倍增加。将原子写移至堆栈底层由存储设备实现,可以有效减少额外写入问题,增加无日志文件系统的可靠性,简化应用设置并有效延长存储设备的使用寿命。

在PBlaze7 7940 SSD中,我们升级原子写能力至128KB,可以为更多业务场景带来高可靠的数据完整性支持,结合全路径数据保护、NVMe端到端数据保护、掉电数据保护等重要企业级功能,全方位保障用户数据的完整性与安全。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024中国(重庆)VR/AR科技展8月举办

2024中国(重庆)VR/AR科技展8月举办 邀请函 主办单位: 中国航空学会 重庆市南岸区人民政府 招商执行单位: 重庆港华展览有限公司 展会背景: 2024中国航空科普大会暨第八届全国青少年无人机大赛在重庆举办,同时举办第二届中国…

Jupyter配置

一、修改Jupyter打开界面 (1)打开【Anaconda Prompt】,输入【jupyter notebook --generate-config】命令 从运行结果可知【jupyter_notebook_config.py】的位置 (2)使用【记事本】打开 找到# c.NotebookApp.noteb…

【Qt】之【CMake】Error : The source.. does not match the soused

QT中cmak编译出现CMake Error: The source… does not match the soused 分析 前提是该项目是从另一个路径的项目复制过来的,编写代码时发现无论怎样修改代码,运行后都没有任何变化,以为是qtbug,重构重启都没用,最后…

【多电压流程 Multivoltage Flow】- 5.特定工具使用建议(5.使用ICC II以及FC进行物理实现)

使用IC Compiler II和Fusion Compiler进行物理实现 在完成带有行站点、电源规划和I/O放置的floorplan之后,可以继续进行物理综合和实现。Fusion Compiler提供了广泛的功能,以执行设计的平面物理实现。 图67显示了物理实现流程的一般步骤以及流程的低功耗支持特性。 图67 I…

PCL PolygonMesh数据结构

目录 一、函数源码二、主要函数三、读写数据四、代码案例五、结果展示六、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的GPT爬虫。 一、函数源码 #pragma once

Android Studio高版本安卓模拟器抓取https包

Android Studio avd 设置 证书生成 *.cer格式证书​ openssl x509 -inform DER -subject\_hash\_old -in charles-ssl-proxying-certificate.cer​ *.pem格式证书​ openssl x509 -inform PEM -subject\_hash\_old -in charles-ssl-proxying-certificate.pem会输出 2cb30a9e …

二叉树的四种遍历代码实现

二叉树的遍历大致能分为以下几种 1.前序:根 左 右 2.中序:左 根 右 3.后序:左 右 根 4.层序:从根开始一层一层的向下 如上图访问顺序: 前序:1 2 3 N N N 4 5 N N 6 N N 中序:N 3 N 2 N 1 N 5 N 4 N …

小成本大保障:中小企业的数据安全解决方案

在经营预算有限的情况下,中小企业面临着保障数据安全的巨大挑战。数据泄露不仅会导致财务损失,还会损害企业声誉,甚至可能违反数据保护法规。以下是一些成本效益高、实施简便的数据安全解决方案,帮助中小企业在小成本下实现大保障…

【爬虫】爬取股票历史K线数据写入数据库(三)

前几天有写过两篇: 【爬虫】爬取A股数据写入数据库(二) 【爬虫】爬取A股数据写入数据库(一) 现在继续完善,分析及爬取股票的历史K线数据通过ORM形式批量写入数据库。 2024/05,本文主要内容如下…

十五、Redis缓存常见问题

Redis作为最常用的缓存中间件,在使用过程中,必然会遇到过;**缓存穿透、缓存雪崩、缓存击穿。**这三个可以说是Redis缓存使用过程中,最常见的问题,且也是面试中最常闻到的问题。1、缓存穿透 **缓存穿透:**是…

【手势操作-复习前一天的内容-预习今天的内容 Objective-C语言】

一、昨天呢,我们学习的是这个,事件 1.事件这一块儿呢,iOS事件,分为三大类, 1)触摸事件 2)加速计事件 3)远程控制事件 2.这个里边呢,我们主要学习的是这个触摸事件,触摸事件里边,就是Touch,touchesBegan:方法里边,有一个touches参数,它是set类型的, 3.Set,…

启动项目时出现SELinux is preventing

问题描述 启动项目时出现SELinux is preventing**** SELinux正在阻止systemd对文件AB.sevice进行读取访问。 我的是启zabbix是报该错: 最终解决方案 方法一:暂时禁用SELinux setenforce 0 方法二:禁用SELinux 在配置文件/etc/sysconfig/…

韵搜坊(全栈)-- 前后端初始化

文章目录 前端初始化后端初始化 前端初始化 使用ant design of vue 组件库 官网快速上手:https://www.antdv.com/docs/vue/getting-started-cn 安装脚手架工具 进入cmd $ npm install -g vue/cli # OR $ yarn global add vue/cli创建一个项目 $ vue create ant…

【网络安全入门】你必须要有的学习工具(附安装包)零基础入门到进阶,看这一篇就够了!

工欲善其事必先利其器 在新入门网络安全的小伙伴而言。这些工具你必须要有所了解。本文我们简单说说这些网络安全工具吧! Web安全类 Web类工具主要是通过各种扫描工具,发现web站点存在的各种漏洞如sql注入、xss等。从而获取系统权限,常用的…

相同的树LeetCode

100. 相同的树 - 力扣(LeetCode100. 相同的树 - 力扣( 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 /*** Definition…

css 步骤条虚线渐变色效果实现

效果如图所示&#xff1a; 思路&#xff1a; 使用元素覆盖的方式实现视觉上虚线的效果 实现代码&#xff1a; html布局 <ul class"details-cont"><li class"details-li" v-for"item in 3" :key"item"><div class&qu…

如何从未入库的gerrit中撤销一个文件

用一个例子说明 比如有一个提交里面的default.xml的修改没有必要&#xff0c;需要从未入库的gerrit中移除 步骤如下&#xff1a; 1.做reset操作 git reset HEAD^ packages/SettingsProvider/res/values/defaults.xml 2.做checkout操作 git checkout packages/SettingsProv…

C语言leetcode刷题笔记3

C语言leetcode刷题笔记3 第8题&#xff1a;876.链表的中间结点遍历数节点个数快慢指针 第9题&#xff1a;874.比较含退格的字符串第10题&#xff1a;155.最小栈法1&#xff1a;getMin内部实现查找法2&#xff1a;getmin直接返回值补充&#xff1a;栈的使用例子优化&#xff1a;…

使用自动矢量化编译Neon

概述 作为程序员&#xff0c;你有多种方式使用 Neon 技术&#xff1a; 支持 Neon 的开源库&#xff0c;例如 Arm Compute Library提供一种最简单的方式使用 Neon编译器的自动矢量优化特性可以利用 Neon 技术自动优化你的代码Neon intrinsics内建函数&#xff0c;编译器用相应…

ArcGIS如何计算地级市间的距离

一、数据准备 加载配套实验数据包中的地级市和行政区划矢量数据(订阅专栏后,从私信查收数据),如下图所示: 二、计算距离 1. 计算邻近表 ArcGIS提供了计算点和另外点之间距离的工具:分析工具→邻域分析→生成临近表。 计算一个或多个要素类或图层中的要素间距离和其他邻…