CN107908499A - 一种数据校验方法及装置 - Google Patents
一种数据校验方法及装置 Download PDFInfo
- Publication number
- CN107908499A CN107908499A CN201711065721.0A CN201711065721A CN107908499A CN 107908499 A CN107908499 A CN 107908499A CN 201711065721 A CN201711065721 A CN 201711065721A CN 107908499 A CN107908499 A CN 107908499A
- Authority
- CN
- China
- Prior art keywords
- band
- crc value
- edition number
- data
- edition
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
- G06F11/08—Error detection or correction by redundancy in data representation, e.g. by using checking codes
- G06F11/10—Adding special bits or symbols to the coded information, e.g. parity check, casting out 9's or 11's
- G06F11/1004—Adding special bits or symbols to the coded information, e.g. parity check, casting out 9's or 11's to protect a block of data words, e.g. CRC or checksum
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请提供一种数据校验方法及装置,涉及存储技术领域,能够对存储在硬盘上且无需重新写入的条带进行校验。包括:客户端模块接收CA发送的N个数据条带、CA计算的每个数据条带的CRC值以及第一版本号;计算每个数据条带的CRC值,比较客户端模块计算的CRC值与CA计算的CRC值;当客户端模块计算的每个数据条带的CRC值均与CA计算的CRC值相同时,根据N个数据条带计算M个校验条带,并计算每个校验条带的CRC值;计算分条的CRC值;将N+M个条带的CRC值分别填入N+M个第一版本号,并将分条的CRC值填入每个第一版本号,得到N+M个第二版本号;将每个第二版本号和每个需要写入硬盘的条带发送给对应的存储节点。
Description
技术领域
本申请涉及存储技术领域,尤其涉及一种数据校验方法及装置。
背景技术
在存储技术领域中,为了提高数据的安全性,一般会采用纠删码(ErasureCoding,EC)冗余方式对数据进行存储。即将从协议服务器接收到的数据进行划分,得到N个数据条带,并通过EC冗余计算得到N个数据条带的M个校验条带,然后将该N个数据条带和M个校验条带分别存储在不同的存储节点中。其中,M个校验条带用于在该N个数据条带中的部分(不超过M个)数据条带损坏或丢失时,利用剩余的数据分别重构出该被损坏或者丢失的数据条带。
由于在将数据写入硬盘的过程中,需要跨越多个模块。例如,存储节点的客户端代理(ClientAgent,CA)在得到待存储数据的N个数据条带之后,经过对象服务(ObjectService,OBS)客户端、OBS服务器以及不只是文件系统(NotOnlyFileSystem,NOFS)等模块的传输之后,写入对应的硬盘上。那么,为了避免存储了错误的条带,需要校验条带在模块与模块之间的一致性。传统的校验方式为为每个条带计算一个循环冗余码校验(Cyclic RedundancyCheck,CRC)值。当一个模块接收到一个条带和该条带的CRC值后,该模块采用相同的算法也计算一个CRC值,并比较计算的CRC值和接收到的CRC值是否相同,来对该条带进行一致性校验。若相同,则说明该模块接收到的条带是正确的,那么该模块可继续执行写入操作。否则,拒绝继续传输该条带,并报错。
然而,传统的校验方式仅针对有条带需要传输的情况,仅能对传输过程中的条带进行校验。针对已经存储在硬盘上条带则无法适用。例如,对于已经存储在硬盘中的数据,当该数据的部分条带被修改后,则需要对修改后的条带进行重新写入,而无需重新写入未被修改的条带。那么,按照传统的校验方式,仅能对被修改的数据条带进行一致性校验,确保正确存储该被修改的数据条带。而对于这些未被修改的已经存储在硬盘上数据条带,则无法进行校验。
发明内容
本申请提供一种数据校验方法及装置,能够对已经存储在硬盘上条带进行校验。
第一方面,本申请提供一种数据校验方法,该方法包括:第一存储节点的客户端模块接收该第一存储节点的客户端代理CA发送的N个数据条带、该CA计算的每个数据条带的循环冗余码校验CRC值,以及该CA生成的该N个数据条带的第一版本号,N为大于或者等于2的自然数;该客户端模块计算每个数据条带的CRC值,并比较该客户端模块计算的CRC值与该CA计算的CRC值;当该客户端模块计算的每个数据条带的CRC值均与该CA计算的CRC值相同时,该客户端模块根据该N个数据条带计算M个校验条带,并计算每个校验条带的CRC值,M为大于或者等于2的自然数;该客户端模块计算分条的CRC值,该分条包括该N个数据条带和该M个校验条带,该分条的CRC值用于对该分条进行校验;该客户端模块根据预设规则将该分条中的N+M个条带的CRC值分别填入N+M个该第一版本号中,并将该分条的CRC值填入该N+M个该第一版本号中的每个该第一版本号中,得到N+M个条带的第二版本号;该客户端模块将该N+M个条带的第二版本号中每个第二版本号和该N+M个条带中需要写入硬盘的每个条带发送给分布式存储系统中对应的存储节点。
采用本申请提供的数据校验方法,通过在条带的第二版本号中填入该条带的CRC值,以使得该条带的CRC值能够随着该条带的第二版本号写入对应的硬盘,从而使得该条带拥有持久性的CRC值。那么,对于已经存储在硬盘上的条带,当需要对该条带进行校验时,可以使用该第二版本号中记录的该条带的CRC值,对该条带进行校验,以确定该条带是否仍然正确。实现了对已经存储的条带的校验。
可选的,当该N+M个条带中的第一条带和该第一条带的第二版本号对应的存储节点为该第一存储节点,且当与第一条带对应的硬盘中已经存储了该第一条带时,该方法还包括:当该第一存储节点的服务器模块接收到该第一条带的第二版本号且未接收到该第一条带时,该服务器模块将该第一条带的第二版本号发送给该第一存储节点的硬盘管理模块;该硬盘管理模块从存储了该第一条带的硬盘中读取该第一条带,并计算该第一条带的CRC值;该硬盘管理模块比较该硬盘管理模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值;当该硬盘管理模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值相同时,该硬盘管理模块根据接收到的第一条带的第二版本将已经存储在硬盘中的第一条带的第二版本号更新。
采用该可选方式,第二存储节点能够根据接收到第二版本号中记录的第一条带的CRC值,对存储在硬盘上的该第一条带进行校验。即当第一条带所属分条中的部分条带被修改,而该第一条带未被修改时,该第一条带的第二版本号会被更新,而该第一条带不需要重新写入硬盘。那么第一存储节点接收到新的第二版本号时,即可读取存储在硬盘中的第一条带,然后利用接收到的新的第二版本号中记录的第一条带的CRC值,对第一条带进行校验,以确定存储在硬盘中的第一条带是否仍然正确。实现了在版本号被更新的情况下,对已经存储在硬盘中的第一条带的校验。
可选的,当该N+M个条带中的第一条带和第一条带的第二版本号对应的存储节点为第一存储节点时,该方法还包括:当该服务器模块接收到该第一条带的第二版本号和该第一条带时,该服务器模块计算该第一条带的CRC值,并比较该服务器模块计算的该第一条带的CRC值与该第一条带的第二版本号中记录的该第一条带的CRC值;当该服务器模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值相同时,该服务器模块将该第一条带的第二版本号和该第一条带发送给该硬盘管理模块;该硬盘管理模块计算该第一条带的CRC值,并比较该硬盘管理模块计算的该第一条带的CRC值与该第一条带的第二版本号中记录的该第一条带的CRC值;当该硬盘管理模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值相同时,该硬盘管理模块将该第一条带的第二版本号和该第一条带写入对应的硬盘中。
采用该可选方式,在写数据过程中的各个阶段,第一存储节点的各个模块能够根据接收到的第一条带的第二版本号中记录的该第一条带的CRC值,对第一条带进行校验,无需各个模块在发送第一条带和版本号时,还单独发送第一条带的CRC值。
可选的,该方法还包括:该客户端模块接收到该CA发送的数据读取请求消息后,向多个存储节点发送该数据读取请求消息,该数据读取请求消息用于请求读取该分条中的条带,该多个存储节点为存储该N+M个条带和该N+M个条带的第二版本号的存储节点;当该客户端模块接收到该多个存储节点发送的该N+M个条带以及该N+M个条带的第二版本号时,该客户端模块计算该N+M个条带中每个条带的CRC值,并比较该客户端模块计算的每个条带的CRC值与每个条带的第二版本号中记录的条带的CRC值;当该客户端模块计算每个条带的CRC值均与每个条带的第二版本号中记录的条带的CRC值相同时,该客户端模块计算该分条的CRC值,并比较该分条的CRC值与该N+M个条带中的一个条带的第二版本号中记录的该分条的CRC值;当该客户端计算的该分条的CRC值与该一个条带的第二版本号中记录的该分条的CRC值相同时,该客户端模块将该N个数据条带和每个数据条带的第二版本号发送给该CA。
可选的,该方法还包括:当该客户端模块未接收到该N+M个条带中的J个数据条带和该J个数据条带的第二版本号时,该客户端模块根据接收到的N+M-J个条带重构该J个数据条带,得到重构出的分条,该重构出的分条包括该N+M-J个条带和重构出的该J个数据条带,J为小于等于M的自然数;该客户端模块计算该重构出的分条的CRC值,并比较该重构出的分条的CRC值与该N+M-J个条带中的一个条带的第二版本号中记录的该分条的CRC值;当该重构出的分条的CRC值与该N+M-J个条带中的一个条带的第二版本号中记录的该分条的CRC值相同时,该客户端模块计算该J个数据条带中每个数据条带的CRC值,并生成该J个数据条带的第二版本号;该客户端模块将该重构出的分条中的每个数据条带和每个数据条带的第二版本号发送给该CA。
可选的,该多个存储节点中包括该第一存储节点,该第一存储节点中存储了该N+M个条带中的第一条带和该第一条带的第二版本号;该客户端模块接收该多个存储节点发送的该N+M个条带以及每个条带的第二版本号之前,该方法还包括:该第一存储节点的服务器模块接收到该客户端模块发送的数据读取请求消息后,将该数据读取请求消息发送给该第一存储节点的硬盘管理模块,该数据读取请求消息用于请求读取该第一条带和该第一条带的第二版本号;硬盘管理模块从存储了该第一条带和该第一条带的第二版本号的硬盘中读取该第一条带和该第一条带的第二版本号;该硬盘管理模计算该第一条带的CRC值,并比较该硬盘管理模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值;当该硬盘管理模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值相同时,该硬盘管理模块将该第一条带和该第一条带的第二版本号发送给该服务器模块;该服务器模块计算该第一条带的CRC值,并比较该服务器模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值;当该服务器模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值相同时,该第服务器模块将该条带和该条带的第二版本号发送给该客户端模块。
采用上述三种可选的方式,通过将该第一条带的CRC值记录在第一条带的第二版本号中,使得第一存储节点能够在读数据的各个过程中,能够利用记录在第二版本号中的该第一条带的CRC值,对该第一条带进行校验,实现了在读数据的各个过程中校验第一条带是否正确。
可选的,该方法还包括:该第一存储节点的数据重构模块接收到第二存储节点发送的数据重构请求消息后,向该硬盘管理模块发送该数据重构请求消息,该数据重构请求消息用于请求读取该第一条带和该第一条带的第二版本号;该硬盘管理模块从存储了该第一条带和该第一条带的第二版本号的硬盘中读取该第一条带和该第一条带的第二版本号;该硬盘管理模块计算该第一条带的CRC值,并比较该硬盘管理模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值;当该硬盘管理模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值相同时,该硬盘管理模块将该第一条带和该第一条带的第二版本号发送给该数据重构模块;该数据重构模块计算该第一条带的CRC值,并比较该数据重构模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值;当该数据重构模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值相同时,该数据重构模块将该第一条带和该第一条带的第二版本号发送给该第二存储节点。
可选的,该第一条带为该N个数据条带中的第一数据条带,该方法还包括:该第一存储节点的数据重构模块确定需要重构该第一数据条带时,该数据重构模块向至少一个第二存储节点发送数据重构请求消息,该至少一个第二存储节点为存储了该分条中除该第一数据条带以外其余条带和该其余条带中每个条带的第二版本号的多个存储节点;该数据重构模块接收该至少一个第二存储节点发送的该其余条带和该其余条带中每个条带的第二版本号;该数据重构模块根据该其余条带重构该第一数据条带,并计算重构出的该第一数据条带的CRC值;该数据重构模块计算重构出的分条的CRC值,并比较该重构出的分条的CRC值与该其余条带中的一个条带的第二版本号中记录的该分条的CRC值;当该重构出的分条的CRC值与该一个条带的第二版本号中记录的该分条的CRC值相同时,该数据重构模块确定重构出的该第一数据条带正确。
采用上述两种可选的方式,通过将分条的CRC值和第一条带的CRC值记录在第一条带的第二版本号中。使得第一存储节点能够在重构数据的各个过程中,利用记录在第一条带的第二版本号中的该第一条带的CRC值,对该第一条带进行校验。并利用分条的CRC值对重构的分条进行校验,确定重构出的分条以及重构出的第一条带是否正确。解决了现有技术中无法对重构出的分条以及重构出的第一条带进行校验的问题。
第二方面,本申请提供一种数据校验方法,该方法包括:第二存储节点的服务器模块接收第一存储节点发送的条带的第二版本号,该第二版本号中记录了该条带的循环冗余码校验CRC值;当该服务器模块未接收到该条带时,该服务器模块将该第二版本号发送给该第二存储节点的硬盘管理模块;该硬盘管理模块在接收到该第二版本号之前,与该条带对应的硬盘中已经存储了该条带,该硬盘管理模块接收到该第二版本号之后,从存储了该条带的硬盘中读取该条带,并计算该条带的CRC值;该硬盘管理模块比较该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值;当该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,该硬盘管理模块根据接收到的第二版本号将已经存储在硬盘中的该条带的第二版本号更新。
采用本申请提供的数据校验方法,第二存储节点能够根据接收到第二版本号中记录的条带的CRC值,对存储在硬盘上的该条带进行校验。例如,当该条带所属分条中的部分条带被修改,而该条带未被修改时,该条带的第二版本号会被更新,而该条带则不需要重新写入。第二存储节点接收到新的第二版本号时,即可读取存储在硬盘中的该条带,然后利用接收到的新的第二版本号中记录的该条带的CRC值,对该条带进行校验,以确定该条带是否仍然正确。即采用本申请提供的方法,能够实现在版本号被更新的情况下,对已经存储在硬盘中的条带的校验。
可选的,该方法还包括:当该服务器模块接收到该条带时,该服务器模块计算该条带的CRC值,并比较该服务器模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值;当该服务器模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,该服务器模块将该第二版本号和该条带发送给该硬盘管理模块;该硬盘管理模块计算该条带的CRC值,并比较该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值;当该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,该硬盘管理模块将该条带和该第二版本号写入对应的硬盘中。
采用该可选方式,在写数据过程中的各个阶段,第二存储节点的各个模块能够根据接收到的条带的第二版本号中记录的该条带的CRC值,对该条带进行校验,无需各个模块在发送该条带和版本号时,还单独发送该条带的CRC值。
可选的,该方法还包括:该服务器模块接收到该第一存储节点发送的数据读取请求消息后,将该数据读取请求消息发送给该硬盘管理模块,该数据读取请求消息用于请求读取该条带和该第二版本号;该硬盘管理模块从存储了该条带和该第二版本号的硬盘中读取该条带和该第二版本号,计算该条带的CRC值,并比较该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值;当该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,该硬盘管理模块将该条带和该第二版本号发送给该服务器模块;该服务器模块计算该条带的CRC值,并比较该服务器模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值;当该服务器模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,该服务器模块将该第二版本号和该条带发送给该第一存储节点。
采用上该方式,通过将条带的CRC值记录在该条带的第二版本号中,使得第二存储节点在读数据的各个过程中,能够利用记录在该条带的第二版本号中的该条带的CRC值,对该条带进行校验,实现了在读数据的各个过程中校验该条带是否正确。
可选的,该方法还包括:该第二存储节点的数据重构模块接收到分布式存储系统中的其他存储节点发送的数据重构请求消息后,向该硬盘管理模块发送该数据重构请求消息,该数据重构请求消息用于请求读取该条带和该第二版本号;该硬盘管理模块从存储了该条带和该第二版本号的硬盘中读取该条带和该第二版本号;该硬盘管理模块计算该条带的CRC值,并比较该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值;当该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,该硬盘管理模块将该条带和该第二版本号发送给该数据重构模块;该数据重构模块计算该条带的CRC值,并比较该数据重构模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值;当该数据重构模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,该数据重构模块将该条带和该第二版本号发送给该其他存储节点。
可选的,该条带为第二数据条带,该方法还包括:该第二存储节点的数据重构模块确定需要重构该第二数据条带时,该数据重构模块向多个存储节点发送该数据重构请求消息,该多个存储节点为存储了其余条带和该其余条带中每个条带的第二版本号的存储节点,该其余条带为该第二数据条带所属分条中除该第二数据条带以外的条带;该数据重构模块接收该多个存储节点发送的该其余条带和每个条带的第二版本号;该数据重构模块根据该其余条带重构出该第二数据条带,并计算重构出的分条的CRC值,该重构出的分条包括该其余条带和该第二数据条带;该数据重构模块比较该重构出的分条的CRC值与该其余条带中的一个条带的第二版本号中记录的该分条的CRC值;当该重构出的分条的CRC值与该一个条带的第二版本号中记录的该分条的CRC值相同时,该数据重构模块确定重构出的该第二数据条带正确。
采用上述两种可选的方式,通过将分条的CRC值和条带的CRC值记录在该条带的第二版本号中。使得第二存储节点能够在重构数据的各个过程中,利用记录在该条带的第二版本号中的该条带的CRC值,对该条带进行校验。并利用分条的CRC值对重构的分条进行校验,确定重构出的分条以及重构出的该条带是否正确。解决了现有技术中无法对重构出的分条以及重构出的条带进行校验的问题。
第三方面,本申请提供一种第一存储节点,包括客户端模块、客户端代理CA;该客户端模块用于:接收该CA发送的N个数据条带、该CA计算的每个数据条带的循环冗余码校验CRC值,以及该CA生成的该N个数据条带的第一版本号,N为大于或者等于2的自然数;计算每个数据条带的CRC值,并比较该客户端模块计算的CRC值与该CA计算的CRC值;当该客户端模块计算的每个数据条带的CRC值均与该CA计算的CRC值相同时,根据该N个数据条带计算M个校验条带,并计算每个校验条带的CRC值,M为大于或者等于2的自然数;计算分条的CRC值,该分条包括该N个数据条带和该M个校验条带,该分条的CRC值用于对该分条进行校验;根据预设规则将该分条内的N+M个条带的CRC值分别填入N+M个该第一版本号中,并将该分条的CRC值填入该N+M个该第一版本号中的每个该第一版本号中,得到N+M个条带的第二版本号;将该N+M个条带的第二版本号中每个第二版本号和该N+M个条带中需要写入硬盘的每个条带发送给分布式存储系统中对应的存储节点。
可选的,该N+M个条带中的第一条带和该第一条带的第二版本号对应的存储节点为该第一存储节点,与该第一条带对应的硬盘中已经存储了该第一条带,该第一存储节点还包括服务器模块和硬盘管理模块;该服务器模块用于:当接收到该第一条带的第二版本号且未接收到该第一条带时,将该第一条带的第二版本号发送给该硬盘管理模块;该硬盘管理模块用于:从存储了该第一条带的硬盘中读取该第一条带,并计算该第一条带的CRC值;比较该硬盘管理模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值;当该硬盘管理模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值相同时,根据接收到的第一条带的第二版本将已经存储在硬盘中的第一条带的第二版本号更新。
可选的,该N+M个条带中的第一条带和该第一条带的第二版本号对应的存储节点为该第一存储节点,该第一存储节点还包括服务器模块和硬盘管理模块;该服务器模块还用于:当接收到该第一条带的第二版本号和该第一条带时,计算该第一条带的CRC值,并比较该服务器模块计算的该第一条带的CRC值与该第一条带的第二版本号中记录的该第一条带的CRC值;当该服务器模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值相同时,将该第一条带的第二版本号和该第一条带发送给该硬盘管理模块;该硬盘管理模块还用于:计算该第一条带的CRC值,并比较该硬盘管理模块计算的该第一条带的CRC值与该第一条带的第二版本号中记录的该第一条带的CRC值;当该硬盘管理模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值相同时,将该第一条带的第二版本号和该第一条带写入对应的硬盘中。
可选的,该客户端模块还用于:接收到该CA发送的数据读取请求消息后,向多个存储节点发送该数据读取请求消息,该数据读取请求消息用于请求读取该分条中的条带,该多个存储节点为存储该N+M个条带和该N+M个条带的第二版本号的存储节点;当该客户端模块接收到该多个存储节点发送的该N+M个条带以及该N+M个条带的第二版本号时,计算该N+M个条带中每个条带的CRC值,并比较该客户端模块计算的每个条带的CRC值与每个条带的第二版本号中记录的条带的CRC值;当该客户端模块计算每个条带的CRC值均与每个条带的第二版本号中记录的条带的CRC值相同时,计算该分条的CRC值,并比较该分条的CRC值与该N+M个条带中的一个条带的第二版本号中记录的该分条的CRC值;当该客户端计算的该分条的CRC值与该一个条带的第二版本号中记录的该分条的CRC值相同时,将该N个数据条带和每个数据条带的第二版本号发送给该CA;该CA用于:计算每个数据条带的CRC值,并比较该CA计算的每个数据条带的CRC值与每个数据条带的第二版本号中记录的条带的CRC值是否相同。
可选的,该客户端模块还用于:当未接收到该N+M个条带中的J个数据条带和该J个数据条带的第二版本号时,根据接收到的N+M-J个条带重构该J个数据条带,得到重构出的分条,该重构出的分条包括该N+M-J个条带和重构出的该J个数据条带,J为小于等于M的自然数;计算该重构出的分条的CRC值,并比较该重构出的分条的CRC值与该N+M-J个条带中的一个条带的第二版本号中记录的该分条的CRC值;当该重构出的分条的CRC值与该N+M-J个条带中的一个条带的第二版本号中记录的该分条的CRC值相同时,计算该J个数据条带中每个数据条带的CRC值,并生成该J个数据条带的第二版本号;将该重构出的分条中的每个数据条带和每个数据条带的第二版本号发送给该CA;该CA还用于:计算每个数据条带的CRC值,并比较该CA计算的每个数据条带的CRC值与每个数据条带的第二版本号中记录的条带的CRC值是否相同。
可选的,该多个存储节点中包括该第一存储节点,该第一存储节点中存储了该N+M个条带中的第一条带和该第一条带的第二版本号;该服务器模块还用于:在该客户端模块接收该多个存储节点发送的该N+M个条带以及每个条带的第二版本号之前,接收到该客户端模块发送的数据读取请求消息后,将该数据读取请求消息发送给该硬盘管理模块,该数据读取请求消息用于请求读取该第一条带和该第一条带的第二版本号;该硬盘管理模块还用于:从存储了该第一条带和该第一条带的第二版本号的硬盘中读取该第一条带和该第一条带的第二版本号;计算该第一条带的CRC值,并比较该硬盘管理模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值;当该硬盘管理模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值相同时,将该第一条带和该第一条带的第二版本号发送给该服务器模块;该服务器模块还用于:计算该第一条带的CRC值,并比较该服务器模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值;当该服务器模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值相同时,将该条带和该条带的第二版本号发送给该客户端模块。
可选的,该第一存储节点还包括数据重构模块;该数据重构模块用于:接收到第二存储节点发送的数据重构请求消息后,向该硬盘管理模块发送该数据重构请求消息,该数据重构请求消息用于请求读取该第一条带和该第一条带的第二版本号;该硬盘管理模块还用于:从存储了该第一条带和该第一条带的第二版本号的硬盘中读取该第一条带和该第一条带的第二版本号;计算该第一条带的CRC值,并比较该硬盘管理模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值;当该硬盘管理模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值相同时,将该第一条带和该第一条带的第二版本号发送给该数据重构模块;该数据重构模块还用于:计算该第一条带的CRC值,并比较该数据重构模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值;当该数据重构模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值相同时,将该第一条带和该第一条带的第二版本号发送给该第二存储节点。
可选的,该第一条带为该N个数据条带中的第一数据条带,该第一存储节点还包括数据重构模块;该数据重构模块用于:在确定需要重构该第一数据条带时,向至少一个第二存储节点发送数据重构请求消息,该至少一个第二存储节点为存储了该分条中除该第一数据条带以外其余条带和该其余条带中每个条带的第二版本号的多个存储节点;接收该至少一个第二存储节点发送的该其余条带和该其余条带中每个条带的第二版本号;根据该其余条带重构该第一数据条带,并计算重构出的该第一数据条带的CRC值;计算重构出的分条的CRC值,并比较该重构出的分条的CRC值与该其余条带中的一个条带的第二版本号中记录的该分条的CRC值;当该重构出的分条的CRC值与该一个条带的第二版本号中记录的该分条的CRC值相同时,确定重构出的该第一数据条带正确。
本申请提供的第一存储节点的技术效果可以参见上述第一方面或第一方面的各个实现方式的技术效果,此处不再赘述。
第四方面,本申请提供一种第二存储节点,包括服务器模块和硬盘管理模块;该服务器模块用于:接收第一存储节点发送的条带的第二版本号,该第二版本号中记录了该条带的循环冗余码校验CRC值;当未接收到该条带时,将该第二版本号发送给该第二存储节点的硬盘管理模块;该硬盘管理模块用于:在接收到所述第二版本号之后,从存储了该条带的硬盘中读取该条带,并计算该条带的CRC值,其中,该硬盘管理模块在接收到该第二版本号之前,与该条带对应的硬盘中已经存储了该条带;该硬盘管理模块还用于:比较该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值;当该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,根据接收到的该第二版本号将已经存储在硬盘中的该条带的第二版本号更新。
可选的,该服务器模块还用于:当接收到该条带时,计算该条带的CRC值,并比较该服务器模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值;当该服务器模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,将该第二版本号和该条带发送给该硬盘管理模块;该硬盘管理模块还用于:计算该条带的CRC值,并比较该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值;当该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,将该条带和该第二版本号写入对应的硬盘中。
可选的,该服务器模块还用于:在接收到该第一存储节点发送的数据读取请求消息后,将该数据读取请求消息发送给该硬盘管理模块,该数据读取请求消息用于请求读取该条带和该第二版本号;该硬盘管理模块还用于:从存储了该条带和该第二版本号的硬盘中读取该条带和该第二版本号,计算该条带的CRC值,并比较该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值;当该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,将该条带和该第二版本号发送给该服务器模块;该服务器模块还用于:计算该条带的CRC值,并比较该服务器模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值;当该服务器模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,将该第二版本号和该条带发送给该第一存储节点。
可选的,该第二存储节点还包括数据重构模块;该数据重构模块用于,在接收到分布式存储系统中的其他存储节点发送的数据重构请求消息后,向该硬盘管理模块发送该数据重构请求消息,该数据重构请求消息用于请求读取该条带和该第二版本号;该硬盘管理模块还用于:从存储了该条带和该第二版本号的硬盘中读取该条带和该第二版本号;该硬盘管理模块计算该条带的CRC值,并比较该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值;当该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,将该条带和该第二版本号发送给该数据重构模块;该数据重构模块还用于:计算该条带的CRC值,并比较该数据重构模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值;当该数据重构模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,将该条带和该第二版本号发送给该其他存储节点。
可选的,该条带为第二数据条带,该第二存储节点还包括数据重构模块;该数据重构模块用于:在确定需要重构该第二数据条带时,向多个存储节点发送该数据重构请求消息,该多个存储节点为存储了其余条带和该其余条带中每个条带的第二版本号的存储节点,该其余条带为该第二数据条带所属分条中除该第二数据条带以外的条带;接收该多个存储节点发送的该其余条带和每个条带的第二版本号;根据该其余条带重构出该第二数据条带,并计算重构出的分条的CRC值,该重构出的分条包括该其余条带和该第二数据条带;比较该重构出的分条的CRC值与该其余条带中的一个条带的第二版本号中记录的该分条的CRC值;当该重构出的分条的CRC值与该一个条带的第二版本号中记录的该分条的CRC值相同时,确定重构出的该第二数据条带正确。
本申请提供的第二存储节点的技术效果可以参见上述第一方面或第一方面的各个实现方式的技术效果,此处不再赘述。
第五方面,本申请提供了一种存储节点,包括处理器、存储器、通信接口以及总线;该存储器,用于存储计算机执行指令,该存储器包括多个硬盘;该通信接口收发条带、第一版本号、第二版本号;该处理器,通过该总线与该存储器和通信接口连接,当存储节点运行时,该处理器执行该存储器中存储的计算机执行指令,以实现第一方面中第一存储节点所涉及的数据校验方法或者第二方面中第二存储节点所涉及的数据校验方法。
第六方面,本申请还提供一种计算机存储介质,所述计算机存储介质中存储有指令,当其在计算机上运行时,使得计算机执行上述第一方面、第一方面的任意可选方式、第二方面或第二方面的任意可选方式所述的方法。
第七方面,本申请还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述第一方面、第一方面的任意可选方式、第二方面或第二方面的任意可选方式所述的方法。
附图说明
图1为本申请提供的一种分布式存储系统的示意图;
图2为本申请提供的一种存储节点的结构示意图;
图3为本申请提供的一种数据校验方法的一个实施例的流程图一;
图4为本申请提供的一种数据校验方法的一个实施例的流程图二;
图5为本申请提供的一种数据校验方法的一个实施例的流程图三;
图6为本申请提供的一种数据校验方法的一个实施例的流程图四;
图7为本申请提供的一种数据校验方法的一个实施例的流程图五;
图8为本申请提供的一种数据校验方法的一个实施例的流程图六;
图9为本申请提供的一种存储节点的硬件结构示意图。
具体实施方式
首先,本文中术语“系统”和“网络”在本文中常被可互换使用。本文中术语“和”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。当本申请提及“第一”、“第二”、“第三”或者“第四”等序数词时,除非根据上下文其确实表达顺序之意,否则应当理解为仅仅是起区分之用。
本申请提供的数据校验方法,可以应用于分布式存储系统中。如图1所示,为本申请提供的一种分布式存储系统,可以包括多个存储节点。该多个存储节点中的任意一个存储节点从协议层服务器接收到数据后,都可以将该数据划分为N个数据条带,并生成该N个数据条带的M个校验条带,然后将该N个数据条带和M个校验条带分别存储在至少两个存储节点中。
如图2所示,为本申请提供的一种存储节点的功能模块示意图,包括CA20、客户端模块21、服务器模块22、硬盘管理模块23、数据重构模块24以及硬盘25。其中,客户端模块可以是OBS客户、服务器模块可以是OBS服务、硬盘管理模块可以是NOFS或者NV。
需要说明的是,一个存储节点可以为一个存储服务器,该存储节点中的CA、客户端模块、服务器模块、硬盘管理模块以及数据重构模块可以是该存储服务器内的不同的进程,该存储节点中的多个硬盘可以内置在该存储服务器中,也可以外置在该存储服务器外,与该存储服务器连接。
在介绍本申请提供的数据校验方法之前,首先对本申请中即将提及的第一存储节点、第二存储节点的概念,以及写数据的流程进行介绍。
在本申请中第一存储节点是针对每一个需要写入硬盘的数据来说的。例如,协议层服务器将待存储的数据发送给该分布式存储系统中的一个存储节点,通过该存储节点写入分布式存储系统中。那么对于该待存储的数据来说,该存储节点可以称为第一存储节点,其余的存储节点均可以称为第二存储节点。
写数据的过程就是将待存储的数据划分为条带,然后写入硬盘(也可以称为下盘)中的过程,写数据的过程可以分为将新数据下盘的过程,和将已经存储硬盘中数据经过修改后重新下盘的过程。
第一存储节点的CA接收到待存储的数据后,无论该数据是新数据还是更新的数据,CA都会为该数据生成一个版本号,该版本号会随着该数据的每一个条带(包括数据条带和校验条带)一起写入对应的硬盘。也就是说,即使是同一数据,在修改前和修改后的版本号不相同。例如数据1,数据1在第一次下盘时,CA为数据1生成一个版本号。当数据1中的部分内容被修改,且需要重新下盘时,CA会为修改后的数据1生成重新生成一个版本号。
CA将该数据分为N个数据条带,然后将该N个数据条带和生成的版本号发送给第一存储节点的客户端模块,客户端模块生成该N个数据条带的M个校验条带。以该N个数据条带和M个校验条带分部存储在N+M个存储节点中为例。数据下盘时存在以下两种:
情况一:若该数据是新数据,那么该客户端模块需将N+M个条带和每个条带的版本号一起下盘。即客户端模块将该N+M个条带和每个条带的版本号分别发送给N+M个存储节点的服务器模块。每个服务器模块接收到一个条带和该条带的版本号后,将该条带和该条带的版本号发送给硬盘管理模块。硬盘管理模块将该条带和该条带的版本号写入对应的硬盘中。
情况二:若该数据是更新的数据。那么对于该数据中被修改的条带,客户端模块需将该条带和新的版本号一起重新下盘。即客户端模块将修改后的条带和新的版本号发送给对应存储节点的服务器模块,该服务器模块将该修改后的条带和新的版本号发送给硬盘管理模块,由硬盘管理模块将该修改后的条带和新的版本号写入对应的硬盘中。可以理解的是,硬盘中已经存储了修改前的条带和旧的版本号。硬盘管理模块在将该修改后的条带和新的版本号写入硬盘时,可以用该修改后的条带和新的版本号将硬盘中已经存储的修改前的条带和旧的版本号覆盖。也就是说,硬盘管理模块用修改后的条带和新的版本号将对应硬盘中已经存储的修改前的条带和旧的版本更新。
对于该数据条带中未被修改的条带,该客户端模块只需将该条带的新的版本号重新下盘。即客户端模块只需该新的版本号发送给硬盘管理模块,由硬盘管理模块将该新的版本写入对应的硬盘。可以理解的是,硬盘中已经存储了该条带的旧的版本号,硬盘管理模块在将新的版本号写入硬盘时,可以用该新的版本号将硬盘中已经存储的旧的版本号覆盖。也就是说,硬盘管理模块用新的版本号将对应硬盘中已经存储的旧的版本更新。
基于上述写数据的流程,本申请提供一种方案是在每次生成的版本号中预留预设数量的位(在本申请中可以称为第一版本号),然后在每一个条带的第一版本号中填入该条带的CRC值,得到该条带第二版本号,以使得该条带的CRC值具有持久性。那么,无论是在写数据过程中,还是在后续的读数据过程中,都可以使用第二版本号中记录的该条带的CRC值进行校验。并且,在该条带存储在硬盘中后,也能够利用第二版本号中记录该条带的CRC值校验存储在硬盘中的该条带是否仍然正确。
如图3所示,为本申请提供的一种数据校验方法的一个实施例的流程图,描述了在写数据过程中对各个条带进行校验的过程,该方法可以包括如下步骤:
S301,第一存储节点的客户端模块接收该第一存储节点的CA发送的N个数据条带、该CA计算的每个数据条带的CRC值,以及该CA生成的该N个数据条带的第一版本号,N为大于或者等于2的自然数。
第一存储节点的CA从协议层(例如协议服务器)接收到需要写入分布式存储系统的数据后,先通过分布式锁为该数据生成一个版本号,该版本号用于在该分布式系统中唯一标识该数据。
在本申请中,CA生成的版本号可以称为第一版本号。该第一版本号中除了CA生成的用于唯一标识该数据的版本号外,还预留有预设数量的位。这些预留的位用于记录与该数据对应的分条的CRC值以及该分条中各个条带CRC值。基于版本号中记录的CRC值,可以对分条以及各个条带进行一致性的校验。
其中,第一版本号中预留的位数可以基于分条的CRC值的位数和条带的CRC值的位数设置,保证一个第一版本号中预留的位数能够完整的记录一个分条的CRC值和一个条带的CRC值即可。
示例性的,假设,分条的CRC值为7位,条带的CRC值为8位,第一版本号为64位。那么CA在生成第一版本号时,可以预留至少15位。例如,前49位为CA生成的用于唯一标识待存储数据的版本号,后15位为预留的位。
CA在接收到待存储的数据后,将该数据划分为N个数据条带,并计算每个数据条带的CRC值。然后将给N个数据条带、每个数据条带的CRC值以及第一版本号发送给第一存储节点的客户端模块。
S302,客户端模块计算每个数据条带的CRC值,并比较该客户端模块计算的CRC值与该CA计算的CRC值。
客户端模块在接收到N个数据条带以及每个数据条带的CRC值之后,客户端模块采用与CA计算各个数据条带的CRC值时采用的算法相同的算法,计算每个数据条带的CRC值。然后比较每个数据条带的两个CRC值(即CA计算的CRC值和客户端模块计算的CRC值)是否相同。
以一个数据条带为例,如果CA计算的CRC值和客户端模块计算的CRC值相同(即该数据条带校验成功),说明该数据条带在从CA传输到客户端模块的过程中没有改变,即CA发送的数据条带和客户端模块接收到的数据条带是一致的。如果CA计算的CRC值和客户端模块计算的CRC值不相同(即该数据条带校验失败),说明该数据条带出现错误。
当该N个数据条带中的任一数据条带校验失败,该客户端模块停止执行对N个数据条带的写入操作并报错。当该N个数据条带均校验成功,该客户端模块继续执行S303-S306。
S303,当该客户端模块计算的每个数据条带的CRC值均与该CA计算的CRC值相同时,该客户端模块根据该N个数据条带计算M个校验条带,并计算每个校验条带的CRC值,M为大于或者等于1的自然数。
客户端模块在确定该N个数据条带均校验成功后,客户端模块采用EC算法计算该N个数据条带的M个校验条带,并计算每个校验条带的CRC值。
可以理解的是,该N个数据条带和该M个校验条带组成完整的分条,即当客户端模块得到N个数据条带以及M个校验条带时,该客户端模块即可得到完整的分条。
S304,该客户端模块计算分条的CRC值。
在本申请中,客户端模块在得到完整分条后,还可以计算该分条的CRC值,该分条的CRC值用于该对该分条进行整体校验,以校验该分条是否出错。
S305,该客户端模块根据预设规则将该分条中的N+M个条带的CRC值分别填入N+M个第一版本号中,并将该分条的CRC值填入该N+M个第一版本号中的每个该第一版本号中,得到N+M个条带的第二版本号。
在本申请中,客户端模块为分条中的每个条带分配一个第一版本号,然后按照预设规则对每个条带的第一版本号中预留的位进行赋值,得到记录了该N+M个条带各自的CRC值以及分条CRC值得的N+M个版本号(可以称为第二版本号)。
示例性的,假设一个条带的CRC值共8位,一个分条的CRC值共7位,第一版本号中预留的位是最后15位,那么该预设规则可以为该15位中的前8位填入条带的CRC值,后7位填入分条的CRC值。
也就是说,由于该N+M个条带的CRC值可能不同,因此该N+M个条带的第二版本号也可能不相同。
S306,该客户端模块将该N+M个条带的第二版本号中每个第二版本号和该N+M个条带中需要写入硬盘的每个条带发送给分布式存储系统中对应的存储节点。
其中,每个存储节点的客户端模块都可以访问分布式系统中所有存储节点的服务器模块,因此,第一存储节点的客户端模块可以将各个第二版本号发送给对应的存储节点的服务器模块。客户端模块可以将该N+M个条带中需要写入的条带和该条带的第二版本号同时或者依次发送给该条带和该条带的第二版本号对应的存储节点,将该N+M个条带中不需要写入的条带的第二版本号发送给该条带的第二版本号对应的存储节点。其中,每个条带和该条带的第二版本号存储在同一存储节点中,即每个条带和自己的第二版本号对应的存储节点相同。
在一个示例中,客户端模块可以基于CA发送的信息来确定该N个数据条带中哪些是需要写入的数据条带,哪些可以不用写入。
例如,若CA接收到的待存储的数据是新数据(即目前分布式存储系统中未存储的数据),那么CA可以通过指示信息告知客户端模块,该新数据的N个数据条带为新的数据条带,需要全部写入硬盘中。
若待存储的数据是更新的数据,即该数据目前已经存储在该分布式系统中,但协议层将该数据中的部分内容修改。CA在得到待存储的N个数据条带后,可以通过将该待存储的N个数据条带与缓存在CA中对应的N个数据条带进行比较,以确定待存储的N个数据条带中哪些数据条带被修改。被修改的数据条带为需要写入硬盘的数据条带,没有更新的数据条带则可以无需再次写入硬盘。CA可以通过指示信息告知客户端模块,哪些数据条带需要写入。从而客户端模块可以只将需要写入的数据条带发送给对应的存储节点。
客户端模块可以根据预设的存储规则将该N+M个条带的第二版本号和需要写入硬盘的条带发送给对应的存储节点。例如,该N+M个条带分别对应N+M个第二存储节点,即每个第二存储节点都可以存储一个条带和该条带的第二版本号。或者N+M个条带中的第一条带和第一条带的第二版本号对应的存储节点为第一存储节点,除第一数据条带以外其余的条带分别对应不同的第二存储节点。
在本申请中,每一个接收到第一存储节点的客户端模块发送的条带的第二版本号,或者条带和该条带第二版本号的存储节点,可以继续执行写入操作,以将接收到的条带的第二版本号,或者接收到的条带和该条带的第二版本号写入对应的硬盘中。
示例性的,在上述S306之后,当至少一个第二存储节点接收到第一存储节点发送的条带的第二版本号,或者条带和该条带的第二版本号时,每一个第二存储节点的服务器模块和硬盘管理模块都可以通过执行如下S307-S310或者S311-S314,以将接收到的条带的第二版本号,或者条带和该条带的第二版本号写入对应的硬盘。
S307,当服务器模块接收到条带的第二版本号,但未接收到该条带时,服务器模块将接收到的条带的第二版本号发送给硬盘管理模块。
可以理解的是,若第二存储节点的服务器模块没有接收到条带,只接收到该条带的第二版本号,服务器模块则无需对该条带进行校验,只需将该条带的第二版本号转发给硬盘管理模块即可。
S308,硬盘管理模块从存储了该条带的硬盘中读取该条带,并计算该条带的CRC值,以及比较该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值。
其中,存储了该条带的硬盘为该硬盘管理模块所管理的硬盘之一。
S309,当该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,该硬盘管理模块根据接收到的该第二版本号将已经存储在硬盘中的该条带的第二版本号更新。
示例性的,该第二版本号对应的硬盘和存储了该条带的硬盘可能是同一个硬盘,也可能是不同的硬盘,也就是说,条带和该条带的第二版本号可能存储在同一存储节点内的同一硬盘中,也可能存储在同一存储节点内的不同硬盘中。
需要说明的是,当分条中的部分条带内的数据被修改,那么该分条的CRC值则会产生变化,且第一存储节点的CA也会为修改后的分条重新分配版本号。也就是说,该分条内的每个条带的第二版本号都将被更新。那么,在对该修改后的分条执行写数据操作的过程中,即使部分未被修改的条带无需重新写入,这些未被修改的条带的第二版本号在更新后,仍然需要重新写入对应的硬盘中。
因此,当硬盘管理模块接收到一个条带的第二版本号,但未接收到该条带,说明该条带已经存储在硬盘中且不需要重新写入。那么硬盘管理模块可以根据新接收到的第二版本号中记录的该条带的CRC值对存储在硬盘中的该条带进行校验。即计算出存储在硬盘中的该条带的CRC值,然后与新接收到的第二版本号中记录的该条带的CRC值进行比较。如果存储在硬盘中的该条带的CRC值和该新接收到的第二版本号中记录的CRC值相同,则说明硬盘中存储的该条带是正确的。那么该硬盘管理模块根据接收到的该第二版本号将已经存储在硬盘中的该条带的第二版本号更新。
可以理解的是,硬盘管理模块在新接收到第二版本号之前,该条带的第二版本号所对应的硬盘中已经存储了该条带的第二版本号(可以理解为旧的第二版本号),那么硬盘管理模块可以用新接收到的第二版本号将已经存储的第二版本覆盖,以更新硬盘中存储的该条带的第二版本号。
如果存储在硬盘中的该条带的CRC值和该第二版本号中记录的CRC值不相同,说明存储在硬盘中的条带是错误的,那么硬盘管理模块可以报错,并停止将接收到的该条带的第二版本号写入对应的硬盘。
可选的,基于图3,如图4所示,在上述步骤306之后,该方法还包括:
S310,当服务器模块接收到条带和该条带的第二版本号时,服务器模块计算该条带的CRC值,并比较该服务器模块计算的该条带的CRC值与该条带的第二版本号中记录的该条带的CRC值。
S311当该服务器模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,该服务器模块将该第二版本号和该条带发送给该硬盘管理模块。
可以理解的是,如果服务器模块接收到的条带和该条带的第二版本号,那么服务器模块首先要通过该第二版本号中记录的CRC值对接收到的条带进行验证,如果验证成功,则将该条带和该条带的第二版本号发送给硬盘管理模块,否则该服务器模块不继续执行写入操作,并报错。
S312,该硬盘管理模块计算该条带的CRC值,并比较该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值。
S313,当该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,该硬盘管理模块将该条带和该第二版本号写入对应的硬盘中。
硬盘管理模块在接收到的条带和该条带的第二版本号时,也需要先通过该第二版本号中记录的CRC值对接收到的条带进行验证,如果验证成功,则将该条带和该条带的第二版本号写入对应的硬盘。如果验证失败,该硬盘管理模块则不继续将该条带和该条带的第二版本号写入硬盘,并报错。
需要说明的是,如果该条带是修改后的条带,那么硬盘管理模块在将该条带和该条带的第二版本号写入硬盘时,可以将已经存储在硬盘中的修改前的条带和修改前的条带的第二版本号覆盖,以更新硬盘中存储的条带和第二版本号。
如果该条带是新的条带,那么硬盘管理模块可以直接将该条带和该条带的第二版本号写入对应的硬盘。
可以理解的是,对于与该N+M个条带对应的每一个第二存储节点来说,都可以根据是否接收到相应的条带来确定是执行上述S307-S309,还是执行上述S310-S313。也就是说,根据各个条带是否需要写入的情况,该至少一个第二存储节点中,可能一部分第二存储节点执行S307-S309,另一部分第二存储节点执行S310-S313,也可能是该至少一个第二存储节点都执行S310-S313。
在一个示例中,如果该N+M个条带中的第一条带和该第一条带的第二版本号对应的存储节点为该第一存储节点,那么,基于图4,如图5所示,在上述S306之后,第一存储节点的服务器模块和硬盘管理模块可以执行如下S314-S316,或者执行S317-S320,以将接收到的第一条带的第二版本号,或者接收到的第一条带和第一条带的第二版本号写入对应的硬盘。
S314,当服务器接收到第一条带的第二版本号,但未接收到第一条带时,服务器模块将第一条带的第二版本号发送给硬盘管理模块。
S315,硬盘管理模块从存储了第一条带的硬盘中读取第一条带,并计算第一条带的CRC值,以及比较该硬盘管理模块计算的第一条带的CRC值,与第一条带的第二版本号中记录的第一条带的CRC值。
S316,当该硬盘管理模块计算的第一条带的CRC值,与第一条带的第二版本号中记录的第一条带的CRC值相同时,该硬盘管理模块根据接收到的该第一条带的第二版本将已经存储在硬盘中的该第一条带的第二版本号更新。
S317,当服务器模块接收到第一条带和第一条带的第二版本号时,该服务器模块计算第一条带的CRC值,并比较该服务器模块计算的该第一条带的CRC值与第一条带的第二版本号中记录的第一条带的CRC值。
S318,当服务器模块计算的第一条带的CRC值,与第一条带的第二版本号中记录的该第一条带的CRC值相同时,服务器模块将第一条带的第二版本号和该第一条带发送给硬盘管理模块。
S319,硬盘管理模块计算第一条带的CRC值,并比较该硬盘管理模块计算的第一条带的CRC值与该第一条带的第二版本号中记录的第一条带的CRC值。
S320,当该硬盘管理模块计算的第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值相同时,该硬盘管理模块将该第一条带的第二版本号和该第一条带写入对应的硬盘中。
可以理解的是,如果N+M个条带中存在第一条带与第一存储节点对应,那么第一存储节点也可以根据是否接收到第一条带来选择执行S314-S316,或者执行S317-S320,以将接收到的第一条带的第二版本号,或者接收到的第一条带和第一条带的第二版本号写入第一存储节点中的硬盘中。其中,第一存储节点执行的S314-S316的具体实现方式,与第二存储节点执行的S307-S309的实现方式形同,第一存储节点执行的S317-S320的具体实现方式,与第二存储节点执行的S311-S314的实现方式形同。
那么,基于本申请提供的数据校验方法,通过在条带的第二版本号中填入该条带的CRC值,以使得该条带的CRC值随着该条带的第二版本号写入对应的硬盘。那么,在写数据过程中,对于已经存储在硬盘上,且不需要重新写入的条带,存储节点可以根据该条带更新后的第二版本号中记录的CRC值,对该条带进行校验,以确定该条带是否仍然正确。因此,实现了对已经存储在硬盘上且不需要重新写入条带进行校验。
如图6所示,为本申请提供的一种数据校验方法的另一个实施例的流程图,描述了在读数据的过程中对各个条带以及分条的进行校验的过程,该方法可以包括如下步骤:
S601,CA向客户端模块发送数据读取请求消息。
其中,数据读取请求消息用于请求读取一个分条中的条带,该数据请求消息可以携带CA在执行将该分条中数据条带写入硬盘的过程中,为该分条生成的版本号。也就是说,通过该数据读取请求消息可以请求读取第二版本号中记录了该版本号的条带。
S602,客户端模块向多个存储节点发送数据读取请求消息。
其中,该多个存储节点为存储该分条中的N+M个条带和该N+M个条带的第二版本号的存储节点。该多个存储节点可以包括至少一个第二存储节点,也可以包括至少一个第二存储节点和第一存储节点。
第一存储节点的客户端模块可以通过向每个存储节点的服务器模块发送数据读取请求消息,以请求读取每个存储节点上存储的条带和条带的第二版本号。
示例性的,该至少一个第二存储节点中的每个第二存储节点的服务器模块在接收到数据读取请求消息后,该第二存储节点的服务器模块和硬盘管理模块,可以执行如下S603-S607,以读取该第二存储节点的硬盘中存储的条带和条带的第二版本号。
S603,服务器模块将该数据读取请求消息发送给该硬盘管理模块。
S604,硬盘管理模块从存储了该数据读取请求消息所请求读取的条带和该条带的第二版本号的硬盘中读取该条带和该第二版本号,计算该条带的CRC值,并比较该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值。
S605,当该硬盘管理模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,该硬盘管理模块将该条带和该第二版本号发送给该服务器模块。
在本申请中,硬盘管理模块在每次读出一个条带后,都可以根据该条带的第二版本号中记录的该条带的CRC值对该条带进行校验。在校验成功时,才将读出的条带和该条带的第二版本号发送给服务器模块,以确保硬盘管理模块读出的条带是正确的。如果校验失败,则停止执行读数据操作。
S606,服务器模块计算该条带的CRC值,并比较该服务器模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值。
S607,当该服务器模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值相同时,该服务器模块将该第二版本号和该条带发送给该第一存储节点。
同理,服务器模块在接收到硬盘管理模块读出的条带和条带的第二版本号时,也需要根据该条带的第二版本号中记录的该条带的CRC值对该条带进行校验。在校验成功时,才将读出的条带和该条带的第二版本号发送给第一存储节点的客户端模块,否停止执行读数据操作。
S608,当第一存储节点的客户端模块接收到该多个存储节点发送的N+M个条带以及该N+M个条带的第二版本号时,该客户端模块计算该N+M个条带中每个条带的CRC值,并比较该客户端模块计算的每个条带的CRC值与每个条带的第二版本号中记录的条带的CRC值。
S609,当该客户端模块计算每个条带的CRC值均与每个条带的第二版本号中记录的条带的CRC值相同时,该客户端模块计算分条的CRC值,并比较该分条的CRC值与该N+M个条带中的一个条带的第二版本号中记录的该分条的CRC值。
在本申请中,客户端模块在接收到该多个存储节点读出的N+M个条带时,首先需要对根据各个条带的第二版本号中记录的该条带的CRC值对每个条带进行校验,确定每个条带是否正确。
当每个条带都校验成功时,客户端模块可以根据接收到任意一个条带的第二版本号中记录的分条的CRC值,对接收到的N+M个条带所组成的分条进行校验。
值得说明的是,通过对分条进行校验,能够进一步确定该分条中的各个条带是否正确,从而提高校验的精确度。
S610,当该客户端计算的该分条的CRC值与该一个条带的第二版本号中记录的该分条的CRC值相同时,该客户端模块将该N个数据条带和每个数据条带的第二版本号发送给该CA。
客户端模块在确定每个条带以及分条均校验成功后,即可将该分条中的N个数据条带发送给CA。
S611,该CA计算每个数据条带的CRC值,并比较该CA计算的每个数据条带的CRC值与每个数据条带的第二版本号中记录的条带的CRC值是否相同。
可以理解的是,CA在接收到读取的N个数据条带后,也可以根据每个数据条的第二版本号中记录的条带的CRC值,对每个数据条带进行校验。并在校验成功时,将该N个数据条带组合成为完整的数据,然后发送给协议层。
可选的,各个存储节点在上述S603-S607中,可能某个存储节点的某个模块对数据条带校验失败,那么该存储节点则会停止执行读数据操作,这就会导致第一存储节点的客户端模块接收不到这些校验失败的数据条带。那么,第一存储节点也可以执行如下S612-S615:
S612,当第一存储节点的客户端模块未接收到该N+M个条带中的J个数据条带和该J个数据条带的第二版本号时,客户端模块根据接收到的N+M-J个条带重构该J个数据条带,得到重构出的分条。
其中,重构出的分条包括N+M-J个条带和重构出的J个数据条带,J为小于等于M的自然数。该N+M-J个条带即为该N+M个条带中除该J个未成功读取的数据条带。
S613,客户端模块计算重构出的分条的CRC值,并比较重构出的分条的CRC值与该N+M-J个条带中的一个条带的第二版本号中记录的分条的CRC值。
S614,当该重构出的分条的CRC值与该N+M-J个条带中的一个条带的第二版本号中记录的该分条的CRC值相同时,该客户端模块计算该J个数据条带中每个数据条带的CRC值,并生成该J个数据条带的第二版本号。
在本申请中,客户端模块在重构得到完整的分条后,可以根据N+M-J个条带中的任意一个条带的第二版本号中记录的分条的CRC对重构出的分条进行校验。如果校验成功(即计算的重构出的分条的CRC值与第二版本号中记录的分条的CRC相同),则说明重构出的J个数据条带。即本申请提供的数据校验方法,在数据重构过程中,能够校验重构出的数据条带是否正确。
S615,客户端模块将重构出的分条中的每个数据条带和每个数据条带的第二版本号发送给CA。
可以理解的是,第一存储节点的客户端模块可以根据是否完整的接收到N+M个条带,来选执行上述S608-S610,或者执行S612-S616。
在一个示例中,如果请求读取的分条中的第一条带和第一条带的第二版本号存储在第一存储节点中,那么,基于图6,如图7所示,该第一存储节点的服务器模块接收到该客户端模块发送的数据读取请求消息后,在执行S608-S611,或者在执行612-S615之前,第一存储节点的服务器模块和硬盘管理模块可以执行如下S616-S620,来读取第一条带。
S616,服务器模块将该数据读取请求消息发送给硬盘管理模块。
S617,硬盘管理模块从存储了第一条带和该第一条带的第二版本号的硬盘中读取该第一条带和该第一条带的第二版本号,计算该第一条带的CRC值,并比较该硬盘管理模块计算的该第一条带的CRC值,与该第一条带的第二版本号中记录的该第一条带的CRC值。
S618,当硬盘管理模块计算的第一条带的CRC值,与第一条带的第二版本号中记录的该第一条带的CRC值相同时,该硬盘管理模块将第一条带和第一条带的第二版本号发送给该服务器模块。
S619,服务器模块计算第一条带的CRC值,并比较该服务器模块计算的第一条带的CRC值,与第一条带的第二版本号中记录的第一条带的CRC值。
S620,当服务器模块计算的第一条带的CRC值,与第一条带的第二版本号中记录的第一条带的CRC值相同时,服务器模块将第一条带和第一条带的第二版本号发送给客户端模块。
可以理解的是,第一存储节点的服务器模块和硬盘管理模块读取第一条带的过程,和每一个第二存储节点读取该第二存储节点中存储的条带的过程相同,即上述S603-S607的具体实现过程与上述S616-S620的实现方式相同。
如图8所示,为本申请提供的一种数据校验方法的另一个实施例的流程图,描述了在数据重构过程中对各个条带进行校验的过程。在如图7所示的方法中,以需要重构存储节点1中存储的数据条带1为例进行描述。当存储节点1为第一存储节点时,数据条带1为N+M个条带中的第一数据条带。当存储节点1为存储了该N+M个条带,或者存储了该N+M个条带中除第一数据条带以外其他条带的多个第二存储节点中的一个第二存储节点时,该数据条带1为该N+M个条带中存储在该第二存储节点中的第二数据条带。示例性的,该方法可以包括如下S:
S801,存储节点1的数据重构模块确定需要重构该数据条带1时,该数据重构模块向至少一个其他存储节点发送数据重构请求消息。
其中,该至少一个其他存储节点为存储了分条1中除该数据条带1以外其余条带和该其余条带中每个条带的第二版本号的存储节点。
示例性的,数据重构模块检测到存储了数据条带1的硬盘损坏,那么在该硬盘被修复或者更换后,数据重构模块即可确定需要重构该硬盘上的数据条带1。
该至少一个其他存储节点中的每一个其他存储节点的数据重构模块接收到存储节点1发送的数据重构请求消息后,每一个其他存储的数据重构模块和硬盘管理模块则可以执行如下S802-S807,以读取重构数据条带1所需的其余条带。
S802,数据重构模块接收到数据重构请求消息后,向硬盘管理模块发送该数据重构请求消息。
S803,硬盘管理模块从存储了该数据重构请求消息所请求读取的条带和该条带的第二版本号的硬盘中读取该条带和该第二版本号。
S804,硬盘管理模块计算该条带的CRC值,并比较该硬盘管理模块计算的该条带的CRC值与该条带第二版本号中记录的该条带的CRC值。
S805,当硬盘管理模块计算的该条带的CRC值与该条带的第二版本号中记录的该条带的CRC值相同时,硬盘管理模块将该条带和该第二版本号发送给数据重构模块。
S806,数据重构模块计算该条带的CRC值,并比较该数据重构模块计算的该条带的CRC值与该第二版本号中记录的该条带的CRC值;
S807,当数据重构模块计算的该条带的CRC值与该条带的第二版本号中记录的该条带的CRC值相同时,数据重构模块将该条带和该第二版本号发送给存储节点1。
在本申请中,每一个其他存储节点数据重构模块和硬盘管理模块在读取到一个条带和该条带的第二版本号时,都需要对根据该条带的第二版本号中记录的条带的CRC值对该条带进行验证。只有当验证成功时,才会将读取到的条带发送给存储节点1,以保证存储节点1能够利用正确的条带来重构数据条带1,提高重构出的数据条带1的正确率。
可以理解的是,当存储节点1为第一存储节点时,该至少一个其他存储节点为至少一个第二存储节点。当存储节点1为某个第二存储节点时,该至少一个其他存储节点为分布式系统中除该第二存储节点以外的其他存储节点,可以包括第一存储节点,或者包括第一存储节点和至少一个第二存储节点,或者是包括至少一个第二存储节点。
S808,存储节点1的数据重构模块根据该其余条带重构该数据条带1。
存储节点1的数据重构模块接收该至少一个其他存储节点发送的其余条带和其余条带中每个条带的第二版本号后,即可根据其余条带重构出该数据条带1。
S809,数据重构模块计算重构出的分条的CRC值,并比较该重构出的分条的CRC值与该其余条带中的一个条带的第二版本号中记录的该分条的CRC值。
可以理解的是,当存储节点1的数据重构模块重构出该数据条带1后,即可得到重构出的完整的分。
S810,当该重构出的分条的CRC值与该一个条带的第二版本号中记录的该分条的CRC值相同时,该数据重构模块确定重构出的该数据条带1正确。
在本书申请中,存储节点1的数据重构模块可以根据其余条带中的任意一个条带的第二版本号中记录的分条的CRC对重构出的分条进行校验。如果校验成功(即计算的重构出的分条的CRC值与第二版本号中记录的分条的CRC相同),则说明重构出的数据条带1是正确的。
也就是说,采用本申请提供的数据校验方法,在数据重构过程中,能够校验重构出的数据条带是否正确,以解决现有技术中无法校验重构出的数据条带的问题。
可以理解的是,在确定重构出的数据条带1正确后,数据重构模块还可以计算该数据条带1的CRC值,然后从其余条带中的任意一个条带的第二版本号中获取版本号以及分条的CRC值,然后根据数据条带1的CRC值、分条的CRC值以及版本号生成该数据条带1的第二版本号。进而可以将该数据条带1和数据条带1的第二版本号,通过存储节点1的硬盘管理模块写入对应的硬盘中。
上述主要从各个网元之间交互的角度对本申请提供的方案进行了介绍。可以理解的是,存储节点为了实现上述功能,其包含了执行各个功能相应的硬件结构和/或软件模块。本领域技术人员应该很容易意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,本申请能够以硬件或硬件和计算机软件的结合形式来实现。某个功能究竟以硬件还是计算机软件驱动硬件的方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
如图2所示,本申请还提供一种存储节点,该存储节点包括CA20、客户端模块21、服务器模块22、硬盘管理模块23、数据重构模块24以及硬盘25。存储节点中的各个模块可以基于不同的应用场景进行组合,实现如上述图3-8中所述的各个方法流程。
具体的,当该存储节点作为第一存储节点时,该第一存储节点可以包括客户端模块21、CA20。
所述客户端模块21用于:接收所述CA20发送的N个数据条带、所述CA20计算的每个数据条带的循环冗余码校验CRC值,以及所述CA20生成的所述N个数据条带的第一版本号,N为大于或者等于2的自然数;计算每个数据条带的CRC值,并比较所述客户端模块21计算的CRC值与所述CA20计算的CRC值;当所述客户端模块21计算的每个数据条带的CRC值均与所述CA20计算的CRC值相同时,根据所述N个数据条带计算M个校验条带,并计算每个校验条带的CRC值,M为大于或者等于2的自然数;计算分条的CRC值,所述分条包括所述N个数据条带和所述M个校验条带,所述分条的CRC值用于对所述分条进行校验;根据预设规则将所述分条内的N+M个条带的CRC值分别填入N+M个所述第一版本号中,并将所述分条的CRC值填入所述N+M个所述第一版本号中的每个所述第一版本号中,得到N+M个条带的第二版本号;将所述N+M个条带的第二版本号中每个第二版本号和所述N+M个条带中需要写入硬盘25的每个条带发送给分布式存储系统中对应的存储节点。
可选的,所述N+M个条带中的第一条带和所述第一条带的第二版本号对应的存储节点为所述第一存储节点,与所述第一条带对应的硬盘25中已经存储了所述第一条带,所述第一存储节点还包括服务器模块22和硬盘管理模块23。
所述服务器模块22用于:当接收到所述第一条带的第二版本号且未接收到所述第一条带时,将所述第一条带的第二版本号发送给所述硬盘管理模块23。
所述硬盘管理模块23用于:从存储了所述第一条带的硬盘25中读取所述第一条带,并计算所述第一条带的CRC值;比较所述硬盘管理模块23计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值;当所述硬盘管理模块23计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,根据接收到的所述第一条带的第二版本将已经存储在硬盘25中的所述第一条带的第二版本号更新。
可选的,所述N+M个条带中的第一条带和所述第一条带的第二版本号对应的存储节点为所述第一存储节点,所述第一存储节点还包括服务器模块22和硬盘管理模块23。
所述服务器模块22还用于:当接收到所述第一条带的第二版本号和所述第一条带时,计算所述第一条带的CRC值,并比较所述服务器模块22计算的所述第一条带的CRC值与所述第一条带的第二版本号中记录的所述第一条带的CRC值;当所述服务器模块22计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,将所述第一条带的第二版本号和所述第一条带发送给所述硬盘管理模块23。
所述硬盘管理模块23还用于:计算所述第一条带的CRC值,并比较所述硬盘25管理模块23计算的所述第一条带的CRC值与所述第一条带的第二版本号中记录的所述第一条带的CRC值;当所述硬盘管理模块23计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,将所述第一条带的第二版本号和所述第一条带写入对应的硬盘25中。
可选的,所述客户端模块21还用于:接收到所述CA20发送的数据读取请求消息后,向多个存储节点发送所述数据读取请求消息,所述数据读取请求消息用于请求读取所述分条中的条带,所述多个存储节点为存储所述N+M个条带和所述N+M个条带的第二版本号的存储节点;当所述客户端模块21接收到所述多个存储节点发送的所述N+M个条带以及所述N+M个条带的第二版本号时,计算所述N+M个条带中每个条带的CRC值,并比较所述客户端模块21计算的所述每个条带的CRC值与所述每个条带的第二版本号中记录的条带的CRC值;当所述客户端模块21计算所述每个条带的CRC值均与所述每个条带的第二版本号中记录的条带的CRC值相同时,计算所述分条的CRC值,并比较所述分条的CRC值与所述N+M个条带中的一个条带的第二版本号中记录的所述分条的CRC值;当所述客户端计算的所述分条的CRC值与所述一个条带的第二版本号中记录的所述分条的CRC值相同时,将所述N个数据条带和所述每个数据条带的第二版本号发送给所述CA20。
可选的,所述客户端模块21还用于:当未接收到所述N+M个条带中的J个数据条带和所述J个数据条带的第二版本号时,根据接收到的N+M-J个条带重构所述J个数据条带,得到重构出的分条,所述重构出的分条包括所述N+M-J个条带和重构出的所述J个数据条带,J为小于等于M的自然数;计算所述重构出的分条的CRC值,并比较所述重构出的分条的CRC值与所述N+M-J个条带中的一个条带的第二版本号中记录的所述分条的CRC值;当所述重构出的分条的CRC值与所述N+M-J个条带中的一个条带的第二版本号中记录的所述分条的CRC值相同时,计算所述J个数据条带中每个数据条带的CRC值,并生成所述J个数据条带的第二版本号;将所述重构出的分条中的每个数据条带和所述每个数据条带的第二版本号发送给所述CA20。
可选的,所述多个存储节点中包括所述第一存储节点,所述第一存储节点中存储了所述N+M个条带中的第一条带和所述第一条带的第二版本号。
所述服务器模块22还用于:在接收到所述客户端模块21发送的数据读取请求消息之后,将所述数据读取请求消息发送给所述硬盘管理模块23,所述数据读取请求消息用于请求读取所述第一条带和所述第一条带的第二版本号。
所述硬盘管理模块23还用于:从存储了所述第一条带和所述第一条带的第二版本号的硬盘25中读取所述第一条带和所述第一条带的第二版本号;计算所述第一条带的CRC值,并比较所述硬盘管理模块23计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值;当所述硬盘管理模块23计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,将所述第一条带和所述第一条带的第二版本号发送给所述服务器模块22。
所述服务器模块22还用于:计算所述第一条带的CRC值,并比较所述服务器模块22计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值;当所述服务器模块22计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,将所述条带和所述条带的第二版本号发送给所述客户端模块21。
可选的,所述第一存储节点还可以包括数据重构模块24。
所述数据重构模块24用于:接收到第二存储节点发送的数据重构请求消息后,向所述硬盘25管理模块23发送所述数据重构请求消息,所述数据重构请求消息用于请求读取所述第一条带和所述第一条带的第二版本号。
所述硬盘管理模块23还用于:从存储了所述第一条带和所述第一条带的第二版本号的硬盘25中读取所述第一条带和所述第一条带的第二版本号;计算所述第一条带的CRC值,并比较所述硬盘管理模块23计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值;当所述硬盘管理模块23计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,将所述第一条带和所述第一条带的第二版本号发送给所述数据重构模块24。
所述数据重构模块24还用于:计算所述第一条带的CRC值,并比较所述数据重构模块24计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值;当所述数据重构模块24计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,将所述第一条带和所述第一条带的第二版本号发送给所述第二存储节点。
可选的,所述第一条带为所述N个数据条带中的第一数据条带,所述第一存储节点还包括数据重构模块24。
所述数据重构模块24用于:在确定需要重构所述第一数据条带时,向至少一个第二存储节点发送数据重构请求消息,所述至少一个第二存储节点为存储了所述分条中除所述第一数据条带以外其余条带和所述其余条带中每个条带的第二版本号的多个存储节点;接收所述至少一个第二存储节点发送的所述其余条带和所述其余条带中每个条带的第二版本号;根据所述其余条带重构所述第一数据条带;计算重构出的分条的CRC值,并比较所述重构出的分条的CRC值与所述其余条带中的一个条带的第二版本号中记录的所述分条的CRC值;当所述重构出的分条的CRC值与所述一个条带的第二版本号中记录的所述分条的CRC值相同时,确定重构出的所述第一数据条带正确。
当如图2所示的存储节点作为第二存储节点时,该第二存储节点可以包括服务器模块22、硬盘管理模块23。
所述服务器模块22用于:接收第一存储节点发送的条带的第二版本号,所述第二版本号中记录了所述条带的循环冗余码校验CRC值;当未接收到所述条带时,将所述第二版本号发送给所述第二存储节点的硬盘管理模块23。
所述硬盘管理模块23用于:在接收到所述第二版本号之后,从存储了所述条带的硬盘25中读取所述条带,并计算所述条带的CRC值,其中,所述硬盘管理模块23在接收到所述第二版本号之前,与所述条带对应的硬盘25中已经存储了所述条带。
所述硬盘管理模块23还用于:比较所述硬盘管理模块23计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;当所述硬盘管理模块23计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,根据接收到的所述第二版本号将已经存储在硬盘25中的所述条带的第二版本号更新。
可选的,所述服务器模块22还用于:当接收到所述条带时,计算所述条带的CRC值,并比较所述服务器模块22计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;当所述服务器模块22计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,将所述第二版本号和所述条带发送给所述硬盘管理模块23。
所述硬盘管理模块23还用于:计算所述条带的CRC值,并比较所述硬盘管理模块23计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;当所述硬盘管理模块23计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,将所述条带和所述第二版本号写入对应的硬盘25中。
可选的,所述服务器模块22还用于:在接收到所述第一存储节点发送的数据读取请求消息后,将所述数据读取请求消息发送给所述硬盘管理模块23,所述数据读取请求消息用于请求读取所述条带和所述第二版本号。
所述硬盘管理模块23还用于:从存储了所述条带和所述第二版本号的硬盘25中读取所述条带和所述第二版本号,计算所述条带的CRC值,并比较所述硬盘管理模块23计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;当所述硬盘管理模块23计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,将所述条带和所述第二版本号发送给所述服务器模块22。
所述服务器模块22还用于:计算所述条带的CRC值,并比较所述服务器模块22计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;当所述服务器模块22计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,将所述第二版本号和所述条带发送给所述第一存储节点。
可选的,所述第二存储节点还包括数据重构模块24。
所述数据重构模块24用于,在接收到分布式存储系统中的其他存储节点发送的数据重构请求消息后,向所述硬盘管理模块23发送所述数据重构请求消息,所述数据重构请求消息用于请求读取所述条带和所述第二版本号。
所述硬盘管理模块23还用于:从存储了所述条带和所述第二版本号的硬盘25中读取所述条带和所述第二版本号;所述硬盘管理模块23计算所述条带的CRC值,并比较所述硬盘管理模块23计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;当所述硬盘管理模块23计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,将所述条带和所述第二版本号发送给所述数据重构模块24。
所述数据重构模块24还用于:计算所述条带的CRC值,并比较所述数据重构模块24计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;当所述数据重构模块24计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,将所述条带和所述第二版本号发送给所述其他存储节点。
可选的,所述第二存储节点还包括数据重构模块24。
所述数据重构模块24用于:在确定需要重构所述第二数据条带时,向多个存储节点发送所述数据重构请求消息,所述多个存储节点为存储了其余条带和所述其余条带中每个条带的第二版本号的存储节点,所述其余条带为所述第二数据条带所属分条中除所述第二数据条带以外的条带;接收所述多个存储节点发送的所述其余条带和所述每个条带的第二版本号;根据所述其余条带重构出所述第二数据条带,并计算重构出的分条的CRC值,所述重构出的分条包括所述其余条带和所述第二数据条带;比较所述重构出的分条的CRC值与所述其余条带中的一个条带的第二版本号中记录的所述分条的CRC值;当所述重构出的分条的CRC值与所述一个条带的第二版本号中记录的所述分条的CRC值相同时,确定重构出的所述第二数据条带正确。
采用本申请提供的存储节点,通过在条带的第二版本号中填入该条带的CRC值,以使得该条带的CRC值能够随着该条带的第二版本号写入对应的硬盘,从而使得该条带拥有持久性的CRC值。那么,对于已经存储在硬盘上的条带,当需要对该条带进行校验时,可以使用该第二版本号中记录的该条带的CRC值,对该条带进行校验,以确定该条带是否仍然正确。实现了对已经存储的条带的校验。
如图9所示,为本申请提供的存储节点的另一种可能的结构示意图,包括处理器90、通信接口91、总线92和硬盘93。
其中,处理器90可以是中央处理器(CentralProcessingUnit,CPU),通用处理器,数字信号处理器(DigitalSignalProcessor,DSP),专用集成电路(Application-SpecificIntegratedCircuit,ASIC),现场可编程门阵列(FieldProgrammableGateArray,FPGA)或者其他可编程逻辑器件、晶体管逻辑器件、硬件部件或者其任意组合。其可以实现或执行结合本申请公开内容所描述的各种示例性的逻辑方框,模块和电路。所述处理器90也可以是实现计算功能的组合,例如包含一个或多个微处理器组合,DSP和微处理器的组合等等。
当该存储节点作为第一存储节点时,该处理器90能够用于执行如图3-8中第一存储节点的各个功能模块执行的方法步骤。当该存储节点作为第二存储节点时,该处理器90能够用于执行如图3-8中第二存储节点的各个功能模块所执行的方法步骤。具体的该处理器90所执行的数据校验方法可参见上述如图3-8所示的实施例中的相关描述,此处不再赘述。
通信接口91可以是存储节点的收发器。该处理器90通过该通信接口91与其他设备,例如其他存储节点、协议服务器之间进行数据的收发。
处理器90、通信接口91和硬盘93之间通过总线92相互连接;总线92可以是外设部件互连标准(PeripheralComponentInterconnect,PCI)总线或扩展工业标准结构(Extended IndustryStandardArchitecture,EISA)总线等。所述总线92可以分为地址总线、数据总线、控制总线等。为便于表示,图9中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
采用本申请提供的存储节点,通过在条带的第二版本号中填入该条带的CRC值,以使得该条带的CRC值能够随着该条带的第二版本号写入对应的硬盘,从而使得该条带拥有持久性的CRC值。那么,对于已经存储在硬盘上的条带,当需要对该条带进行校验时,可以使用该第二版本号中记录的该条带的CRC值,对该条带进行校验,以确定该条带是否仍然正确。实现了对已经存储的条带的校验。
在一个示例中,结合本申请公开内容所描述的方法或者算法的步骤可以硬件的方式来实现,也可以是由处理器执行软件指令的方式来实现。软件指令可以由相应的软件模块组成,软件模块可以被存放于随机存取存储器(RandomAccessMemory,RAM)、闪存、只读存储器(ReadOnlyMemory,ROM)、可擦除可编程只读存储器(ErasableProgrammableROM,EPROM)、电可擦可编程只读存储器(ElectricallyEPROM,EEPROM)、寄存器、硬盘、移动硬盘、只读光盘(CD-ROM)或者本领域熟知的任何其它形式的存储介质中。一种示例性的存储介质耦合至处理器,从而使处理器能够从该存储介质读取信息,且可向该存储介质写入信息。当然,存储介质也可以是处理器的组成部分。处理器和存储介质可以位于ASIC中。另外,该ASIC可以位于核心网接口设备中。当然,处理器和存储介质也可以作为分立组件存在于核心网接口设备中。
具体实现中,本申请还提供一种计算机存储介质,其中,该计算机存储介质可存储有程序,该程序执行时可包括本申请提供的数据校验方法的各实施例中的部分或全部步骤。所述的存储介质可为磁碟、光盘、只读存储记忆体(英文:read-onlymemory,简称:ROM)或随机存储记忆体(英文:randomaccessmemory,简称:RAM)等。
本申请还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述本申请提供的数据校验方法的各实施例中的部分或全部步骤。
本领域的技术人员可以清楚地了解到本申请中的技术可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请中的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者VPN网关等)执行本发明各个实施例或者实施例的某些部分所述的方法。
本说明书中各个实施例之间相同相似的部分互相参见即可。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例中的说明即可。
以上所述的本发明实施方式并不构成对本发明保护范围的限定。
Claims (26)
1.一种数据校验方法,其特征在于,所述方法包括:
第一存储节点的客户端模块接收所述第一存储节点的客户端代理CA发送的N个数据条带、所述CA计算的每个数据条带的循环冗余码校验CRC值,以及所述CA生成的所述N个数据条带的第一版本号,N为大于或者等于2的自然数;
所述客户端模块计算每个数据条带的CRC值,并比较所述客户端模块计算的CRC值与所述CA计算的CRC值;
当所述客户端模块计算的每个数据条带的CRC值均与所述CA计算的CRC值相同时,所述客户端模块根据所述N个数据条带计算M个校验条带,并计算每个校验条带的CRC值,M为大于或者等于2的自然数;
所述客户端模块计算分条的CRC值,所述分条包括所述N个数据条带和所述M个校验条带,所述分条的CRC值用于对所述分条进行校验;
所述客户端模块根据预设规则将所述分条中的N+M个条带的CRC值分别填入N+M个所述第一版本号中,并将所述分条的CRC值填入所述N+M个所述第一版本号中的每个所述第一版本号中,得到N+M个条带的第二版本号;
所述客户端模块将所述N+M个条带的第二版本号中每个第二版本号和所述N+M个条带中需要写入硬盘的每个条带发送给分布式存储系统中对应的存储节点。
2.根据权利要求1所述的方法,其特征在于,当所述N+M个条带中的第一条带和所述第一条带的第二版本号对应的存储节点为所述第一存储节点,且与所述第一条带对应的硬盘中已经存储了所述第一条带时,所述方法还包括:
当所述第一存储节点的服务器模块接收到所述第一条带的第二版本号且未接收到所述第一条带时,所述服务器模块将所述第一条带的第二版本号发送给所述第一存储节点的硬盘管理模块;
所述硬盘管理模块从存储了所述第一条带的硬盘中读取所述第一条带,并计算所述第一条带的CRC值;
所述硬盘管理模块比较所述硬盘管理模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值;
当所述硬盘管理模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,所述硬盘管理模块根据接收到的所述第一条带的第二版本将已经存储在硬盘中的所述第一条带的第二版本号更新。
3.根据权利要求1所述的方法,其特征在于,所述N+M个条带中的第一条带和所述第一条带的第二版本号对应的存储节点为所述第一存储节点,所述方法还包括:
当所述服务器模块接收到所述第一条带的第二版本号和所述第一条带时,所述服务器模块计算所述第一条带的CRC值,并比较所述服务器模块计算的所述第一条带的CRC值与所述第一条带的第二版本号中记录的所述第一条带的CRC值;
当所述服务器模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,所述服务器模块将所述第一条带的第二版本号和所述第一条带发送给所述硬盘管理模块;
所述硬盘管理模块计算所述第一条带的CRC值,并比较所述硬盘管理模块计算的所述第一条带的CRC值与所述第一条带的第二版本号中记录的所述第一条带的CRC值;
当所述硬盘管理模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,所述硬盘管理模块将所述第一条带的第二版本号和所述第一条带写入对应的硬盘中。
4.根据权利要求1-3任一项所述的方法,其特征在于,所述方法还包括:
所述客户端模块接收到所述CA发送的数据读取请求消息后,向多个存储节点发送所述数据读取请求消息,所述数据读取请求消息用于请求读取所述分条中的条带,所述多个存储节点为存储所述N+M个条带和所述N+M个条带的第二版本号的存储节点;
当所述客户端模块接收到所述多个存储节点发送的所述N+M个条带以及所述N+M个条带的第二版本号时,所述客户端模块计算所述N+M个条带中每个条带的CRC值,并比较所述客户端模块计算的所述每个条带的CRC值与所述每个条带的第二版本号中记录的条带的CRC值;
当所述客户端模块计算所述每个条带的CRC值均与所述每个条带的第二版本号中记录的条带的CRC值相同时,所述客户端模块计算所述分条的CRC值,并比较所述分条的CRC值与所述N+M个条带中的一个条带的第二版本号中记录的所述分条的CRC值;
当所述客户端计算的所述分条的CRC值与所述一个条带的第二版本号中记录的所述分条的CRC值相同时,所述客户端模块将所述N个数据条带和所述每个数据条带的第二版本号发送给所述CA。
5.根据权利要求4所述的方法,其特征在于,所述方法还包括:
当所述客户端模块未接收到所述N+M个条带中的J个数据条带和所述J个数据条带的第二版本号时,所述客户端模块根据接收到的N+M-J个条带重构所述J个数据条带,得到重构出的分条,所述重构出的分条包括所述N+M-J个条带和重构出的所述J个数据条带,J为小于等于M的自然数;
所述客户端模块计算所述重构出的分条的CRC值,并比较所述重构出的分条的CRC值与所述N+M-J个条带中的一个条带的第二版本号中记录的所述分条的CRC值;
当所述重构出的分条的CRC值与所述N+M-J个条带中的一个条带的第二版本号中记录的所述分条的CRC值相同时,所述客户端模块计算所述J个数据条带中每个数据条带的CRC值,并生成所述J个数据条带的第二版本号;
所述客户端模块将所述重构出的分条中的每个数据条带和所述每个数据条带的第二版本号发送给所述CA。
6.根据权利要求5所述的方法,其特征在于,所述多个存储节点中包括所述第一存储节点,所述第一存储节点中存储了所述N+M个条带中的第一条带和所述第一条带的第二版本号;所述第一存储节点的服务器模块在接收到所述客户端模块发送的数据读取请求消息之前,所述方法还包括:
所述服务器模块将所述数据读取请求消息发送给所述第一存储节点的硬盘管理模块,所述数据读取请求消息用于请求读取所述第一条带和所述第一条带的第二版本号;
所述硬盘管理模块从存储了所述第一条带和所述第一条带的第二版本号的硬盘中读取所述第一条带和所述第一条带的第二版本号;
所述硬盘管理模计算所述第一条带的CRC值,并比较所述硬盘管理模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值;
当所述硬盘管理模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,所述硬盘管理模块将所述第一条带和所述第一条带的第二版本号发送给所述服务器模块;
所述服务器模块计算所述第一条带的CRC值,并比较所述服务器模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值;
当所述服务器模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,所述第服务器模块将所述第一条带和所述第一条带的第二版本号发送给所述客户端模块。
7.根据权利要求2-3、6任一项所述的方法,其特征在于,所述方法还包括:
所述第一存储节点的数据重构模块接收到第二存储节点发送的数据重构请求消息后,向所述硬盘管理模块发送所述数据重构请求消息,所述数据重构请求消息用于请求读取所述第一条带和所述第一条带的第二版本号;
所述硬盘管理模块从存储了所述第一条带和所述第一条带的第二版本号的硬盘中读取所述第一条带和所述第一条带的第二版本号;
所述硬盘管理模块计算所述第一条带的CRC值,并比较所述硬盘管理模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值;
当所述硬盘管理模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,所述硬盘管理模块将所述第一条带和所述第一条带的第二版本号发送给所述数据重构模块;
所述数据重构模块计算所述第一条带的CRC值,并比较所述数据重构模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值;
当所述数据重构模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,所述数据重构模块将所述第一条带和所述第一条带的第二版本号发送给所述第二存储节点。
8.根据权利要求2-3、6任一项所述的方法,其特征在于,所述第一条带为所述N个数据条带中的第一数据条带,所述方法还包括:
所述第一存储节点的数据重构模块确定需要重构所述第一数据条带时,所述数据重构模块向至少一个第二存储节点发送数据重构请求消息,所述至少一个第二存储节点为存储了所述分条中除所述第一数据条带以外其余条带和所述其余条带中每个条带的第二版本号的多个存储节点;
所述数据重构模块接收所述至少一个第二存储节点发送的所述其余条带和所述其余条带中每个条带的第二版本号;
所述数据重构模块根据所述其余条带重构所述第一数据条带;
所述数据重构模块计算重构出的分条的CRC值,并比较所述重构出的分条的CRC值与所述其余条带中的一个条带的第二版本号中记录的所述分条的CRC值;
当所述重构出的分条的CRC值与所述一个条带的第二版本号中记录的所述分条的CRC值相同时,所述数据重构模块确定重构出的所述第一数据条带正确。
9.一种数据校验方法,其特征在于,所述方法包括:
第二存储节点的服务器模块接收第一存储节点发送的条带的第二版本号,所述第二版本号中记录了所述条带的循环冗余码校验CRC值;
当所述服务器模块未接收到所述条带时,所述服务器模块将所述第二版本号发送给所述第二存储节点的硬盘管理模块;
所述硬盘管理模块在接收到所述第二版本号之前,与所述条带对应的硬盘中已经存储了所述条带,所述硬盘管理模块接收到所述第二版本号之后,从存储了所述条带的硬盘中读取所述条带,并计算所述条带的CRC值;
所述硬盘管理模块比较所述硬盘管理模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;
当所述硬盘管理模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,所述硬盘管理模块根据接收到的所述第二版本号将已经存储在硬盘中的所述条带的第二版本号更新。
10.根据权利要求9所述的方法,其特征在于,所述方法还包括:
当所述服务器模块接收到所述条带时,所述服务器模块计算所述条带的CRC值,并比较所述服务器模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;
当所述服务器模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,所述服务器模块将所述第二版本号和所述条带发送给所述硬盘管理模块;
所述硬盘管理模块计算所述条带的CRC值,并比较所述硬盘管理模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;
当所述硬盘管理模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,所述硬盘管理模块将所述条带和所述第二版本号写入对应的硬盘中。
11.根据权利要求9或10所述的方法,其特征在于,所述方法还包括:
所述服务器模块接收到所述第一存储节点发送的数据读取请求消息后,将所述数据读取请求消息发送给所述硬盘管理模块,所述数据读取请求消息用于请求读取所述条带和所述第二版本号;
所述硬盘管理模块从存储了所述条带和所述第二版本号的硬盘中读取所述条带和所述第二版本号,计算所述条带的CRC值,并比较所述硬盘管理模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;
当所述硬盘管理模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,所述硬盘管理模块将所述条带和所述第二版本号发送给所述服务器模块;
所述服务器模块计算所述条带的CRC值,并比较所述服务器模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;
当所述服务器模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,所述服务器模块将所述第二版本号和所述条带发送给所述第一存储节点。
12.根据权利要求9-11任一项所述的方法,其特征在于,所述方法还包括:
所述第二存储节点的数据重构模块接收到分布式存储系统中的其他存储节点发送的数据重构请求消息后,向所述硬盘管理模块发送所述数据重构请求消息,所述数据重构请求消息用于请求读取所述条带和所述第二版本号;
所述硬盘管理模块从存储了所述条带和所述第二版本号的硬盘中读取所述条带和所述第二版本号;
所述硬盘管理模块计算所述条带的CRC值,并比较所述硬盘管理模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;
当所述硬盘管理模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,所述硬盘管理模块将所述条带和所述第二版本号发送给所述数据重构模块;
所述数据重构模块计算所述条带的CRC值,并比较所述数据重构模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;
当所述数据重构模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,所述数据重构模块将所述条带和所述第二版本号发送给所述其他存储节点。
13.根据权利要求9-12任一项所述的方法,其特征在于,所述条带为第二数据条带,所述方法还包括:
所述第二存储节点的数据重构模块确定需要重构所述第二数据条带时,所述数据重构模块向多个存储节点发送所述数据重构请求消息,所述多个存储节点为存储了其余条带和所述其余条带中每个条带的第二版本号的存储节点,所述其余条带为所述第二数据条带所属分条中除所述第二数据条带以外的条带;
所述数据重构模块接收所述多个存储节点发送的所述其余条带和所述每个条带的第二版本号;
所述数据重构模块根据所述其余条带重构出所述第二数据条带,并计算重构出的分条的CRC值,所述重构出的分条包括所述其余条带和所述第二数据条带;
所述数据重构模块比较所述重构出的分条的CRC值与所述其余条带中的一个条带的第二版本号中记录的所述分条的CRC值;
当所述重构出的分条的CRC值与所述一个条带的第二版本号中记录的所述分条的CRC值相同时,所述数据重构模块确定重构出的所述第二数据条带正确。
14.一种第一存储节点,其特征在于,包括客户端模块、客户端代理CA;
所述客户端模块用于:接收所述CA发送的N个数据条带、所述CA计算的每个数据条带的循环冗余码校验CRC值,以及所述CA生成的所述N个数据条带的第一版本号,N为大于或者等于2的自然数;计算每个数据条带的CRC值,并比较所述客户端模块计算的CRC值与所述CA计算的CRC值;当所述客户端模块计算的每个数据条带的CRC值均与所述CA计算的CRC值相同时,根据所述N个数据条带计算M个校验条带,并计算每个校验条带的CRC值,M为大于或者等于2的自然数;计算分条的CRC值,所述分条包括所述N个数据条带和所述M个校验条带,所述分条的CRC值用于对所述分条进行校验;根据预设规则将所述分条内的N+M个条带的CRC值分别填入N+M个所述第一版本号中,并将所述分条的CRC值填入所述N+M个所述第一版本号中的每个所述第一版本号中,得到N+M个条带的第二版本号;将所述N+M个条带的第二版本号中每个第二版本号和所述N+M个条带中需要写入硬盘的每个条带发送给分布式存储系统中对应的存储节点。
15.根据权利要求14所述的第一存储节点,其特征在于,所述N+M个条带中的第一条带和所述第一条带的第二版本号对应的存储节点为所述第一存储节点,与所述第一条带对应的硬盘中已经存储了所述第一条带,所述第一存储节点还包括服务器模块和硬盘管理模块;
所述服务器模块用于:当接收到所述第一条带的第二版本号且未接收到所述第一条带时,将所述第一条带的第二版本号发送给所述硬盘管理模块;
所述硬盘管理模块用于:从存储了所述第一条带的硬盘中读取所述第一条带,并计算所述第一条带的CRC值;比较所述硬盘管理模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值;当所述硬盘管理模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,根据接收到的所述第一条带的第二版本将已经存储在硬盘中的所述第一条带的第二版本号更新。
16.根据权利要求14所述的第一存储节点,其特征在于,所述N+M个条带中的第一条带和所述第一条带的第二版本号对应的存储节点为所述第一存储节点,所述第一存储节点还包括服务器模块和硬盘管理模块;
所述服务器模块还用于:当接收到所述第一条带的第二版本号和所述第一条带时,计算所述第一条带的CRC值,并比较所述服务器模块计算的所述第一条带的CRC值与所述第一条带的第二版本号中记录的所述第一条带的CRC值;当所述服务器模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,将所述第一条带的第二版本号和所述第一条带发送给所述硬盘管理模块;
所述硬盘管理模块还用于:计算所述第一条带的CRC值,并比较所述硬盘管理模块计算的所述第一条带的CRC值与所述第一条带的第二版本号中记录的所述第一条带的CRC值;当所述硬盘管理模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,将所述第一条带的第二版本号和所述第一条带写入对应的硬盘中。
17.根据权利要求15-16任一项所述的第一存储节点,其特征在于,
所述客户端模块还用于:接收到所述CA发送的数据读取请求消息后,向多个存储节点发送所述数据读取请求消息,所述数据读取请求消息用于请求读取所述分条中的条带,所述多个存储节点为存储所述N+M个条带和所述N+M个条带的第二版本号的存储节点;当所述客户端模块接收到所述多个存储节点发送的所述N+M个条带以及所述N+M个条带的第二版本号时,计算所述N+M个条带中每个条带的CRC值,并比较所述客户端模块计算的所述每个条带的CRC值与所述每个条带的第二版本号中记录的条带的CRC值;当所述客户端模块计算所述每个条带的CRC值均与所述每个条带的第二版本号中记录的条带的CRC值相同时,计算所述分条的CRC值,并比较所述分条的CRC值与所述N+M个条带中的一个条带的第二版本号中记录的所述分条的CRC值;当所述客户端计算的所述分条的CRC值与所述一个条带的第二版本号中记录的所述分条的CRC值相同时,将所述N个数据条带和所述每个数据条带的第二版本号发送给所述CA。
18.根据权利要求17所述的第一存储节点,其特征在于,
所述客户端模块还用于:当未接收到所述N+M个条带中的J个数据条带和所述J个数据条带的第二版本号时,根据接收到的N+M-J个条带重构所述J个数据条带,得到重构出的分条,所述重构出的分条包括所述N+M-J个条带和重构出的所述J个数据条带,J为小于等于M的自然数;计算所述重构出的分条的CRC值,并比较所述重构出的分条的CRC值与所述N+M-J个条带中的一个条带的第二版本号中记录的所述分条的CRC值;当所述重构出的分条的CRC值与所述N+M-J个条带中的一个条带的第二版本号中记录的所述分条的CRC值相同时,计算所述J个数据条带中每个数据条带的CRC值,并生成所述J个数据条带的第二版本号;将所述重构出的分条中的每个数据条带和所述每个数据条带的第二版本号发送给所述CA。
19.根据权利要求18所述的第一存储节点,其特征在于,所述多个存储节点中包括所述第一存储节点,所述第一存储节点中存储了所述N+M个条带中的第一条带和所述第一条带的第二版本号;
所述服务器模块还用于:在接收到所述客户端模块发送的数据读取请求消息之后,将所述数据读取请求消息发送给所述硬盘管理模块,所述数据读取请求消息用于请求读取所述第一条带和所述第一条带的第二版本号;
所述硬盘管理模块还用于:从存储了所述第一条带和所述第一条带的第二版本号的硬盘中读取所述第一条带和所述第一条带的第二版本号;计算所述第一条带的CRC值,并比较所述硬盘管理模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值;当所述硬盘管理模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,将所述第一条带和所述第一条带的第二版本号发送给所述服务器模块;
所述服务器模块还用于:计算所述第一条带的CRC值,并比较所述服务器模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值;当所述服务器模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,将所述条带和所述条带的第二版本号发送给所述客户端模块。
20.根据权利要求15-16、19任一项所述的第一存储节点,其特征在于,所述第一存储节点还包括数据重构模块;
所述数据重构模块用于:接收到第二存储节点发送的数据重构请求消息后,向所述硬盘管理模块发送所述数据重构请求消息,所述数据重构请求消息用于请求读取所述第一条带和所述第一条带的第二版本号;
所述硬盘管理模块还用于:从存储了所述第一条带和所述第一条带的第二版本号的硬盘中读取所述第一条带和所述第一条带的第二版本号;计算所述第一条带的CRC值,并比较所述硬盘管理模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值;当所述硬盘管理模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,将所述第一条带和所述第一条带的第二版本号发送给所述数据重构模块;
所述数据重构模块还用于:计算所述第一条带的CRC值,并比较所述数据重构模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值;当所述数据重构模块计算的所述第一条带的CRC值,与所述第一条带的第二版本号中记录的所述第一条带的CRC值相同时,将所述第一条带和所述第一条带的第二版本号发送给所述第二存储节点。
21.根据权利要求15-16、19任一项所述的第一存储节点,其特征在于,所述第一条带为所述N个数据条带中的第一数据条带,所述第一存储节点还包括数据重构模块;
所述数据重构模块用于:在确定需要重构所述第一数据条带时,向至少一个第二存储节点发送数据重构请求消息,所述至少一个第二存储节点为存储了所述分条中除所述第一数据条带以外其余条带和所述其余条带中每个条带的第二版本号的多个存储节点;接收所述至少一个第二存储节点发送的所述其余条带和所述其余条带中每个条带的第二版本号;根据所述其余条带重构所述第一数据条带;计算重构出的分条的CRC值,并比较所述重构出的分条的CRC值与所述其余条带中的一个条带的第二版本号中记录的所述分条的CRC值;当所述重构出的分条的CRC值与所述一个条带的第二版本号中记录的所述分条的CRC值相同时,确定重构出的所述第一数据条带正确。
22.一种第二存储节点,其特征在于,包括服务器模块和硬盘管理模块;
所述服务器模块用于:接收第一存储节点发送的条带的第二版本号,所述第二版本号中记录了所述条带的循环冗余码校验CRC值;当未接收到所述条带时,将所述第二版本号发送给所述第二存储节点的硬盘管理模块;
所述硬盘管理模块用于:在接收到所述第二版本号之后,从存储了所述条带的硬盘中读取所述条带,并计算所述条带的CRC值,其中,所述硬盘管理模块在接收到所述第二版本号之前,与所述条带对应的硬盘中已经存储了所述条带;
所述硬盘管理模块还用于:比较所述硬盘管理模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;当所述硬盘管理模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,根据接收到的所述第二版本号将已经存储在硬盘中的所述条带的第二版本号更新。
23.根据权利要求22所述的第二存储节点,其特征在于,
所述服务器模块还用于:当接收到所述条带时,计算所述条带的CRC值,并比较所述服务器模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;当所述服务器模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,将所述第二版本号和所述条带发送给所述硬盘管理模块;
所述硬盘管理模块还用于:计算所述条带的CRC值,并比较所述硬盘管理模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;当所述硬盘管理模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,将所述条带和所述第二版本号写入对应的硬盘中。
24.根据权利要求22或23所述的第二存储节点,其特征在于,
所述服务器模块还用于:在接收到所述第一存储节点发送的数据读取请求消息后,将所述数据读取请求消息发送给所述硬盘管理模块,所述数据读取请求消息用于请求读取所述条带和所述第二版本号;
所述硬盘管理模块还用于:从存储了所述条带和所述第二版本号的硬盘中读取所述条带和所述第二版本号,计算所述条带的CRC值,并比较所述硬盘管理模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;当所述硬盘管理模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,将所述条带和所述第二版本号发送给所述服务器模块;
所述服务器模块还用于:计算所述条带的CRC值,并比较所述服务器模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;当所述服务器模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,将所述第二版本号和所述条带发送给所述第一存储节点。
25.根据权利要求22-24任一项所述的第二存储节点,其特征在于,所述第二存储节点还包括数据重构模块;
所述数据重构模块用于,在接收到分布式存储系统中的其他存储节点发送的数据重构请求消息后,向所述硬盘管理模块发送所述数据重构请求消息,所述数据重构请求消息用于请求读取所述条带和所述第二版本号;
所述硬盘管理模块还用于:从存储了所述条带和所述第二版本号的硬盘中读取所述条带和所述第二版本号;所述硬盘管理模块计算所述条带的CRC值,并比较所述硬盘管理模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;当所述硬盘管理模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,将所述条带和所述第二版本号发送给所述数据重构模块;
所述数据重构模块还用于:计算所述条带的CRC值,并比较所述数据重构模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值;当所述数据重构模块计算的所述条带的CRC值与所述第二版本号中记录的所述条带的CRC值相同时,将所述条带和所述第二版本号发送给所述其他存储节点。
26.根据权利要求22-25任一项所述的第二存储节点,其特征在于,所述条带为第二数据条带,所述第二存储节点还包括数据重构模块;
所述数据重构模块用于:在确定需要重构所述第二数据条带时,向多个存储节点发送所述数据重构请求消息,所述多个存储节点为存储了其余条带和所述其余条带中每个条带的第二版本号的存储节点,所述其余条带为所述第二数据条带所属分条中除所述第二数据条带以外的条带;接收所述多个存储节点发送的所述其余条带和所述每个条带的第二版本号;根据所述其余条带重构出所述第二数据条带,并计算重构出的分条的CRC值,所述重构出的分条包括所述其余条带和所述第二数据条带;比较所述重构出的分条的CRC值与所述其余条带中的一个条带的第二版本号中记录的所述分条的CRC值;当所述重构出的分条的CRC值与所述一个条带的第二版本号中记录的所述分条的CRC值相同时,确定重构出的所述第二数据条带正确。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711065721.0A CN107908499B (zh) | 2017-11-02 | 2017-11-02 | 一种数据校验方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711065721.0A CN107908499B (zh) | 2017-11-02 | 2017-11-02 | 一种数据校验方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107908499A true CN107908499A (zh) | 2018-04-13 |
CN107908499B CN107908499B (zh) | 2021-03-05 |
Family
ID=61842412
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711065721.0A Active CN107908499B (zh) | 2017-11-02 | 2017-11-02 | 一种数据校验方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107908499B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109726036A (zh) * | 2018-11-21 | 2019-05-07 | 华为技术有限公司 | 一种存储系统中的数据重构方法和装置 |
CN111936960A (zh) * | 2018-12-25 | 2020-11-13 | 华为技术有限公司 | 分布式存储系统中数据存储方法、装置及计算机程序产品 |
WO2021098526A1 (zh) * | 2019-11-20 | 2021-05-27 | 华为技术有限公司 | 确定条带一致性的方法及装置 |
CN113419684A (zh) * | 2021-07-09 | 2021-09-21 | 深圳大普微电子科技有限公司 | 一种数据处理方法、装置、设备及可读存储介质 |
CN114579352A (zh) * | 2022-04-29 | 2022-06-03 | 阿里云计算有限公司 | 数据重构方法以及装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6553511B1 (en) * | 2000-05-17 | 2003-04-22 | Lsi Logic Corporation | Mass storage data integrity-assuring technique utilizing sequence and revision number metadata |
CN103645963A (zh) * | 2013-12-26 | 2014-03-19 | 深圳市迪菲特科技股份有限公司 | 一种存储系统及其数据一致性校验方法 |
US20160147651A1 (en) * | 2014-11-21 | 2016-05-26 | Sandisk Enterprise Ip Llc | Data Integrity Enhancement to Protect Against Returning Old Versions of Data |
CN106844108A (zh) * | 2016-12-29 | 2017-06-13 | 成都华为技术有限公司 | 一种数据存储方法、服务器以及存储系统 |
CN106970764A (zh) * | 2017-02-24 | 2017-07-21 | 中国科学院计算技术研究所 | 一种基于条带版本的瓦记录raid写顺序化方法及系统 |
-
2017
- 2017-11-02 CN CN201711065721.0A patent/CN107908499B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6553511B1 (en) * | 2000-05-17 | 2003-04-22 | Lsi Logic Corporation | Mass storage data integrity-assuring technique utilizing sequence and revision number metadata |
CN103645963A (zh) * | 2013-12-26 | 2014-03-19 | 深圳市迪菲特科技股份有限公司 | 一种存储系统及其数据一致性校验方法 |
US20160147651A1 (en) * | 2014-11-21 | 2016-05-26 | Sandisk Enterprise Ip Llc | Data Integrity Enhancement to Protect Against Returning Old Versions of Data |
CN106844108A (zh) * | 2016-12-29 | 2017-06-13 | 成都华为技术有限公司 | 一种数据存储方法、服务器以及存储系统 |
CN106970764A (zh) * | 2017-02-24 | 2017-07-21 | 中国科学院计算技术研究所 | 一种基于条带版本的瓦记录raid写顺序化方法及系统 |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109726036A (zh) * | 2018-11-21 | 2019-05-07 | 华为技术有限公司 | 一种存储系统中的数据重构方法和装置 |
CN109726036B (zh) * | 2018-11-21 | 2021-08-20 | 华为技术有限公司 | 一种存储系统中的数据重构方法和装置 |
CN111936960A (zh) * | 2018-12-25 | 2020-11-13 | 华为技术有限公司 | 分布式存储系统中数据存储方法、装置及计算机程序产品 |
CN111936960B (zh) * | 2018-12-25 | 2022-08-19 | 华为云计算技术有限公司 | 分布式存储系统中数据存储方法、装置及计算机程序产品 |
US11775194B2 (en) | 2018-12-25 | 2023-10-03 | Huawei Cloud Computing Technolgoies Co., Ltd. | Data storage method and apparatus in distributed storage system, and computer program product |
WO2021098526A1 (zh) * | 2019-11-20 | 2021-05-27 | 华为技术有限公司 | 确定条带一致性的方法及装置 |
CN113419684A (zh) * | 2021-07-09 | 2021-09-21 | 深圳大普微电子科技有限公司 | 一种数据处理方法、装置、设备及可读存储介质 |
CN114579352A (zh) * | 2022-04-29 | 2022-06-03 | 阿里云计算有限公司 | 数据重构方法以及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN107908499B (zh) | 2021-03-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107908499A (zh) | 一种数据校验方法及装置 | |
CN110597925B (zh) | 一种基于区块链的跨链数据处理方法及装置 | |
CN101960464B (zh) | 信息处理装置 | |
EP3779760B1 (en) | Blockchain-based data processing method and apparatus, and electronic device | |
CN108921556A (zh) | 一种区块链的验证方法、装置、设备及存储介质 | |
CN108959621A (zh) | 一种区块链网络的实现方法、装置、设备及存储介质 | |
CN107544871A (zh) | 一种虚拟机磁盘备份方法及装置 | |
CN108769264B (zh) | 一种区块链分域方法 | |
CN109934712B (zh) | 应用于分布式系统的对账方法、对账装置和电子设备 | |
CN108615151A (zh) | 数据处理方法、区块链服务器以及节点设备 | |
CN108170449A (zh) | 一种区块链系统中核心协议的升级方法 | |
CN109063049A (zh) | 一种区块链网络的账号处理方法、装置、设备及存储介质 | |
CN107733882A (zh) | Ssl证书自动化部署方法及设备 | |
CN110349019A (zh) | 一种块链式账本中的验证方法、装置及设备 | |
CN110347679A (zh) | 一种基于收据的数据存储方法、装置及设备 | |
CN105868127A (zh) | 一种数据存储、读取方法及装置 | |
CN109584071A (zh) | 区块链处理方法和电子设备 | |
CN102880478B (zh) | 软件更新方法 | |
CN114529415A (zh) | 基于区块链的交易验证方法及装置、电子设备 | |
CN106775481A (zh) | 数据读取方法及设备 | |
CN113312205B (zh) | 数据校验方法、装置、存储介质和计算机设备 | |
CN108985933A (zh) | 一种记账方法及装置 | |
CN107392745B (zh) | 一种对帐数据碎片化处理方法 | |
CN106855821A (zh) | 一种分布式事务处理方法及装置 | |
CN110362570A (zh) | 一种数据存储方法、装置及设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |