一种数据校验方法和装置与流程

文档序号:24893387发布日期:2021-04-30 13:21阅读:239来源:国知局
一种数据校验方法和装置与流程

本申请涉及存储领域,尤其涉及一种数据校验方法和装置。



背景技术:

数据在读、写、传输以及存储过程中,要经过多个部件、多种传输通道和复杂的软件处理过程,如果数据被破坏,可能会导致数据错误。如果错误没有被立即检测出来,而是当后续应用在访问所保存的数据时才发现,这种情况称为静默数据失效。由于错误没有在发生时被及时发现,可能错失最佳的修复时机,最终将导致关键数据错误或者系统宕机等严重后果。

在存储阵列中,各关键组件,例如内存、链路以及硬盘等都有自身的数据完整性保护措施,如内存的纠错码(errorcorrectingcode,ecc),链路的循环冗余校验(cyclicredundancycheck,crc),硬盘的ecc技术等。但是,各组件的保护措施仅限于自身数据存取和内部传输过程中的完整性校验,组件之间缺少统一、连续的校验手段,软件逻辑层面的错误(软件bug)造成的数据破坏也无法解决,导致静默数据失效。为了解决数据的静默失效问题,美国国家标准(americannationalstandardinstitute,ansi)的国际信息技术标准委员会(internationalcommitteeoninformationtechnologystandards,incits)的技术委员会定义了信息保护(protectioninformation,pi)标准作为一种数据完整性的校验方法。这种校验方法通过在数据块后增加8字节的保护信息来实现。pi校验主要支持crc校验和逻辑块寻址(logicalblockaddress,lba)校验。通过在存储阵列的i/o路径上统一、连续地使用pi校验,可以防止和检测静默数据失效,例如,数据通道上的硬件故障和软件bug导致的数据破坏、以及硬盘可检测和纠正的数据错误等。虽然由于硬盘的更新换代,但是不支持pi校验的硬盘仍然存在,对于不支持pi校验的硬盘,数据破坏的风险不能被及时发现,即仍然存在静默数据失效的问题。



技术实现要素:

本申请实施例提供一种数据校验方法和装置,能够及时识别存储阵列的数据传输过程中的数据可靠性风险。

第一方面,提供一种数据校验方法,由存储阵列执行,该方法包括:将写请求中的待写数据写入硬盘;接收硬盘发送的写请求的响应消息,写请求的响应消息携带待写数据被写入硬盘的地址;根据写请求的响应消息中的地址,产生读请求,并发送读请求至硬盘;接收硬盘发送的读请求的响应消息,读请求的响应消息中携带从硬盘中读取的数据;对从硬盘中读取的数据进行校验,以确定写入硬盘的数据是否出错。

由此,本申请可根据写请求的响消息生成读请求,以读取写请求写入硬盘的数据,并校验读取的数据是否错误,这样可以及时识别写入硬盘的数据的可靠性风险,对于不支持pi校验的硬盘,可以在本申请进行数据写入以后及时进行数据读取进行数据校验,不依赖硬盘的pi校验功能,可支持无pi功能的硬盘。

在一种可能的设计中,该方法由存储阵列中的块设备管理bdm模块执行,bdm模块包括数据完整性字段dif子模块,对从硬盘中读取的数据进行校验,以确定写入硬盘的数据是否出错包括:对硬盘中读取的数据进行crc校验,若crc校验失败,则对写请求的响应消息中携带的待写数据进行crc校验;若写请求的响应消息中待写数据crc校验失败,则确定dif子模块的上层模块在发送写请求时出现异常,并发送上层模块异常的错误码。也就是说,本申请根据对写请求的响应消息以及读请求的响应消息执行crc校验都失败的情况,确定数据出错是dif子模块的上层模块在发送写请求时出现异常,即异常来源为dif子模块的上层模块下发写请求时出现异常,这种情况下,dif子模块可以向上层模块发送异常的错误码,该错误码指示数据写入硬盘时出现错误,且故障来源于dif子模块的上层模块。这样,不仅可确定数据出错,还可以确定出数据出错的范围,以便及时对数据进行修复。

在一种可能的设计中,若写请求的响应消息中待写数据crc校验成功,则确定dif子模块的下层模块在发送写请求时出现异常,并发送下层模块异常的错误码。即出现了对写请求的响应消息校验成功,对读请求的响应消息执行crc校验失败的情况,这时,数据出错可以认为是该dif子模块的下层模块在发送写请求时出现异常,即异常来源为dif子模块的下层模块下发写请求时出现异常,这种情况下,dif子模块可以向上层模块发送异常的错误码,该错误码指示数据写入硬盘时出现错误,且故障来源于dif子模块的下层模块。

在一种可能的设计中,写请求中携带dif校验位;对从硬盘中读取的数据进行校验,以确定写入硬盘的数据是否出错包括:对硬盘中读取的数据进行crc校验;若crc校验成功,则比对写请求的响应消息中携带的待写数据的dif和从硬盘中读取的数据的dif;若写请求的响应消息中携带的待写数据的dif和从硬盘中读取的数据的dif不一致,则确定将待写数据写入硬盘时发生写偏移。这是考虑到,存储阵列对硬盘中读取的数据进行crc校验,即对读请求的响应消息中携带的从硬盘读取的数据进行crc校验,只能确定读取的数据是否出错,即确定读取的数据部分和校验部分是否匹配,但是不能确定读取的数据是否是发生数据写偏故障的数据。因此,本申请可以在确定读请求的响应消息中携带的数据未出错时,还可以比对写请求的响应消息中携带的待写数据的dif和从硬盘中读取的数据的dif,继续校验读请求的响应消息中携带的数据是否是写偏的数据。

在一种可能的设计中,写请求为在一个采样周期中所采样的写请求。这样,不需要对所有的写请求进行校验,减少由于校验带来的对用户业务性能的影响。

第二方面,提供一种存储阵列,包括:写操作单元,用于将写请求中的待写数据写入硬盘;响应单元,用于接收硬盘发送的写请求的响应消息,写请求的响应消息携带待写数据被写入硬盘的地址;读操作单元,用于根据写请求的响应消息中的地址,产生读请求,并发送读请求至硬盘;响应单元,还用于接收硬盘发送的读请求的响应消息,读请求的响应消息中携带从硬盘中读取的数据;校验单元,用于对从硬盘中读取的数据进行校验,以确定写入硬盘的数据是否出错。

在一种可能的设计中,存储阵列包括块设备管理bdm模块,bdm模块包括所述校验单元,校验单元包括数据完整性字段dif子模块;校验单元,用于:对硬盘中读取的数据进行crc校验,若crc校验失败,则对写请求的响应消息中携带的待写数据进行crc校验;若写请求的响应消息中待写数据crc校验失败,则确定dif子模块的上层模块在发送写请求时出现异常,并发送上层模块异常的错误码。

在一种可能的设计中,校验单元,用于:若写请求的响应消息中待写数据crc校验成功,则确定dif子模块的下层模块在发送写请求时出现异常,并发送下层模块异常的错误码。

在一种可能的设计中,写请求中携带dif校验位;校验单元,用于:对硬盘中读取的数据进行crc校验;若crc校验成功,则比对写请求的响应消息中携带的待写数据的dif和从硬盘中读取的数据的dif;若写请求的响应消息中携带的待写数据的dif和从硬盘中读取的数据的dif不一致,则确定将待写数据写入硬盘时发生写偏移。

在一种可能的设计中,写请求为在一个采样周期中所采样的写请求。

第三方面,提供一种计算机可读存储介质,包括计算机指令,当所述计算机指令在电子设备上运行时,使得所述电子设备执行如第一方面所述的方法。

第四方面,提供一种计算机程序产品,当所述计算机程序产品在电子设备上运行时,使得电子设备执行如第一方面所述的方法。

由此,本申请通过对写入数据再次读取,并校验读取的数据是否错误的方式,可以及时识别写入硬盘的数据的可靠性风险,对于不支持pi校验的硬盘,可以在本申请进行数据写入以后再次进行数据读取进行数据校验,不依赖硬盘的pi校验功能,可支持无pi功能的硬盘。

附图说明

图1为本申请实施例提供的一种用于pi校验的数据格式;

图2为本申请实施例提供的一种网络架构示意图;

图3为本申请实施例提供的一种网络架构示意图;

图4为本申请实施例提供的一种存储阵列的结构示意图;

图5为本申请实施例提供的一种bdm模块的软件划分示意图;

图5a为本申请实施例提供的一种数据格式的示意图;

图6为本申请实施例提供的一种数据校验方法的流程示意图;

图7为本申请实施例提供的一种数据校验方法的流程示意图;

图8为本申请实施例提供的一种bdm模块的软件划分示意图;

图9为本申请实施例提供的一种数据写偏的检测过程示意图;

图10为本申请实施例提供的一种存储阵列的结构示意图;

图11为本申请实施例提供的一种存储阵列的结构示意图。

具体实施方式

为了便于理解,示例地给出了部分与本申请相关概念的说明以供参考。如下所示:

pi校验:也称为数据完整性域(dataintegrityfield,dif)校验,通过对每个数据块加入pi进行数据校验。例如在t10pi标准中,对于512+8的数据格式,如图1所示,每个512比特的逻辑扇区(数据)被扩充了8字节的保护信息(pi),包括2字节的crc校验值(携带在数据块的grd(guard)字段中),2字节的用户自定义和应用相关的信息(携带在数据块的应用(application,app)字段中)和4字节的逻辑块地址(logicalblockaddress,lba)(携带在数据块的ref(reference)字段中),可以在以数据读/写后通过对保护信息进行对比来实现完整性检查,确保数据块里的数据没有变化。

crc:一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来做错误侦测的。crc同其他差错检测方式一样,通过在要传输的k比特数据后添加(n-k)比特冗余位(又称帧检验序列,framechecksequence,fcs)形成n比特的传输帧,再将传输帧发送出去,n和k为大于或等于1的整数。

逻辑单元号(logicalunitnumber,lun):lun是在存储设备上可以被服务器识别的独立存储单元。一个lun的空间来源于存储池,存储池的空间来源于组成磁盘阵列(redundantarraysofindependentdrives,raid)的若干块硬盘。从服务器的角度来看,一个lun可以被视为一块可以使用的硬盘。

块设备管理(blockdevicemanagement,bdm):也可以称为linux小型计算机系统接口(smallcomputersysteminterface,scsi)中层。bdm主要负责硬盘管理、硬盘路径管理、输入/输出(input/output,i/o)合并(多个i/o组成一个i/o)与排序(根据i/o优先级对多个i/o进行顺序)、i/o承载(也称i/o通道)、硬盘可靠性处理等。

本申请实施例涉及的术语“磁盘”和“硬盘”具有基本相同含义。磁盘是通过磁性进行读写功能的设备磁盘,其可为非易失性存储介质,断电后保存的文件不会丢失。硬盘是将磁盘的储存片装到硬质金属盒子里可以得到更好的保护。

本申请实施例可以应用于主机对存储阵列进行写操作访问过程中,对数据进行校验的过程。

如图2所示,本申请的网络架构可以包括服务器21和存储阵列22,该服务器可以理解为计算的核心,存储阵列为数据存储的核心。一台服务器可以访问一个或多个存储阵列,一个存储阵列也可以被多台服务器访问,且支持被多种服务器访问。

例如服务器可以是x86架构的个人计算机(personalcomputer,pc)服务器,也可以是solaris或者aix这样的小型服务器。以pc服务器为例,如图3所示,服务器外设的终端31可通过局域网(localareanetwork,lan)访问pc服务器,pc服务器32可以通过小型计算机系统接口(smallcomputersysteminterface,scsi)访问存储阵列22。

一般情况下,服务器都是配置有磁盘存储的,磁盘可以是几百gb的容量。当服务器需要存储海量的数据,如上百tb级别的数据,服务器自带的磁盘容量就不够用,需要进行扩充。而存储阵列可以将几块、几十块,乃至上百块磁盘组合起来,形成容量巨大的存储设备,将所有的数据都存储在存储阵列中,并通过光纤连接到数据库主机,这样就提高了服务器的存储容量。

如图4所示,存储阵列22可以包括多个控制器41、每个控制器41对应有缓存42、以及多个硬盘43。硬盘43可以通过串行连接scsi接口(serialattachedscsi,sas)链路连接到控制器41。每个控制器41可以通过多条访问路径访问硬盘43。

其中,存储阵列22根据业务需要维护有lun模块,lun模块用于创建多个指定的lun,或者称为多个lun对象,并管理这多个lun对象,包括管理lun对象的创建、查询以及删除等,每个lun对象对应一个lun标识(identity,id)。当存储阵列22与服务器21建立组网连接后,服务器21可通过扫描lun模块发现存储阵列分配的存储空间,并对其进行读写操作。以图3为例,用户要进行写操作时,可以通过在终端31上操作使得pc服务器32启动目标器(target,tgt)模块的服务,查找到需要写入的lunid,并生成写请求。该写请求中包括待写入硬盘的数据部分以及校验部分(某些服务器支持pi,则写请求中的校验部分是可由服务器直接生成的;若服务器不支持pi,则可以由tgt模块生成校验部分),该写请求经过pc服务器到达存储阵列33的一个控制器,该控制器将写请求中的数据以及校验码先存储在该控制器下的缓存(cache)中,这时如果写请求为回写请求,存储阵列可以先向pc服务器返回一个响应,指示写请求写成功。存储在缓存中的所述写请求的数据,根据缓存淘汰策略,在被从缓存中淘汰时,才会被写入硬盘43。从缓存42写入硬盘43的写请求会经过存储阵列的存储块组(chunkgroup,ckg)模块,ckg模块主要用于管理存储池raid,ckg模块可根据写请求中的lunid确定数据需要写入到lunid对应的哪些逻辑盘中。而后,bdm模块可根据ckg模块确定的逻辑盘,以及逻辑盘的逻辑地址和物理硬盘的物理地址对应关系确定写请求写入数据的物理硬盘。其中,tgt模块、lun模块、ckg模块以及bdm模块均为存储阵列中的操作系统的软件模块。

其中,如图5所示,bdm模块可以包括逻辑盘(logicdisk,ld)子模块、scsi硬盘(scsidisk,sd)子模块以及scsi输入/输出(scsii/o,sio)子模块。ld子模块用于管理逻辑盘的逻辑地址和物理硬盘的逻辑地址的对应关系,sd子模块用于管理物理硬盘的逻辑地址。sio子模块可以包括校验层(也可以称为dif子模块或者dif层)。当bdm模块接收到ckg模块发送的写请求时,bdm模块可以将写请求中携带的数据部分以及校验部分写入硬盘。当数据写成功时,硬盘返回写响应,该写响应中依然携带有一份写请求写入的数据部分以及校验部分,写响应经过bdm模块、ckg模块以及缓存到达lun模块进行lba校验(在lun模块进行的lba校验,用于校验数据是否写偏)成功时,会将缓存中存储的该数据部分以及校验部分进行释放。具体来说,当写响应到达bdm模块的校验层时,会对写响应进行crc校验,即,对写响应中携带的数据部分进行crc计算,得到crc校验值,将crc校验值与写响应中携带的校验部分(crc校验值)进行对比,如果crc校验值与写响应中携带的校验部分相同,则校验成功,说明写响应中携带的数据本身没有问题;如果crc校验值与写响应中携带的校验部分不相同,则校验失败,说明写响应中携带的数据为错误数据,发生了数据写错的故障。当执行crc校验成功时,只能说明数据本身为正确的数据,但是,写响应中携带的数据还可能是数据写偏时的数据,因此,写响应继续返回至lun模块还需要进行lba校验,以检验数据是否写偏。

该lba校验数据写偏的原理可以为:在lun模块中生成写请求时,如图5a所示,例如对于512+8的数据格式,写请求携带有写数据a的数据部分、校验部分以及其他属性,其他属性中携带有数据大小、数据类型以及写请求对应的第一lba等,校验部分的ref字段中携带有lunid对应的第二lba(该第二lba不会在传输过程中变更,第二lba和第一lba在lun模块中时是相同的),在写请求传输过程时,该第一lba会经过各层的软件程序转换为各层的lba,最终在ld子模块中根据从cgk模块接收到的lba(逻辑地址),以及逻辑盘的逻辑地址和物理硬盘的物理地址对应关系确定访问硬盘的物理地址并下发,物理硬盘根据接收到的物理地址将写请求中携带的数据部分以及校验部分写入硬盘。数据a写入成功时,硬盘返回的写响应中会携带数据a最终写入硬盘的物理地址、数据部分以及校验部分,这时由于软件或硬件故障,数据最终在写入硬盘时有可能发生数据写偏的问题。举例来说,写请求传输过程中如果没有发生故障时,携带的第一lba转换后的物理地址应该为物理地址100,数据a应该被写入地址100中,如果写请求传输过程中发生故障,第一lba经过各层的软件程序最终转换为访问硬盘的物理地址时,转换后的物理地址为地址200,写请求中携带的数据a会被写入到物理地址200中,这时就发生了数据写偏的问题。当服务器再次读取该数据a时,读请求中携带的是第一lba,读响应中也携带有第一lba,但是读响应中携带的读取的第一lba对应的物理地址100中的数据并不是数据a,而是数据b。当读响应返回到lun模块中时,会进行lba校验,这时就会发现数据b中携带的校验部分中的第三lba与读响应携带的第一lba并不匹配,lun模块确定后端发生了数据写偏的问题。也即,用于检验数据是否写偏的lba校验是发生在再次读取数据的读响应返回至lun模块时执行的。

需要说明的是,本申请实施例中的软件层或者软件模块的划分仅仅为一种示意的划分,例如图5中bdm模块的划分并不构成对bdm模块软件层划分的限定。

还需要说明的是,存储系统主要分为存储区域网络(storageareanetwork,san)和网络附加存储(networkattachedstorage,nas)两种存储机制,本申请中涉及到的lun的实例是指san,但本申请同样适用于nas。

以上crc校验以及lba校验均为pi校验,对于一些硬盘支持该pi校验,但并不是所有的硬盘都支持pi交验,对于不支持pi校验的硬盘,可能发生的数据写错或者写偏的问题将不能被识别。

针对该问题,本申请提出一种数据校验方法,该方法由存储阵列执行,其原理可以为:当存储阵列执行写操作将数据写入硬盘后,返回的响应消息并不及时向上层发送,而是在校验层将响应消息进行悬挂,生成一个读操作,该读操作用于读取写入硬盘的数据,从而对读取的数据在校验层进行校验,以确定写入硬盘的数据是否出错,这样在校验层就可以及时识别后端数据的可靠性风险,对于不支持pi校验的硬盘,可以在本申请进行数据写入以后中再次进行数据读取进行数据校验,不依赖硬盘的pi校验功能,可支持无pi功能的硬盘。

基于以上原理,下面对本申请的实现流程进行说明。

本申请实施例提供一种数据校验方法,如图6所示,该方法包括:

601、存储阵列将写请求中的待写数据写入硬盘。

当存储阵列接收到数据库主机发送的写请求时,存储阵列可以按照上述说明将写请求中携带的待写数据写入硬盘。例如当bdm模块接收到待写数据时,可以按照上述对图3以及图5中的说明将待写数据写入硬盘。其中,写请求中携带有数据部分以及校验部分(保护信息部分),存储阵列根据写请求对硬盘执行写操作时,不仅写入数据部分,也会写入校验部分。

602、存储阵列接收硬盘发送的写请求的响应消息,写请求的响应消息携带待写数据被写入硬盘的地址。

当数据成功写入硬盘时,硬盘可生成写请求的响应消息,该响应消息用于向硬盘的上层模块指示待写数据已写入硬盘,同时,该响应消息中携带有待写数据被写入硬盘的地址。

603、存储阵列根据写请求的响应消息中的地址,产生读请求,并发送读请求至硬盘。

存储阵列可以在校验层悬挂写请求的响应消息,根据写请求的响应消息中的地址产生一个读请求,该读请求中携带有待写数据被写入硬盘的地址。例如,步骤602中待写数据写入硬盘的地址为200,那么在正常情况下读请求中携带的地址为200。该读请求用于读取步骤601中存储阵列写入硬盘地址为200的数据。

604、存储阵列接收硬盘发送的读请求的响应消息,读请求的响应消息中携带从硬盘中读取的数据。

当读请求到达硬盘时,硬盘可以根据读请求中携带的地址读取步骤601中刚写入硬盘的待写数据,并向硬盘的上层模块返回读请求的响应消息,该读请求的响应消息中携带有步骤601中刚写入硬盘的待写数据,包括数据部分以及校验部分。

605、存储阵列对从硬盘中读取的数据进行校验,以确定写入硬盘的数据是否出错。

本步骤中,对从硬盘中读取的数据进行校验,即对读请求的响应消息中携带的待写数据进行校验,可以是在图5的校验层进行crc校验。即当读请求的响应消息返回到图5中的校验层(dif子模块或者dif层)时,对从硬盘中读取的数据进行crc校验。若crc校验失败,则确定写硬盘的数据出错,出错可能由于硬件或者软件故障导致。若crc校验成功,说明读请求的响应消息中携带的数据未出错。若crc校验失败,说明读请求的响应消息中携带的数据出错。其中,crc校验可以是对读请求的响应消息中携带的数据部分计算crc校验值,将crc校验值与读请求的响应消息中的校验部分的crc校验值进行对比,如果计算得到的crc校验值与本身携带的crc校验值相同,说明crc校验成功,如果计算得到的crc校验值与本身携带的crc校验值不同,说明crc校验失败。

由此,本申请通过对写入数据再次读取,并校验读取的数据是否错误的方式,可以及时识别写入硬盘的数据的可靠性风险,对于不支持pi校验的硬盘,可以在本申请进行数据写入以后再次进行数据读取进行数据校验,不依赖硬盘的pi校验功能,可支持无pi功能的硬盘。

在本申请实施例中,不仅可以在校验层对读请求的响应消息执行crc校验,以确定生成的读请求的响应消息中携带的数据是否出错,还可以在校验层进一步对悬挂的写请求的响应消息进行校验,以判断数据出错的出错范围。另外,上述说明书中提及到lba校验是在上层的lun模块中执行的,也就是说校验数据是否写偏是需要等到再次读取数据时的读响应达到lun模块时才能校验出来,校验数据是否写偏并不及时,对此,在本申请实施例中,可以在lun模块下层的校验层中校验出数据是否写偏,使得数据是否写偏能够被及时检测出来,以便及时进行数据恢复。

此外,考虑到对访问硬盘的所有写请求采用图6对应的方法进行数据校验,对客户的业务性能存在影响,本申请可以对访问硬盘的写请求进行采样,以对采样的写请求进行数据是否写偏的校验。因此,本申请实施例提供一种数据校验方法,如图7所示,包括:

701、存储阵列以每块硬盘为单位,在一个采样周期中,对硬盘的写请求进行采样。

即存储阵列可以以每块硬盘为单位对写请求进行采样。以一个硬盘来说,在该硬盘的每个采样周期中,例如采样周期为30s,即在每个30s内对访问该硬盘的写请求进行采样,一个周期内采样的写请求的数量可以为至少一个。该周期可以进行配置或者更新,例如可配置对一个硬盘的每个周期内访问的写请求都进行采样,也可以是采样一个写请求。该采用功能也可以设置开关,用于开启写采样功能或者关闭写采样功能。其中,对写请求进行采样,可以是通过对写请求添加标记字段或者比特位等,添加有标记字段或者比特位的写请求即为采样的写请求。

参考图5对bdm模块的软件层划分,存储阵列可以是在bdm模块的sio子模块入口的程序中执行采样过程。

702、存储阵列将采样的写请求中的待写数据写入硬盘。

写请求中的待写数据包括数据部分和校验部分。写请求的下发过程可以参见图5中的说明。

703、存储阵列接收硬盘发送的采样的写请求的响应消息,该写请求的响应消息携带待写数据被写入硬盘的地址。

写请求的响应消息中携带有写请求的待写数据被写入硬盘的地址,以及写入硬盘的待写数据,包括数据部分和校验部分。该写请求的响应消息是写入数据的硬盘产生的。该写请求的响应消息会到达bdm模块,参考图5,写请求的响应消息通过bdm模块的驱动接口层向上层模块返回。

704、存储阵列根据采样的写请求的响应消息中的地址,产生读请求,并发送读请求至硬盘。

根据写请求的响应消息中的地址产生读请求可以是在bdm模块的校验层执行的。

在一些实施例中,如图8所示,步骤704中根据采样的写请求的响应消息中的地址,产生读请求的校验层可以是区别于图5中执行crc校验的校验层的另一个校验层,在图8中,将图5中的校验层标记为校验层1(或称为dif子模块1),将可用于产生读请求的校验层标记为校验层2(或称为dif子模块2)。该校验层2为本申请新增的一个校验层,校验层2可以用于根据写请求的响应消息中携带的地址生成读请求,将读请求发送给校验层2的下层模块直至硬盘。

示例性的,当采样的写请求的响应消息到达bdm模块的校验层2时,可暂时不将写请求的响应消息继续向上层模块返回,在校验层2悬挂该采样的写请求的响应消息,并根据该采样的写请求的响应消息中的地址生成一个读请求,读请求用于读取步骤702中采样的写请求写入硬盘的数据,读请求中携带写请求的响应消息中的地址。

705、存储阵列接收硬盘发送的读请求的响应消息,读请求的响应消息中携带从硬盘中读取的数据。

当硬盘接收到来自于校验层2产生的读请求时,硬盘可以根据读请求中的地址读取步骤702中写请求写入硬盘的待写数据,包括数据部分和校验部分,并产生读请求的响应消息,读请求的响应消息中携带该数据部分和校验部分。

在一些实施例中,硬盘在根据读请求中的地址读取数据时,可以是读取硬盘中该地址对应的数据部分的全部数据,也可以是按照预设间隔模式读取数据部分的部分数据,本申请不做限定。

需要说明的是,步骤705以及步骤705以下步骤中的写请求指采样的写请求,写请求的响应消息指采样的写请求的响应消息。

706、存储阵列对硬盘中读取的数据进行crc校验,若crc校验失败,则进入步骤707;若crc校验成功,则进入步骤710。

参考图5,读请求的响应消息可经过sas驱动到达bdm模块。当读请求的响应消息到达bdm模块的校验层1时,可在校验层1对读请求的响应消息进行crc校验,即计算读请求的响应消息中的数据部分和校验部分是否匹配,匹配方式可参见步骤605。如果不匹配,即crc校验失败,说明读请求的响应消息携带的数据出现错误,如果匹配,即,crc校验成功,说明读请求的响应消息携带的数据正确。

需要说明的是,本申请以sas驱动为例仅为一种举例,本申请对驱动不做限制,例如也可以是nvme(non-volatilememoryexpress)等协议驱动。

707、存储阵列对写请求的响应消息中携带的待写数据进行crc校验。而后,进入步骤708或者步骤709。

如果数据出现错误,可能是由于软件故障或硬件故障导致的,还可以进一步根据步骤704中悬挂的写请求的响应消息中携带的待写数据进行crc校验确定导致数据出错的范围。

该707步骤中,由于该写请求的响应消息悬挂在校验层2,因此,对写请求的响应消息进行crc校验可以是在校验层2执行的。

708、若写请求的响应消息中待写数据crc校验失败,则存储阵列确定dif子模块的上层模块在发送写请求时出现异常,并发送上层模块异常的错误码。

如果对悬挂的写请求的响应消息中携带的待写数据进行crc校验失败,就出现了对写请求的响应消息以及读请求的响应消息执行crc校验都失败的情况,这时,数据出错可以认为是该校验层2的上层模块在发送写请求时出现异常,即异常来源为校验层2的上层模块下发写请求时出现异常,这种情况下,校验层2可以向上层模块发送异常的错误码,该错误码指示数据写入硬盘时出现错误,且故障来源于校验层2的上层模块。例如故障可能是由于调整/合并层、sio子模块入口、sd子模块、ld子模块以及ckg模块等中的一个或多个模块导致的。

709、若写请求的响应消息中待写数据crc校验成功,则存储阵列确定dif子模块的下层模块在发送写请求时出现异常,并发送下层模块异常的错误码。

如果对悬挂的写请求的响应消息中携带的待写数据进行crc校验成功,就出现了对写请求的响应消息校验成功,对读请求的响应消息执行crc校验失败的情况,这时,数据出错可以认为是该校验层2的下层模块在发送写请求时出现异常,即异常来源为校验层2的下层模块下发写请求时出现异常,这种情况下,校验层2可以向上层模块发送异常的错误码,该错误码指示数据写入硬盘时出现错误,且故障来源于校验层2的下层模块。例如故障可能是由于分发层、驱动接口层或者srs线、硬盘框或者硬盘故障等中的一个或多个模块导致的。

710、存储阵列比对写请求的响应消息中携带的待写数据的dif和从硬盘中读取的数据的dif,而后进入步骤711或者步骤712。

在校验层1执行步骤706,即对读请求的响应消息中携带的从硬盘读取的数据进行crc校验,只能确定读取的数据是否出错,即确定读取的数据部分和校验部分是否匹配,但是不能确定读取的数据是否是发生数据写偏故障的数据。因此,本申请可以在确定读请求的响应消息中携带的数据未出错时,还可以在步骤710中继续校验读请求的响应消息中携带的数据是否是写偏的数据。

在一些实施例中,校验数据是否写偏可以是在本申请的校验层2执行的。这是由于,上述说明中提及到lba校验是在上层的lun模块中执行的,也就是说校验数据是否写偏是需要等到写请求的响应消息达到lun程序时才能校验出来,这样校验数据是否写偏并不及时,对此,在本申请实施例中,在校验层1校验数据未出错的情况下,可以继续在校验层2中校验数据是否写偏,使得数据是否写偏能够被及时检测出来,以便及时进行数据修正。因此,在本申请实施例中,该校验层2至少具有如下功能:1)根据写请求的响应生成读请求;2)对写请求的响应消息进行校验;3)校验数据是否写偏。

711、若写请求的响应消息中携带的待写数据的dif和从硬盘中读取的数据的dif不一致,则确定将待写数据写入硬盘时发生写偏移。

如图9所示,示例性的,当写请求携带的数据为数据a,数据a的物理地址为地址100,如果发生了写偏移,数据a被写入了地址200中,但是写请求的响应消息携带的物理地址依然为地址100,携带的数据为数据a,根据写请求的响应消息生成的读请求携带的物理地址为地址100,读请求的响应消息中携带的数据为物理地址100对应的数据b,即从硬盘中读取的数据为数据b,那么写请求的响应消息中携带的数据a的dif1和从硬盘中读取的数据b的dif2就不一致,确定将待写数据a写入硬盘时发生写偏移,且写偏移的故障由校验层2的下层模块导致。校验层2可以向上层模块发送错误码,该错误码指示发生了数据写偏移,且异常范围为校验层2的下层模块。

712、若写请求的响应消息中携带的待写数据的dif和从硬盘中读取的数据的dif一致,则确定将待写数据写入硬盘时未发生写偏移。

依旧参考图9,示例性的,当写请求的响应消息中携带的待写数据为数据a,数据a原本要写入硬盘的地址为100,数据a实际被写入地址100,从硬盘中读取的数据,即读请求的响应消息中携带的数据是地址100中的数据,写请求的响应消息中携带的数据的dif和从硬盘中读取的数据的dif均为数据a的dif1,这时,确定将待写数据写入硬盘时未发生写偏移。

此外,在上述步骤709和步骤711中,在校验完数据是否发生写偏移后,可以解除悬挂的写请求的响应消息,当写请求的响应消息返回至ld子模块时,如果ld子模块也接收到了下层模块导致数据异常的错误码,那么ld子模块可以切换控制器访问路径,例如由控制器1的访问路径切换到控制器2的访问路径,而后将写请求的响应消息发送给控制器2,由于写请求的响应消息中依然携带有待写数据和地址,当控制器2接收到写请求的响应消息时,可以根据写请求的响应消息再次向下层模块下发写请求,写请求为重试的写请求,携带有写请求的响应消息中的地址,当校验层2接收到重试的写请求时,按照采样的写请求的流程执行步骤702-712。

如果重试的写请求在被执行步骤702-712时,同样被判定为由下层模块导致数据异常,由于两个控制器路径都访问相同的硬盘,那么可以综合判定数据异常是由硬盘故障导致的。可以触发硬盘的修复流程,并隔离该硬盘。如果重试的写请求在被执行步骤702-712时,没有发生数据异常,或者发生数据异常的范围为上层模块导致的,那么可以判定数据异常为控制器1路径上的故障导致,可以触发控制器1路径的修复流程,并隔离控制器1路径。

由于,本申请实施例中,不仅不依赖硬盘的pi校验功能,可支持无pi功能的硬盘外,还可以及时检测出数据写偏移的错误,不需要等到lun模块才检测出来数据写偏,使得数据写偏移被及时发现。况且,本申请实施例的数据校验流程,不区分数据格式,对混合数据格式的业务场景也有效。

可以理解的是,为了实现上述功能,存储阵列包含了执行各个功能相应的硬件和/或软件模块。结合本文中所公开的实施例描述的各示例的算法步骤,本申请能够以硬件或硬件和计算机软件的结合形式来实现。某个功能究竟以硬件还是计算机软件驱动硬件的方式来执行,取决于技术方案的特定应用和设计约束条件。本领域技术人员可以结合实施例对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。

本实施例可以根据上述方法示例对电子设备进行功能模块的划分,例如,可以对应各个功能划分各个功能模块,也可以将两个或两个以上的功能集成在一个处理模块中。上述集成的模块可以采用硬件的形式实现。需要说明的是,本实施例中对模块的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。

在采用对应各个功能划分各个功能模块的情况下,图10示出了上述实施例中涉及的存储阵列100的一种可能的组成示意图,如图10所示,该存储阵列100可以包括:写操作单元1001、响应单元1002、读操作单元1003以及校验单元1004。

其中,写操作单元1001可以用于支持存储阵列100执行上述步骤601,步骤702,和/或用于本文所描述的技术的其他过程;响应单元1002可以用于支持存储阵列100执行上述步骤602、步骤604,步骤703,步骤705,和/或用于本文所描述的技术的其他过程;读操作单元1003可以用于支持存储阵列100执行上述步骤603,步骤704,和/或用于本文所描述的技术的其他过程;校验单元1004可以用于支持存储阵列100执行上述步骤605,步骤706,步骤707,步骤710,步骤711以及步骤712,和/或用于本文所描述的技术的其他过程。

在一些实施例中,还可以包括采样单元1005,用于支持存储阵列100执行上述步骤701,和/或用于本文所描述的技术的其他过程;还可以包括异常反馈单元1006,用于支持存储阵列100执行上述步骤708,步骤709,和/或用于本文所描述的技术的其他过程。

需要说明的是,上述方法实施例涉及的各步骤的所有相关内容均可以援引到对应功能模块的功能描述,在此不再赘述。

本实施例提供的存储阵列100,用于执行上述数据校验方法,因此可以达到与上述实现方法相同的效果。

在采用集成的单元的情况下,存储阵列可以包括处理模块、存储模块和通信模块。其中,处理模块可以用于对存储阵列的动作进行控制管理,例如,可以用于支持存储阵列执行上述写操作单元1001、响应单元1002、读操作单元1003、校验单元1004、采样单元1005以及异常反馈单元1006执行的步骤。存储模块可以用于支持存储阵列存储程序代码和数据等。通信模块,可以用于支持存储阵列与其他设备的通信,例如与服务器的通信。

其中,处理模块可以是处理器或控制器。其可以实现或执行结合本申请公开内容所描述的各种示例性的逻辑方框,模块和电路。处理器也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,数字信号处理(digitalsignalprocessing,dsp)和微处理器的组合等等。存储模块可以是一个或多个存储器,以及多个硬盘。通信模块具体可以为收发器、射频电路、蓝牙芯片、wi-fi芯片等与其他电子设备交互的设备。

在一个实施例中,当处理模块为控制器,存储模块为存储器以及硬盘时,本实施例所涉及的存储阵列可以为具有图11所示结构的存储阵列110。

本申请实施例还提供一种存储阵列,包括一个或多个控制器、一个或多个存储器以及多个硬盘。该一个或多个存储器、多个硬盘与一个或多个控制器耦合,一个或多个存储器用于存储存储阵列的计算机程序代码,计算机程序代码包括计算机指令,当一个或多个控制器执行计算机指令时,使得存储阵列执行上述相关方法步骤实现上述实施例中的数据校验方法。

本申请的实施例还提供一种计算机存储介质,该计算机存储介质中存储有计算机指令,当该计算机指令在电子设备上运行时,使得存储阵列执行上述相关方法步骤实现上述实施例中的数据校验方法。

本申请的实施例还提供了一种计算机程序产品,当该计算机程序产品在计算机上运行时,使得计算机执行上述相关步骤,以实现上述实施例中存储阵列执行的数据校验方法。

另外,本申请的实施例还提供一种装置,这个装置具体可以是芯片,组件或模块,该装置可包括相连的控制器和存储器;其中,存储器用于存储计算机执行指令,当装置运行时,控制器可执行存储器存储的计算机执行指令,以使芯片执行上述各方法实施例中存储阵列执行的数据校验方法。

其中,本实施例提供的存储阵列、计算机存储介质、计算机程序产品或芯片均用于执行上文所提供的对应的方法,因此,其所能达到的有益效果可参考上文所提供的对应的方法中的有益效果,此处不再赘述。

通过以上实施方式的描述,所属领域的技术人员可以了解到,为描述的方便和简洁,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。

在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个装置,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是一个物理单元或多个物理单元,即可以位于一个地方,或者也可以分布到多个不同地方。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

以上所述,仅为本申请具体实施方式,但本申请的保护范围并不局限于此,任何在本发明揭露的技术范围内的变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1