数据存储方法、恢复方法、相关装置以及系统转让专利

申请号 : CN201510304374.7

文献号 : CN105095013B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 王道辉张烽樊伟张志乐曾永强

申请人 : 华为技术有限公司

摘要 :

本发明实施例公开了一种数据存储方法,用于提高分布式存储系统的存储一致性。本发明实施例方法包括:主存储节点对待存储的数据段进行EC编码得到目标EC条带;确定所述存储节点组中,用于存储目标EC条带的m+k个目标EC block的m+k个目标存储节点;向目标存储节点发送准备消息;接收目标存储节点发送的响应消息;在接收到了所有目标存储节点的响应消息后,向目标存储节点发送执行消息,指示目标存储节点写入准备日志中的目标EC block。本发明实施例还提供数据恢复方法以及相关装置。

权利要求 :

1.一种数据存储方法,用于分布式存储系统,其特征在于,所述分布式存储系统通过纠删码EC条带来存储数据,每个EC条带包括数据部分和校验部分,所述每个EC条带的数据部分包括m个数据块,所述每个EC条带的校验部分包括对所述m个数据块进行校验编码后得到的k个校验块,所述m个数据块和所述k个校验块组成所述每个EC条带的EC block;所述分布式存储系统包括多个存储节点组,每个存储节点组包括不少于m+k个存储节点,每个存储节点组指定一个主存储节点,所述每个存储节点组中除主存储节点之外的节点为备存储节点,所述m、k均为正整数;

所述任意一个存储节点组的主存储节点执行所述方法,包括:

接收待存储的数据段,对所述待存储的数据段进行EC编码得到目标EC条带,所述待存储的数据段的大小不大于Z,所述Z为m个数据块的大小,所述目标EC条带包括m+k个目标EC block,所述m+k个目标EC block包括m个目标数据块和k个目标校验块;

确定m+k个目标存储节点,其中,所述m+k个目标存储节点用于存储所述m+k个目标EC block,每个目标存储节点存储一个所述目标EC block;

向所述m+k个目标存储节点分别发送准备消息,每个准备消息中包括所述每个目标存储节点需要存储的目标EC block;

接收所述m+k个目标存储节点中的任意一个目标存储节点发送的响应消息,所述响应消息用于表示当前发送所述响应消息的目标备存储节点已经根据所述准备消息生成了准备日志,所述准备日志中包括所述当前发送所述响应消息的目标存储节点需要存储的目标EC block;

在接收到了所述m+k个目标存储节点中的所有目标存储节点的响应消息后,向所述m+k个目标存储节点发送执行消息,所述执行消息用于指示所述m+k个目标存储节点写入所述准备日志中的目标EC block。

2.根据权利要求1所述的数据存储方法,其特征在于:

所述准备消息中还包括所述目标EC条带的版本号;

所述准备日志中还包括所述目标EC条带的版本号;

所述执行消息具体用于指示所述m+k个目标存储节点写入所述准备消息中的目标EC block和所述目标EC条带的版本号。

3.根据权利要求2所述的数据存储方法,其特征在于,所述方法在向所述目标存储节点发送准备消息之后还包括:若检测到所述m+k个目标存储节点中存在故障存储节点,则待所述故障存储节点的故障修复后,判断所述m+k个目标存储节点上的目标EC条带的版本号是否相同,其中,所述m+k个目标存储节点上的所述目标EC条带的版本号包括:已生成准备日志的目标存储节点上的准备日志中目标EC条带的版本号,和/或,没有准备日志的目标存储节点所存储的目标EC条带的版本号;

若所述m+k个目标存储节点中的所有目标存储节点上的目标EC条带的版本号相同,则向已生成准备日志的目标存储节点发送执行消息,所述执行消息用于指示目标存储节点写入所述准备日志中的目标EC block。

4.根据权利要求3所述的数据存储方法,其特征在于,所述方法还包括:

若所述m+k个目标存储节点中的目标存储节点上的目标EC条带的版本号不相同,则向已生成准备日志的目标存储节点发送删除消息,所述删除消息用于指示目标存储节点删除所述准备日志。

5.一种数据存储装置,用于分布式存储系统,其特征在于,所述分布式存储系统通过纠删码EC条带来存储数据,每个EC条带包括数据部分和校验部分,所述每个EC条带的数据部分包括m个数据块,所述每个EC条带的校验部分包括对所述m个数据块进行校验编码后得到的k个校验块,所述m个数据块和所述k个校验块组成所述每个EC条带的EC block;所述分布式存储系统包括多个存储节点组,每个存储节点组包括不少于m+k个存储节点,每个存储节点组指定一个主存储节点,所述每个存储节点组中除主存储节点之外的节点为备存储节点,所述m、k均为正整数;

所述数据存储装置部署在任意一个存储节点组的主存储节点上,所述数据存储装置包括:

数据编码模块,用于接收待存储的数据段,对所述待存储的数据段进行EC编码得到目标EC条带,所述待存储的数据段的大小不大于Z,所述Z为m个数据块的大小,所述目标EC条带包括m+k个目标EC block,所述m+k个目标EC block包括m个目标数据块和k个目标校验块;

节点确定模块,用于确定m+k个目标存储节点,其中,所述m+k个目标存储节点用于存储所述m+k个目标EC block,每个目标存储节点存储一个所述目标EC block;

消息发送模块,用于向所述m+k个目标存储节点分别发送准备消息,每个准备消息中包括所述每个目标存储节点需要存储的目标EC block;

消息接收模块,接收所述m+k个目标存储节点中的任意一个目标存储节点发送的响应消息,所述响应消息用于表示当前发送所述响应消息的目标备存储节点已经根据所述准备消息生成了准备日志,所述准备日志中包括所述当前发送所述响应消息的目标存储节点需要存储的目标EC block;

所述消息发送模块还用于:在消息接收模块接收到了所述m+k个目标存储节点中的所有目标存储节点的响应消息后,向所述m+k个目标存储节点发送执行消息,所述执行消息用于指示所述m+k个目标存储节点写入所述准备日志中的目标EC block。

6.根据权利要求5所述的数据存储装置,其特征在于:

所述准备消息中还包括所述目标EC条带的版本号;

所述准备日志中还包括所述目标EC条带的版本号;

所述执行消息具体用于指示所述m+k个目标存储节点写入所述准备消息中的目标EC block和所述目标EC条带的版本号。

7.根据权利要求6所述的数据存储装置,其特征在于,所述装置还包括:

版本判断模块,用于在检测到所述m+k个目标存储节点中存在故障存储节点时,待所述故障存储节点的故障修复后,判断所述m+k个目标存储节点上的目标EC条带的版本号是否相同,其中,所述m+k个目标存储节点上的所述目标EC条带的版本号包括:已生成准备日志的目标存储节点上的准备日志中目标EC条带的版本号,和/或,没有准备日志的目标存储节点所存储的目标EC条带的版本号;

所述消息发送模块具体用于:若所述m+k个目标存储节点中的所有目标存储节点上的目标EC条带的版本号相同,则向已生成准备日志的目标存储节点发送执行消息,所述执行消息用于指示目标存储节点写入所述准备日志中的目标EC block。

8.根据权利要求7所述的数据存储装置,其特征在于,所述消息发送模块还用于:

若所述m+k个目标存储节点中的目标存储节点上的目标EC条带的版本号不相同,则向已生成准备日志的目标存储节点发送删除消息,所述删除消息用于指示目标存储节点删除所述准备日志。

9.一种数据存储装置,其特征在于,所述数据存储装置包括输入装置、输出装置、处理器和存储器,其中,通过调用存储器存储的操作指令,所述处理器用于:接收待存储的数据段,对所述待存储的数据段进行EC编码得到目标EC条带,所述待存储的数据段的大小不大于Z,所述Z为m个数据块的大小,所述目标EC条带包括m+k个目标EC block,所述m+k个目标EC block包括m个目标数据块和k个目标校验块;

确定m+k个目标存储节点,其中,所述m+k个目标存储节点用于存储所述m+k个目标EC block,每个目标存储节点存储一个所述目标EC block;

向所述m+k个目标存储节点分别发送准备消息,每个准备消息中包括所述每个目标存储节点需要存储的目标EC block;

接收所述m+k个目标存储节点中的任意一个目标存储节点发送的响应消息,所述响应消息用于表示当前发送所述响应消息的目标备存储节点已经根据所述准备消息生成了准备日志,所述准备日志中包括所述当前发送所述响应消息的目标存储节点需要存储的目标EC block;

在接收到了所述m+k个目标存储节点中的所有目标存储节点的响应消息后,向所述m+k个目标存储节点发送执行消息,所述执行消息用于指示所述m+k个目标存储节点写入所述准备日志中的目标EC block。

10.一种存储节点,其特征在于,包括权利要求5至8中任一项所述的数据存储装置。

说明书 :

数据存储方法、恢复方法、相关装置以及系统

技术领域

[0001] 本发明涉及数据存储领域,尤其涉及数据存储方法、恢复方法、相关装置以及系统。

背景技术

[0002] 现阶段的分布式存储系统越来越多的采用纠删码(EC,Erasure Code)技术对数据进行存储。纠删码技术原理是将数据进行分割成m个数据块,并且采用冗余算法对m个数据块进行校验编码,生成k个校验块,该m个数据块与k个校验块称为一个EC条带。其中,数据块或校验块也称为EC block,每个EC条带能容忍k个EC block的丢失。
[0003] 为了保证存储的可靠性,分布式存储系统会将每个EC条带的m+k个EC block交给m+k个存储节点进行存储。这样,即使某个节点出现了故障,也能够根据其他节点中存储的数据将故障节点中存储的EC block恢复出来。可以理解的,采用EC技术的分布式存储系统能够容忍k个存储节点同时出现故障。
[0004] 但是,将EC block写入存储节点需要一定的时间。若用于存储某个EC条带的m+k个存储节点中,有存储节点在写入EC block时发生了故障,则会出现部分存储节点上有该EC条带的EC block,而另一部分存储节点没有该EC条带的EC block的情况,导致该EC条带的存储不一致,分布式存储系统的存储一致性较差。

发明内容

[0005] 本发明实施例提供了一种数据恢复方法,用于提升分布式存储系统的存储一致性。
[0006] 本发明实施例的第一方面提供了一种数据存储方法,用于分布式存储系统,所述分布式存储系统通过纠删码EC条带来存储数据,每个EC条带包括数据部分和校验部分,所述每个EC条带的数据部分包括m个数据块,所述每个EC条带的校验部分包括对所述m个数据块进行校验编码后得到的k个校验块,所述m个数据块和所述k个校验块组成所述每个EC条带的EC block;所述分布式存储系统包括多个存储节点组,每个存储节点组包括不少于m+k个存储节点,每个存储节点组指定一个主存储节点,所述每个存储节点组中除主存储节点之外的节点为备存储节点,所述m、k均为正整数;
[0007] 所述任意一个存储节点组的主存储节点执行所述方法,包括:接收待存储的数据段,对所述待存储的数据段进行EC编码得到目标EC条带,所述待存储的数据段的大小不大于Z,所述Z为m个数据块的大小,所述目标EC条带包括m+k个目标EC block,所述m+k个目标EC block包括m个目标数据块和k个目标校验块;
[0008] 确定m+k个目标存储节点,其中,所述m+k个目标存储节点用于存储所述m+k个目标EC block,每个目标存储节点存储一个所述目标EC block;
[0009] 向所述m+k个目标存储节点分别发送准备消息,每个准备消息中包括所述每个目标存储节点需要存储的目标EC block;
[0010] 接收所述m+k个目标存储节点中的任意一个目标存储节点发送的响应消息,所述响应消息用于表示当前发送所述响应消息的目标备存储节点已经根据所述准备消息生成了准备日志,所述准备日志中包括所述当前发送所述响应消息的目标存储节点需要存储的目标EC block;
[0011] 在接收到了所述m+k个目标存储节点中的所有目标存储节点的响应消息后,向所述m+k个目标存储节点发送执行消息,所述执行消息用于指示所述m+k个目标存储节点写入所述准备日志中的目标EC block。
[0012] 结合本发明实施例的第一方面,本发明实施例的第一方面的第一种实现方式中,所述准备消息中还包括所述目标EC条带的版本号;
[0013] 所述准备日志中还包括所述目标EC条带的版本号;
[0014] 所述执行消息具体用于指示所述m+k个目标存储节点写入所述准备消息中的目标EC block和所述目标EC条带的版本号。
[0015] 结合本发明实施例的第一方面的第一种实现方式,本发明实施例的第一方面的第二种实现方式还包括:
[0016] 若检测到所述m+k个目标存储节点中存在故障存储节点,则待所述故障存储节点的故障修复后,判断所述m+k个目标存储节点上的目标EC条带的版本号是否相同,其中,所述m+k个目标存储节点上的所述目标EC条带的版本号包括:已生成准备日志的目标存储节点上的准备日志中目标EC条带的版本号,和/或,没有准备日志的目标存储节点所存储的目标EC条带的版本号;
[0017] 若所述m+k个目标存储节点中的所有目标存储节点上的目标EC条带的版本号相同,则向已生成准备日志的目标存储节点发送执行消息,所述执行消息用于指示目标存储节点写入所述准备日志中的目标EC block。
[0018] 结合本发明实施例的第一方面的第二种实现方式,本发明实施例的第一方面的第三种实现方式还包括:
[0019] 若所述m+k个目标存储节点中的目标存储节点上的目标EC条带的版本号不相同,则向已生成准备日志的目标存储节点发送删除消息,所述删除消息用于指示目标存储节点删除所述准备日志。
[0020] 本发明实施例的第二方面提供了一种数据恢复方法,用于分布式存储系统,所述分布式存储系统通过纠删码EC条带来存储数据,每个EC条带包括数据部分和校验部分,所述每个EC条带的数据部分包括m个数据块,所述每个EC条带的校验部分包括对所述m个数据块进行校验编码后得到的k个校验块,所述m个数据块和所述k个校验块组成所述每个EC条带的EC block;每个EC条带对应有key值,且数据部分的地址范围相同的EC条带的key值相同,数据部分的地址范围不同的EC条带的key值不同;所述分布式存储系统包括多个存储节点组,每个存储节点组包括不少于m+k个存储节点,每个存储节点组指定一个主存储节点,所述每个存储节点组中除主存储节点之外的节点为备存储节点,所述m、k均为正整数;
[0021] 在所述任意一个存储节点组的备存储节点中存在故障存储节点时,所述任意一个存储节点组的主存储节点执行所述方法,包括:
[0022] 当所述故障存储节点的故障修复后,接收所述故障存储节点发送的修复消息;
[0023] 根据本存储节点组内非故障存储节点存储的EC block,计算得到N个所述故障存储节点的缺失的EC block,所述N为正整数;
[0024] 依次将所述N个缺失的EC block发送给所述故障存储节点以执行存储;
[0025] 若在所述依次将所述N个缺失的EC block发送给所述故障存储节点的过程中,所述主存储节点生成了第一EC block,并确定由所述故障存储节点存储所述第一EC block,则判断所述故障存储节点当前未成功存储的所述缺失的EC block中是否存在与所述第一EC block的key值相同的第二EC block;
[0026] 若确定存在所述第二EC block,则待所述故障存储节点成功存储了所述第二EC block后,再将所述第一EC block发送给所述故障存储节点以执行存储。
[0027] 结合本发明实施例的第二方面,本发明实施例的第二方面的第一种实现方式中,所述依次将所述N个缺失的EC block发送给所述故障存储节点以执行存储包括:
[0028] 将第n个缺失的EC block发送给所述故障存储节点,其中1≤n≤N;
[0029] 接收所述第n个缺失的EC block对应的响应消息,所述响应消息由所述故障存储节点发送,所述响应消息用于表示所述故障存储节点成功存储了所述第n个缺失的EC block;
[0030] 在接收所述故障存储节点对所述第n个缺失的EC block的响应消息后,若n<N,则n值加1,并再次执行所述将第n个缺失的EC block发送给所述故障存储节点的步骤。
[0031] 结合本发明实施例的第二方面的第一种实现方式,本发明实施例的第二方面的第二种实现方式中,所述当前未成功存储的所述缺失的EC block包括:当前还未发送给所述故障存储节点的所述缺失的EC block,以及当前已发送给所述故障存储节点但没有接收到对应的响应消息的所述缺失的EC block。
[0032] 本发明实施例的第二方面、第二方面的第一种或第二种实现方式,本发明实施例的第二方面的第三种实现方式中,所述分布式存储系统的逻辑卷包括多个逻辑区域,每个逻辑区域为k个数据块的大小且互不重叠,每个所述逻辑区域唯一对应一个key值,每个EC block落在的逻辑区域的key值即为所述EC block的key值。
[0033] 本发明实施例的第三方面提供了一种数据存储装置,用于分布式存储系统,所述分布式存储系统通过纠删码EC条带来存储数据,每个EC条带包括数据部分和校验部分,所述每个EC条带的数据部分包括m个数据块,所述每个EC条带的校验部分包括对所述m个数据块进行校验编码后得到的k个校验块,所述m个数据块和所述k个校验块组成所述每个EC条带的EC block;所述分布式存储系统包括多个存储节点组,每个存储节点组包括不少于m+k个存储节点,每个存储节点组指定一个主存储节点,所述每个存储节点组中除主存储节点之外的节点为备存储节点,所述m、k均为正整数;
[0034] 所述数据存储装置部署在任意一个存储节点组的主存储节点上,所述数据存储装置包括:
[0035] 数据编码模块,用于接收待存储的数据段,对所述待存储的数据段进行EC编码得到目标EC条带,所述待存储的数据段的大小不大于Z,所述Z为m个数据块的大小,所述目标EC条带包括m+k个目标EC block,所述m+k个目标EC block包括m个目标数据块和k个目标校验块;
[0036] 节点确定模块,用于确定m+k个目标存储节点,其中,所述m+k个目标存储节点用于存储所述m+k个目标EC block,每个目标存储节点存储一个所述目标EC block;
[0037] 消息发送模块,用于向所述m+k个目标存储节点分别发送准备消息,每个准备消息中包括所述每个目标存储节点需要存储的目标EC block;
[0038] 消息接收模块,接收所述m+k个目标存储节点中的任意一个目标存储节点发送的响应消息,所述响应消息用于表示当前发送所述响应消息的目标备存储节点已经根据所述准备消息生成了准备日志,所述准备日志中包括所述当前发送所述响应消息的目标存储节点需要存储的目标EC block;
[0039] 所述消息发送模块还用于:在消息接收模块接收到了所述m+k个目标存储节点中的所有目标存储节点的响应消息后,向所述m+k个目标存储节点发送执行消息,所述执行消息用于指示所述m+k个目标存储节点写入所述准备日志中的目标EC block。
[0040] 结合本发明实施例的第三方面,本发明实施例的第三方面的第一种实现方式中,所述准备消息中还包括所述目标EC条带的版本号;
[0041] 所述准备日志中还包括所述目标EC条带的版本号;
[0042] 所述执行消息具体用于指示所述m+k个目标存储节点写入所述准备消息中的目标EC block和所述目标EC条带的版本号。
[0043] 结合本发明实施例的第三方面的第一种实现方式,本发明实施例的第三方面的第二种实现方式中,所述装置还包括:
[0044] 版本判断模块,用于在检测到所述m+k个目标存储节点中存在故障存储节点时,待所述故障存储节点的故障修复后,判断所述m+k个目标存储节点上的目标EC条带的版本号是否相同,其中,所述m+k个目标存储节点上的所述目标EC条带的版本号包括:已生成准备日志的目标存储节点上的准备日志中目标EC条带的版本号,和/或,没有准备日志的目标存储节点所存储的目标EC条带的版本号;
[0045] 所述消息发送模块具体用于:若所述m+k个目标存储节点中的所有目标存储节点上的目标EC条带的版本号相同,则向已生成准备日志的目标存储节点发送执行消息,所述执行消息用于指示目标存储节点写入所述准备日志中的目标EC block。
[0046] 结合本发明实施例的第三方面的第二种实现方式,本发明实施例的第三方面的第三种实现方式中,所述消息发送模块还用于:
[0047] 若所述m+k个目标存储节点中的目标存储节点上的目标EC条带的版本号不相同,则向已生成准备日志的目标存储节点发送删除消息,所述删除消息用于指示目标存储节点删除所述准备日志。
[0048] 本发明实施例的第四方面提供了一种数据恢复装置,用于分布式存储系统,所述分布式存储系统通过纠删码EC条带来存储数据,每个EC条带包括数据部分和校验部分,所述每个EC条带的数据部分包括m个数据块,所述每个EC条带的校验部分包括对所述m个数据块进行校验编码后得到的k个校验块,所述m个数据块和所述k个校验块组成所述每个EC条带的EC block;每个EC条带对应有key值,且数据部分的地址范围相同的EC条带的key值相同,数据部分的地址范围不同的EC条带的key值不同;所述分布式存储系统包括多个存储节点组,每个存储节点组包括不少于m+k个存储节点,每个存储节点组指定一个主存储节点,所述每个存储节点组中除主存储节点之外的节点为备存储节点,所述m、k均为正整数;
[0049] 所述分布式存储系统的任意一个存储节点组的备存储节点中存在故障存储节点,所述数据恢复装置部署在所述故障存储节点所在的存储节点组的主存储节点上,所述数据恢复装置包括:
[0050] 修复消息模块,用于当所述故障存储节点的故障修复后,接收所述故障存储节点发送的修复消息;
[0051] 数据计算模块,用于根据所述存储节点组内非故障存储节点存储的EC block,计算得到N个所述故障存储节点的缺失的EC block,所述N为正整数;
[0052] 数据发送模块,用于:依次将所述N个缺失的EC block发送给所述故障存储节点以执行存储;
[0053] key值判断模块,用于:若在所述依次将所述N个缺失的EC block发送给所述故障存储节点的过程中,所述主存储节点生成了第一EC block,并确定由所述故障存储节点存储所述第一EC block,则判断所述故障存储节点当前未成功存储的所述缺失的EC block中,是否存在与所述第一EC block的key值相同的第二EC block;
[0054] 所述数据发送模块还用于:若所述key值判断模块确定存在所述第二EC block,则待所述故障存储节点成功存储了所述第二EC block后,再将所述第一EC block发送给所述故障存储节点以执行存储。
[0055] 结合本发明实施例的第四方面,本发明实施例的第四方面的第一种实现方式中,所述数据发送模块具体用于:
[0056] 将第n个缺失的EC block发送给所述故障存储节点,其中1≤n≤N;
[0057] 接收所述第n个缺失的EC block对应的响应消息,所述响应消息由所述故障存储节点发送,所述响应消息用于表示所述故障存储节点成功存储了所述第n个缺失的EC block;
[0058] 在接收所述故障存储节点对所述第n个缺失的EC block的响应消息后,若n<N,则n值加1,并再次执行所述将第n个缺失的EC block发送给所述故障存储节点的步骤。
[0059] 结合本发明实施例的第四方面的第一种实现方式,本发明实施例的第四方面的第二种实现方式中,所述当前未成功存储的所述缺失的EC block包括:当前还未发送给所述故障存储节点的所述缺失的EC block,以及当前已发送给所述故障存储节点但没有接收到对应的响应消息的所述缺失的EC block。
[0060] 结合本发明实施例的第四方面、第四方面的第一种或第二种实现方式,本发明实施例的第四方面的第三种实现方式中,所述分布式存储系统的逻辑卷包括多个逻辑区域,每个逻辑区域为k个数据块的大小且互不重叠,每个所述逻辑区域唯一对应一个key值,每个EC block落在的逻辑区域的key值即为所述EC block的key值。
[0061] 本发明实施例的第五方面提供了一种数据存储装置,所述数据存储装置包括输入装置、输出装置、处理器和存储器,其中,通过调用存储器存储的操作指令,所述处理器用于:
[0062] 接收待存储的数据段,对所述待存储的数据段进行EC编码得到目标EC条带,所述待存储的数据段的大小不大于Z,所述Z为m个数据块的大小,所述目标EC条带包括m+k个目标EC block,所述m+k个目标EC block包括m个目标数据块和k个目标校验块;
[0063] 确定m+k个目标存储节点,其中,所述m+k个目标存储节点用于存储所述m+k个目标EC block,每个目标存储节点存储一个所述目标EC block;
[0064] 向所述m+k个目标存储节点分别发送准备消息,每个准备消息中包括所述每个目标存储节点需要存储的目标EC block;
[0065] 接收所述m+k个目标存储节点中的任意一个目标存储节点发送的响应消息,所述响应消息用于表示当前发送所述响应消息的目标备存储节点已经根据所述准备消息生成了准备日志,所述准备日志中包括所述当前发送所述响应消息的目标存储节点需要存储的目标EC block;
[0066] 在接收到了所述m+k个目标存储节点中的所有目标存储节点的响应消息后,向所述m+k个目标存储节点发送执行消息,所述执行消息用于指示所述m+k个目标存储节点写入所述准备日志中的目标EC block。
[0067] 结合本发明实施例的第五方面,本发明实施例的第五方面的第一种实现方式中,所述准备消息中还包括所述目标EC条带的版本号;
[0068] 所述准备日志中还包括所述目标EC条带的版本号;
[0069] 所述执行消息具体用于指示所述m+k个目标存储节点写入所述准备消息中的目标EC block和所述目标EC条带的版本号。
[0070] 结合本发明实施例的第五方面的第一种实现方式,本发明实施例的第五方面的第二种实现方式中,所述处理器还用于:
[0071] 若检测到所述m+k个目标存储节点中存在故障存储节点,则待所述故障存储节点的故障修复后,判断所述m+k个目标存储节点上的目标EC条带的版本号是否相同,其中,所述m+k个目标存储节点上的所述目标EC条带的版本号包括:已生成准备日志的目标存储节点上的准备日志中目标EC条带的版本号,和/或,没有准备日志的目标存储节点所存储的目标EC条带的版本号;
[0072] 若所述m+k个目标存储节点中的所有目标存储节点上的目标EC条带的版本号相同,则向已生成准备日志的目标存储节点发送执行消息,所述执行消息用于指示目标存储节点写入所述准备日志中的目标EC block。
[0073] 结合本发明实施例的第五方面的第二种实现方式,本发明实施例的第五方面的第三种实现方式中,所述处理器还用于:
[0074] 若所述m+k个目标存储节点中的目标存储节点上的目标EC条带的版本号不相同,则向已生成准备日志的目标存储节点发送删除消息,所述删除消息用于指示目标存储节点删除所述准备日志。
[0075] 本发明实施例的第六方面提供了一种数据恢复装置,所述数据恢复装置包括输入装置、输出装置、处理器和存储器,其中,通过调用存储器存储的操作指令,所述处理器用于:
[0076] 当所述故障存储节点的故障修复后,接收所述故障存储节点发送的修复消息;
[0077] 根据本存储节点组内非故障存储节点存储的EC block,计算得到N个所述故障存储节点的缺失的EC block,所述N为正整数;
[0078] 依次将所述N个缺失的EC block发送给所述故障存储节点以执行存储;
[0079] 若在所述依次将所述N个缺失的EC block发送给所述故障存储节点的过程中,所述主存储节点生成了第一EC block,并确定由所述故障存储节点存储所述第一EC block,则判断所述故障存储节点当前未成功存储的所述缺失的EC block中是否存在与所述第一EC block的key值相同的第二EC block;
[0080] 若确定存在所述第二EC block,则待所述故障存储节点成功存储了所述第二EC block后,再将所述第一EC block发送给所述故障存储节点以执行存储。
[0081] 结合本发明实施例的第六方面,本发明实施例的第六方面的第一种实现方式中,所述处理器还用于:
[0082] 将第n个缺失的EC block发送给所述故障存储节点,其中1≤n≤N;
[0083] 接收所述第n个缺失的EC block对应的响应消息,所述响应消息由所述故障存储节点发送,所述响应消息用于表示所述故障存储节点成功存储了所述第n个缺失的EC block;
[0084] 在接收所述故障存储节点对所述第n个缺失的EC block的响应消息后,若n<N,则n值加1,并再次执行所述将第n个缺失的EC block发送给所述故障存储节点的步骤。
[0085] 结合本发明实施例的第六方面的第一种实现方式,本发明实施例的第六方面的第二种实现方式中,所述当前未成功存储的所述缺失的EC block包括:当前还未发送给所述故障存储节点的所述缺失的EC block,以及当前已发送给所述故障存储节点但没有接收到对应的响应消息的所述缺失的EC block。
[0086] 结合本发明实施例的第六方面、第六方面的第一种或第二种实现方式,本发明实施例的第六方面的第三种实现方式中,所述分布式存储系统的逻辑卷包括多个逻辑区域,每个逻辑区域为k个数据块的大小且互不重叠,每个所述逻辑区域唯一对应一个key值,每个EC block落在的逻辑区域的key值即为所述EC block的key值。
[0087] 本发明实施例的第七方面提供了一种计算机可读介质,包括计算机执行指令,当计算机的处理器执行所述计算机执行指令时,所述计算机执行如下方法:
[0088] 接收待存储的数据段,对所述待存储的数据段进行EC编码得到目标EC条带,所述待存储的数据段的大小不大于Z,所述Z为m个数据块的大小,所述目标EC条带包括m+k个目标EC block,所述m+k个目标EC block包括m个目标数据块和k个目标校验块;
[0089] 确定m+k个目标存储节点,其中,所述m+k个目标存储节点用于存储所述m+k个目标EC block,每个目标存储节点存储一个所述目标EC block;
[0090] 向所述m+k个目标存储节点分别发送准备消息,每个准备消息中包括所述每个目标存储节点需要存储的目标EC block;
[0091] 接收所述m+k个目标存储节点中的任意一个目标存储节点发送的响应消息,所述响应消息用于表示当前发送所述响应消息的目标备存储节点已经根据所述准备消息生成了准备日志,所述准备日志中包括所述当前发送所述响应消息的目标存储节点需要存储的目标EC block;
[0092] 在接收到了所述m+k个目标存储节点中的所有目标存储节点的响应消息后,向所述m+k个目标存储节点发送执行消息,所述执行消息用于指示所述m+k个目标存储节点写入所述准备日志中的目标EC block。
[0093] 结合本发明实施例的第七方面,本发明实施例的第七方面的第一种实现方式中,所述准备消息中还包括所述目标EC条带的版本号;
[0094] 所述准备日志中还包括所述目标EC条带的版本号;
[0095] 所述执行消息具体用于指示所述m+k个目标存储节点写入所述准备消息中的目标EC block和所述目标EC条带的版本号。
[0096] 结合本发明实施例的第七方面的第一种实现方式,本发明实施例的第七方面的第二种实现方式中,所述计算机还执行如下方法:
[0097] 若检测到所述m+k个目标存储节点中存在故障存储节点,则待所述故障存储节点的故障修复后,判断所述m+k个目标存储节点上的目标EC条带的版本号是否相同,其中,所述m+k个目标存储节点上的所述目标EC条带的版本号包括:已生成准备日志的目标存储节点上的准备日志中目标EC条带的版本号,和/或,没有准备日志的目标存储节点所存储的目标EC条带的版本号;
[0098] 若所述m+k个目标存储节点中的所有目标存储节点上的目标EC条带的版本号相同,则向已生成准备日志的目标存储节点发送执行消息,所述执行消息用于指示目标存储节点写入所述准备日志中的目标EC block。
[0099] 结合本发明实施例的第七方面的第二种实现方式,本发明实施例的第七方面的第三种实现方式中,所述计算机还执行如下方法:
[0100] 若所述m+k个目标存储节点中的目标存储节点上的目标EC条带的版本号不相同,则向已生成准备日志的目标存储节点发送删除消息,所述删除消息用于指示目标存储节点删除所述准备日志。
[0101] 本发明实施例的第八方面提供了一种计算机可读介质,包括计算机执行指令,当计算机的处理器执行所述计算机执行指令时,所述计算机执行如下方法:
[0102] 当所述故障存储节点的故障修复后,接收所述故障存储节点发送的修复消息;
[0103] 根据本存储节点组内非故障存储节点存储的EC block,计算得到N个所述故障存储节点的缺失的EC block,所述N为正整数;
[0104] 依次将所述N个缺失的EC block发送给所述故障存储节点以执行存储;
[0105] 若在所述依次将所述N个缺失的EC block发送给所述故障存储节点的过程中,所述主存储节点生成了第一EC block,并确定由所述故障存储节点存储所述第一EC block,则判断所述故障存储节点当前未成功存储的所述缺失的EC block中是否存在与所述第一EC block的key值相同的第二EC block;
[0106] 若确定存在所述第二EC block,则待所述故障存储节点成功存储了所述第二EC block后,再将所述第一EC block发送给所述故障存储节点以执行存储。
[0107] 结合本发明实施例的第八方面,本发明实施例的第八方面的第一种实现方式中,所述计算机还执行如下方法:
[0108] 将第n个缺失的EC block发送给所述故障存储节点,其中1≤n≤N;
[0109] 接收所述第n个缺失的EC block对应的响应消息,所述响应消息由所述故障存储节点发送,所述响应消息用于表示所述故障存储节点成功存储了所述第n个缺失的EC block;
[0110] 在接收所述故障存储节点对所述第n个缺失的EC block的响应消息后,若n<N,则n值加1,并再次执行所述将第n个缺失的EC block发送给所述故障存储节点的步骤。
[0111] 结合本发明实施例的第八方面的第一种实现方式,本发明实施例的第八方面的第二种实现方式中,所述当前未成功存储的所述缺失的EC block包括:当前还未发送给所述故障存储节点的所述缺失的EC block,以及当前已发送给所述故障存储节点但没有接收到对应的响应消息的所述缺失的EC block。
[0112] 结合本发明实施例的第八方面、第八方面的第一种或第二种实现方式,本发明实施例的第八方面的第三种实现方式中,所述分布式存储系统的逻辑卷包括多个逻辑区域,每个逻辑区域为k个数据块的大小且互不重叠,每个所述逻辑区域唯一对应一个key值,每个EC block落在的逻辑区域的key值即为所述EC block的key值。
[0113] 本发明实施例的第九方面提供了一种存储节点,包括本发明实施例的第三方面、第三方面的第一种至第三种实现方式中任一项所述的数据存储装置,和/或,本发明实施例的第四方面、第四方面的第一种至第三种实现方式中任一项所述的数据恢复装置,和/或,包括本发明实施例的第五方面、第五方面的第一种至第三种实现方式中任一项所述的数据存储装置,和/或,本发明实施例的第六方面、第六方面的第一种至第三种实现方式中任一项所述的数据恢复装置,和/或,包括本发明实施例的第七方面、第七方面的第一种至第三种实现方式中任一项所述的计算机可读介质,和/或,本发明实施例的第八方面、第八方面的第一种至第三种实现方式中任一项所述的计算机可读介质。
[0114] 本发明实施例提供数据存储方法包括:主节点对待存储的数据段进行EC编码得到目标EC条带,目标EC条带包括m+k个目标EC block;确定存储节点组的备存储节点中,用于存储该m+k个目标EC block的m+k个目标存储节点;向目标存储节点发送准备消息,准备消息中携带有该目标存储节点要存储的一个目标EC block;接收目标存储节点发送的响应消息;在接收到所有目标存储节点发送的响应消息后,向所有的目标存储节点发送执行消息,指示目标存储节点写入准备消息中的目标EC block。本实施例提供的方法中,用于存储目标EC条带的m+k个目标存储节点并不是直接写入要存储的目标EC block,而是先将要存储的目标EC block写入本地生成的准备日志中,当所有的目标存储节点都生成了准备日志之后,再一同写入目标EC block。由于只有在所有的目标存储节点都生成了准备日志的情况下,目标存储节点才执行将目标EC block写入正确的位置的操作,因此即使在目标存储节点写入目标EC block的过程中出现故障,目标EC block也已经保存到了目标存储节点的准备日志中,这样就能保证不论写入目标EC block的操作是否成功,目标EC block都不会丢失,避免了部分目标存储节点上有目标EC条带的目标EC block,而另一部分目标存储节点没有目标EC条带的目标EC block的情况,使得目标EC条带能够一致存储,提高了分布式存储系统的存储一致性。

附图说明

[0115] 图1(a)为EC条带的结构图;
[0116] 图1(b)为本发明实施例中分布式存储系统的一个结构示意图;
[0117] 图2为本发明实施例中数据存储方法一个实施例流程图;
[0118] 图3为本发明实施例中数据存储方法另一个实施例流程图;
[0119] 图4为本发明实施例中数据存储方法另一个实施例流程图;
[0120] 图5为本发明实施例中数据恢复方法一个实施例流程图;
[0121] 图6为本发明实施例中数据存储装置一个实施例结构图;
[0122] 图7为本发明实施例中数据分发装置另一个实施例结构图;
[0123] 图8为本发明实施例中数据恢复装置另一个实施例结构图;
[0124] 图9为本发明实施例中数据存储装置另一个实施例结构图;
[0125] 图10为本发明实施例中数据分发装置另一个实施例结构图;
[0126] 图11为本发明实施例中数据恢复装置另一个实施例结构图。

具体实施方式

[0127] 本发明实施例提供了一种数据存储方法,用于提升分布式存储系统的一致性。本发明实施例还提供了同步方法、相关装置以及系统,以下将分别进行说明。
[0128] 分布式存储系统中包括多个存储节点。上层的数据下发装置将待存储的数据分为多个数据块,然后下发给分布式存储系统的多个存储节点进行存储。将数据分布式存储能够降低数据丢失的风险,提高分布式存储系统的可靠性。其中,数据下发装置可以为客户端、服务器或其他设备。
[0129] EC技术原理是将待存储的数据进行分割成m个数据块,并且采用冗余算法对m个数据块进行校验编码,生成k个校验块,该m个数据块与k个校验块组成一条EC条带,EC条带的基本结构请参阅图1(a)。其中,每个数据块或校验块也可以称为一个EC block,该m个数据块和k个校验块组成每个EC条带的所有EC block。每个EC条带能容忍k个EC block的丢失。分布式存储系统使用EC技术进行数据存储时,数据下发装置会根据待存储的数据生成多条EC条带,并将每个EC条带的m+k个EC block下发给分布式存储系统的m+k个存储节点进行存储。这样,当分布式存储系统中有节点故障时,可以根据非故障节点上的EC block将故障节点上存储的EC block恢复出来。除非存储某条EC条带的m+k个存储节点中有多于k个存储节点发生故障,否则该条EC条带的数据可以被数据下发装置完整的读写。因此,采用EC技术存储数据的分布式存储系统具有很高的可靠性。
[0130] 存储到分布式存储系统中的EC条带可以被数据下发装置取读或改写。值得指出的是,数据下发装置在取读时,只需要取读EC条带中用于存储数据的数据块,但是在改写时,例如对某条EC条带的m个数据块中的第i个数据块进行改写时,该条EC条带的其余数据块无需被改动,但是需要重新生成该条EC条带的校验块。
[0131] 特别的,本发明实例中对分布式存储系统中的存储节点进行了分组,具体的,将存储节点分为多个存储节点组,每个存储节点组包括的存储节点的个数不小于m+k,且每个存储节点组指定一个主存储节点(下文简称主节点),其余的存储节点为备存储节点(下文简称备节点)。其中,m、k均为正整数。其中,不同的存储节点组的存储节点可以重复,例如,存储节点组1的主节点可以是存储节点组2的备节点。图1(b)本发明实施例中分布式存储系统的一个结构示意图。其中,图1(b)仅用于表示分布式存储系统中的存储节点的一种组成结构,分布式存储系统中各个存储节点也可以为其他结构。
[0132] 基于上面所述的分布式存储系统,本发明实施例提出了一种数据存储方法,适用于分布式存储系统的任意一个存储节点组中的主节点,其基本流程请参阅图2:
[0133] 201、对待存储的数据段进行EC编码得到目标EC条带;
[0134] 主节点接收数据下发装置下发的待存储的数据段,其中,待存储的数据段的大小不大于Z,Z为m个数据块的大小。编码后的目标EC条带包括m+k个目标EC block,具体包括m个目标数据块和k个目标校验块。
[0135] 202、确定m+k个目标存储节点;
[0136] 主节点在生成了m+k个目标EC block后,在所在的存储节点组中,确定用于存储该m+k个目标EC block的m+k个目标存储节点。其中,该m+k个目标存储节点可以包括该主节点和m+k-1个备节点,也可以包括m+k个备节点。其中,每个目标存储节点至多只能存储一个EC block。
[0137] 特别的,若该存储节点组只有m+k个存储节点(主节点和m+k-1个备节点),则主节点直接确定该m+k个存储节点为目标存储节点。
[0138] 203、向目标存储节点发送准备消息;
[0139] 主节点确定了目标存储节点后,向该m+k个目标存储节点分别发送准备消息,每个准备消息中携带有每个目标存储节点需要存储的一个目标EC block。
[0140] 对于身份为备节点的目标存储节点,主节点向该目标存储节点发送的准备消息为通过网络发送的节点间的消息。但步骤202中提到,主节点也可能为目标存储节点之一。若主节点为目标存储节点,则本步骤中主节点也会向主节点自身发送准备消息,但向自身发送的准备消息为不经过网络的、节点内部的消息。
[0141] 204、接收目标存储节点发送的响应消息;
[0142] 当目标存储节点接收到了主节点发送的准备消息后,会根据该准备消息生成准备日志,其中,准备日志保存在目标存储节点本地,准备日志的作用主要为暂时保存该目标存储节点要存储的EC block,因此准备日志的保存位置并不是目标EC block最终的保存位置。准备日志在实际应用中可以为日志、数据块或其他任意形式,本实施例中不做限定,但准备日志中需包括该目标存储节点接收到的准备消息中的目标EC block。
[0143] 目标存储节点生成了准备日志后,会向主节点发送响应消息,用于告知主节点,当前发送该响应消息的目标备存储节点已经根据准备消息生成了准备日志。
[0144] 身为备节点的目标存储节点向主节点发送的响应消息为通过网络发送的节点间的消息。但若主节点也为目标存储节点之一,则本步骤中,主节点也会向主节点自身发送响应消息,但向自身发送的响应消息为不经过网络的、节点内部的消息。
[0145] 主节点接收该m+k个个目标存储节点中的任意一个或多个目标存储节点发送的响应消息,并在接收到该m+k个目标存储节点中的所有目标存储节点发送的响应消息后,执行步骤205。
[0146] 205、向目标存储节点发送执行消息;
[0147] 主节点在接收到所有目标存储节点发送的响应消息后,向该m+k个目标存储节点发送执行消息,指示该m+k个目标存储节点写入准备日志中的目标EC block。该m+k个目标存储节点接收到该执行消息后,从准备日志的存储位置将准备日志读出,并将准备日志中的目标EC block写入到目标存储节点中用于存储该目标EC block的位置。
[0148] 对于身份为备节点的目标存储节点,主节点向该目标存储节点发送的执行消息为通过网络发送的节点间的消息。但步骤202中提到,主节点也可能为目标存储节点之一。若主节点为目标存储节点,则本步骤中主节点也会向主节点自身发送执行消息,但向自身发送的执行消息为不经过网络的、节点内部的消息。
[0149] 本实施例提供了一种数据存储方法,包括:对待存储的数据段进行EC编码得到目标EC条带,目标EC条带包括m+k个目标EC block;确定存储节点组的备存储节点中,用于存储该m+k个目标EC block的m+k个目标存储节点;向目标存储节点发送准备消息,准备消息中携带有该目标存储节点要存储的一个目标EC block;接收目标存储节点发送的响应消息;在接收到所有目标存储节点发送的响应消息后,向所有的目标存储节点发送执行消息,指示目标存储节点写入准备消息中的目标EC block。本实施例提供的方法中,用于存储目标EC条带的m+k个目标存储节点并不是直接写入要存储的目标EC block,而是先将要存储的目标EC block写入本地生成的准备日志中,当所有的目标存储节点都生成了准备日志之后,再一同写入目标EC block。由于只有在所有的目标存储节点都生成了准备日志的情况下,目标存储节点才执行将目标EC block写入正确的位置的操作,因此即使在目标存储节点写入目标EC block的过程中出现故障,目标EC block也已经保存到了目标存储节点的准备日志中,这样就能保证不论写入目标EC block的操作是否成功,目标EC block都不会丢失,避免了部分目标存储节点上有目标EC条带的目标EC block,而另一部分目标存储节点没有目标EC条带的目标EC block的情况,使得目标EC条带能够一致存储,提高了分布式存储系统的存储一致性。
[0150] 优选的,作为本发明的又一个实施例,为了保证在目标存储节点故障时,目标存储节点生成的准备日志不丢失,因此目标存储节点可以将准备日志写入掉电保护介质中。
[0151] 本发明实施例中引入EC条带的key值的概念。具体的,EC条带的key值与EC条带的数据部分的地址范围对应,数据部分的地址范围相同的EC条带的key值相同,数据部分的地址范围不同的EC条带的key值不同。EC条带可以在EC条带的每个EC block中携带该key值。
[0152] 其中,EC条带的key值可以来源于数据下发装置向主节点下发的数据段。例如,分布式存储系统的卷逻辑可以分为多个逻辑区域,每个逻辑区域的大小均为k个数据块的大小。数据下发装置将带存储的数据划分为多个数据段,具体的,将落在一个逻辑区域内的数据划分为一个数据段。其中,分布式存储系统的每个逻辑区域设置有唯一的key值,每个数据段落在的逻辑区域所对应的key值,就是该数据段对应的key值。数据下发装置将key值携带在数据段中下发给主节点,主节点根据该数据段生成的EC条带具有与该数据段相同的key值。
[0153] 从上述描述可以看出,key值可以用来标识数据的地址范围。另外,步骤205中提到,目标存储节点接收到执行消息后,从准备日志的存储位置将准备日志读出,并将准备日志中的目标EC block写入到目标存储节点中用于存储该目标EC block的位置。具体的,若该目标存储节点中并没有存储过与准备日志中的目标EC block携带的key值相同的EC block,则目标存储节点为该目标EC block分配新的存储位置。若该目标存储节点中存储过与准备日志中的目标EC block携带的key值相同的EC block,则说明目标EC block的地址范围已经写入了旧的数据,目标存储节点将目标EC block写入原本用来存储与目标EC block的key值相同的EC block的位置上,以实现新数据对旧数据的覆盖。可以理解的,由于新数据会对旧数据进行覆盖,因此每个存储节点上存储的多个EC block的key值各不相同。
[0154] 本发明实施例中还引入EC条带的版本号的概念,具体的,版本号用于标识key值相同的两条EC条带的新旧程度,写入较新的EC条带会覆盖较旧的EC条带。例如在某一时刻,某个主节点生成了数据部分的地址范围为4M~8M,key值为2的EC条带,该EC条带的版本号为1,主节点将版本号为1的EC条带分配给6个存储节点进行存储。一小时后,主节点再次生成了数据部分的地址范围为4M~8M,key值为2的另一个EC条带,该EC条带的版本号为2。主节点将版本号为2的EC条带写入原本用于存储版本号为1的EC条带的位置,使得版本号为2的EC条带覆盖掉版本号为1的EC条带。其中,目标EC条带的版本号可以在目标EC条带的每个目标EC block中携带。
[0155] 本发明实施例中,主节点向目标存储节点发送的准备消息中还包括目标EC条带的版本号,进而目标存储节点根据准备消息生成的准备日志中也包括该目标EC条带的版本号。执行消息具体指示该m+k个目标存储节点写入准备消息中的目标EC block以及目标EC条带的版本号。引入了版本号的概念之后,就可以根据版本号来判断EC条带的存储是否一致,若存储目标EC条带的目标存储节点上写入的目标EC条带的版本号相同,则说明目标EC条带的存储一致,若存储目标EC条带的目标存储节点上写入的目标EC条带的版本号不相同,则说明目标EC条带的存储不一致。
[0156] 由于分布式存储系统的存储节点组中的存储节点随时可能发生故障,因此需要对存储节点组进行维护。存储节点组的维护有很多种方式,例如,可以设置额外的节点组管理模块。该节点组管理模块可以部署在数据下发装置上,也可以部署在存储节点上,本发明实施例中不做限定。其中,节点组管理模块负责维护各个存储节点组,具体的,节点组管理模块可以负责收集各个存储节点组所包括的存储节点、确定主节点,并通过心跳连接实时监控各存储节点的状态。当存储节点状态变化或节点组主节点变更时,节点组管理模块均需要更新收集到的信息。节点组管理模块将收集到的信息告知每个存储节点进行记录,使得每个数据下发装置和存储节点都能获知每个节点组的信息。节点组管理模块收集到的信息可以简单的表示为表(1)的形式:
[0157]
[0158]
[0159] 表(1)
[0160] 其中,表(1)仅为节点组管理模块收集到的信息的一种表现形式,节点组管理模块可以用其他形式来表现收集到的信息,本发明实施例中不做限定。
[0161] 若主节点在步骤202确定了目标存储节点之后,通过节点组管理模块检测到该m+k个目标存储节点中存在故障存储节点,则主节点需要中断数据存储流程,并修复故障存储节点。故障存储节点修复后,主节点需要继续数据存储流程,具体请参阅步骤一至三:
[0162] 步骤一:判断该m+k个目标存储节点上,目标EC条带的版本号是否相同。其中,若目标存储节点已生成准备日志,则目标存储节点上的目标EC条带的版本号可以为准备日志中目标EC条带的版本号,若目标存储节点没有准备日志,则目标存储节点上的目标EC条带的版本号可以为目标存储节点已经存储的目标EC条带的版本号。
[0163] 若该m+k个目标存储节点中所有目标存储节点上的目标EC条带的版本号相同,则说明没有准备日志的目标存储节点已经完成了写入准备日志中要存储的目标EC block的操作,执行步骤二;
[0164] 若该m+k个目标存储节点上的目标EC条带的版本号不相同,则说明没有准备日志的目标存储节点没有生成准备日志,更没有写入要存储的目标EC block,执行步骤三。
[0165] 步骤二:向已生成准备日志的目标存储节点发送执行消息,该执行消息用于指示目标存储节点写入准备日志中的目标EC block。已生成准备日志的目标存储节接收该执行消息后,写入准备日志中的目标EC block,使得目标EC条带被一致保存到目标存储节点中。
[0166] 步骤三:向已生成准备日志的目标存储节点发送删除消息,该删除消息用于指示目标存储节点删除准备日志。已生成准备日志的目标存储节接收该删除消息后,删除本地保存的准备日志,使得目标EC条带的目标EC block不被写入任何一个目标存储节点中。
[0167] 特别的,若故障存储节点为主节点,则主节点管理模块可以指定一个备节点为新的主节点,然后重新执行步骤一至三。
[0168] 上面的实施例从主节点的角度解释了本发明实施例提供的数据存储方法,下面的实施例将站在一个备节点的角度解释本发明实施例提供的数据存储方法,其基本流程请参阅图3,包括:
[0169] 301、接收主节点发送的准备消息;
[0170] 主节点生成目标EC条带,并确定用于存储该目标EC条带的m+k个目标存储节点。本实施例中所述的备节点为该目标存储节点中的一个节点。
[0171] 备节点接收主节点发送的准备消息,该准备消息用于在主节点确定该备节点为用于存储目标EC block的目标存储节点时发送,该准备消息中包括该备节点要存储的目标EC block。
[0172] 302、根据该准备消息生成准备日志;
[0173] 备节点收到了主节点发送的准备消息后,会根据该准备消息生成准备日志,其中,准备日志保存在该备节点本地,准备日志的作用主要为暂时保存该备节点要存储的EC block,因此准备日志的保存位置并不是目标EC block最终的保存位置。准备日志在实际应用中可以为日志、数据块或其他任意形式,本实施例中不做限定,但准备日志中需包括准备消息中携带的目标EC  block。所述准备日志中包括所述备存储节点要存储的目标EC block。
[0174] 303、向主节点发送响应消息;
[0175] 备节点生成了准备日志后,向主节点发送响应消息,该响应消息用于表示备节点根据准备消息生成了准备日志。
[0176] 可以理解的,存储节点组中的其他目标存储节点也会向主节点发送该响应消息。
[0177] 304、接收主节点发送的送执行消息;
[0178] 备节点接收主节点发送的执行消息,该执行消息由主节点在接收到所有目标存储节点的响应消息后发送,该执行消息用于指示写入准备日志中的目标EC block。
[0179] 305、写入准备日志中的目标EC block。
[0180] 备节点接收到执行消息后,写入准备日志中携带的目标EC block。
[0181] 本实施例站在一个备节点的角度来描述本发明实施例提供的数据存储方法。其中,备节点接收主节点发送的准备消息;根据该准备消息生成准备日志;向主节点发送响应消息;接收主节点发送的送执行消息;根据执行消息,写入准备日志中的目标EC block。本实施例提供的方法中,备节点并不是直接写入要存储的目标EC block,而是先将要存储的目标EC block写入本地生成的准备日志中,当接收到主节点发送的执行消息后,再写入目标EC block,因此即使备节点在写入目标EC block的过程中出现故障,目标EC block也已经保存到了备节点的准备日志中,这样就能保证不论写入目标EC block的操作是否成功,目标EC block都不会丢失。若主节点确定的所有目标存储节点上的目标EC block都不丢失,就可以避免部分目标存储节点上有目标EC条带的目标EC block,而另一部分目标存储节点没有目标EC条带的目标EC block的情况,使得目标EC条带能够一致存储,提高了分布式存储系统的存储一致性。
[0182] 优选的,作为本发明的又一个实施例,备节点接收到的主节点发送的准备消息中,还包括主节点生成的目标EC条带的版本号,进而备节点根据准备消息生成的准备日志中也包括该目标EC条带的版本号。备节点根据执行消息,写入目标EC block的同时,也写入目标EC条带的版本号。
[0183] 优选的,作为本发明的又一个实施例,为了备节点保证在故障时,生成的准备日志不丢失,因此备节点可以将准备日志写入掉电保护介质中。
[0184] 图1所示的实施例中,步骤三种提到,若主节点确定目标存储节点上的目标EC条带的版本号不相同,则主节点向已生成准备日志的目标存储节点发送删除消息。因此优选的,作为本发明的又一个实施例,备节点在步骤304之前,还可以接收主节点发送的删除消息。接收到删除消息后,删除本地保存的准备日志。
[0185] 为了便于理解上述实施例,下面将以上述实施例的一个具体应用场景为例进行描述,具体流程请参阅图4:
[0186] 分布式存储系统以EC条带的形式存储数据,每个EC条带包括4个数据块和2个校验块。分布式存储系统包括100个存储节点组,其中存储节点组1包括6个存储节点,主节点为节点A,备节点为节点B、节点C、节点D、节点E和节点F。
[0187] 401、生成目标EC条带。节点A接收数据下发装置下发的数据段,并对数据段进行EC编码,得到目标EC条带。其中,目标EC条带的版本号为3,目标EC条带的数据部分的地址范围为4M~8M。
[0188] 402、确定目标存储节点。节点A确定用于存储该目标EC条带的6个EC block的目标存储节点为节点A~F。
[0189] 403、发送准备消息。节点A向节点A~F发送准备消息,发送给每个节点的准备消息中均携带有一个目标EC block和目标EC条带的版本号,节点A~F接收该准备消息。
[0190] 404、生成准备日志。节点A~F生成准备日志,该准备日志中包括要存储的目标EC block和目标EC条带的版本号。
[0191] 405、发送响应消息。节点A~F在生成了准备日志后,向节点A发送响应消息。节点A接收节点A~F发送的响应消息。
[0192] 406、发送执行消息。节点A在接收到节点A~F发送的响应消息后,向节点A~F发送执行消息,节点A~F接收该执行消息。
[0193] 407、节点A~E写入准备日志中的目标EC block和版本号,节点F出现故障。在节点A发送执行消息后,节点A~E写入准备日志中的目标EC block和版本号,节点F在接收到执行消息的过程中出现故障。
[0194] 408、确定目标EC条带的版本号相同。节点A确定节点F出现故障,则待节点F故障恢复后,判断节点A~F上,目标EC条带的版本号是否相同。其中,节点A~E上没有准备日志,已经存储的目标EC block中携带的目标EC条带的版本号为3。节点F上有准备日志,准备日志中目标EC block中携带的目标EC条带的版本号为3。
[0195] 409、节点A向节点F发送执行消息。节点F接收该执行消息。
[0196] 410、节点F写入准备日志中的目标EC block和版本号。
[0197] 上面的实施例中提到,若有目标存储节点发生故障,则需要待故障存储节点的故障修复后再执行数据存储流程。但发生的故障有可能会导致故障存储节点中的数据丢失,此时主节点需要根据存储节点组中其他的存储节点上存储的EC block,使用EC技术计算得到故障存储节点缺失的EC block,然后将计算得到的EC block同步到修复后的估值存储节点中。为此,本发明实施例提供了一种数据恢复方法,具体包括:
[0198] 501、接收故障存储节点发送的修复消息;
[0199] 分布式存储系统中任意存储节点组存在故障存储节点,故障存储节点修复后,向主节点发送修复消息,该修复消息用于表示该故障存储节点已修复。主存储节点接收该修复消息。
[0200] 502、计算得到N个故障存储节点的缺失的EC block;
[0201] 上文中已经提到,分布式存储系统使用EC技术,以EC条带的形式存储数据,一个EC条带包括m+k个EC block,分别存储在一个存储节点组中的m+k个存储节点上,一个EC条带能够容忍k个EC block的丢失。以EC条带A为例,若故障存储节点上丢失了EC条带A的EC block,主节点可以根据非故障节点上存储的EC条带A的其他EC block,通过EC技术计算得到故障存储节点丢失的EC block。
[0202] 因此本实施例中,主节点接收到修复消息后,根据主节点所在的本存储节点组中的非故障存储节点(即除故障存储节点之外的存储节点)上存储的EC block,计算得到N个故障存储节点缺失的EC block。
[0203] 上文中已经提到,每个存储节点上存储的多个EC block的key值各不相同,因此故障存储节点所缺失的N个EC block应携带有不同的key值。
[0204] 503、依次将N个缺失的EC block发送给故障存储节点以执行存储,若主节点在依次将N个缺失的EC block发送给故障存储节点的过程中生成了第一EC block,并确定由故障存储节点存储该第一EC block,则判断故障存储节点当前未成功存储的缺失的EC block中,是否存在与第一EC block的key值相同的第二EC block,若判断结果为是,则待故障存储节点成功存储了第二EC block后,再将第一EC block发送给故障存储节点以执行存储。
[0205] 主节点计算得到N个故障存储节点缺失的EC block后,将该N个缺失的EC block排成发送队列,并依次向故障存储节点发送该N个缺失的EC block。
[0206] 若主节点在依次向故障存储节点发送该N个缺失的EC block的过程中,又生成了新的EC条带,并确定由该故障存储节点来存储该新的EC条带中的第一EC block,则主节点判断该N个缺失的EC block中,故障存储节点当前尚未成功存储的缺失的EC block中是否存在第二EC block,其中第二EC block与第一EC block的key值相同。
[0207] 可以理解的,若主节点在生成第一EC block后直接将第一EC block发送给了故障存储节点以执行存储,而故障存储节点当前尚未成功存储的缺失的EC block中又存在第二EC block,则当主节点继续执行依次向故障存储节点发送N个缺失的EC block的操作时,会造成第二EC block将第一EC block的数据覆盖掉的情况。为了避免较新的第一EC block被较旧的第二EC block覆盖,本实施例中,若主节点确定故障存储节点当前未成功存储的缺失的EC block中存在第二EC block,则主节点将第一EC block插入发送队列中第二EC block后面,即先不将第一EC block发送给故障存储节点,待故障存储节点成功存储了第二EC block后,再将第一EC block发送给故障存储节点以执行存储。
[0208] 本实施例提供了一种数据恢复方法,其中,主节点在故障存储节点修复后,计算得到N个故障存储节点缺失的EC block,并依次将该N个缺失的EC block发送给故障存储节点以执行存储。若主节点在依次将N个缺失的EC block发送给故障存储节点的过程中又生成了新的EC条带,并确定由该故障存储节点来存储该新的EC条带中的第一EC block,则主节点判断故障存储节点当前尚未成功存储的缺失的EC block中是否存在第二EC block,其中第二EC block与第一EC block的key值相同。若确定存在该第二EC block,则主节点待故障存储节点成功存储了第二EC block后,再将第一EC block发送给故障存储节点以执行存储。通过这样的方法,能够避免新数据被旧数据覆盖,保证了修复后的故障存储节点上存储的EC block为当前的最新版本。
[0209] 步骤503中,主节点依次将N个缺失的EC block发送给故障存储节点以执行存储。具体的,主节点从该N个缺失的EC block中的第1个缺失的EC block开始发送给故障存储节点,且主节点在将第n个缺失的EC block发送给故障存储节点后,接收该第n个缺失的EC block对应的响应消息,该响应消息由故障存储节点发送,用于表示故障存储节点成功存储了该第n个缺失的EC block。主节点在接收了该第n个缺失的EC block对应的响应消息后,再向故障存储节点发送下一个缺失的EC block,其中1≤n≤N。主节点依次将N个缺失的EC block发送给故障存储节点可以归纳为如下步骤:
[0210] 步骤一:主节点将第n个缺失的EC block发送给故障存储节点,其中,n在流程开始时的起始值为1,且n不大于N;
[0211] 步骤二:主节点将第n个缺失的EC block发送给故障存储节点后,接收该第n个缺失的EC block对应的响应消息;
[0212] 步骤三:主节点在接收到第n个缺失的EC block对应的响应消息后,若n<N,则n值加1,并再次执行步骤一。
[0213] 主节点通过循环执行步骤一至步骤三,可以实现将该N个缺失的EC block发送给故障存储节点以执行存储。
[0214] 若使用响应消息来表示故障存储节点成功存储了缺失的EC block,则步骤503中,主节点待故障存储节点成功存储了第二EC block后,再将第一EC block发送给故障存储节点以执行存储具体应为:主节点在将第二EC block发送给故障存储节点,并接收到故障存储节点发送的第二EC block的响应消息后,再将第一EC block发送给故障存储节点以执行存储。
[0215] 步骤503中,主节点需要判断该N个缺失的EC block中,故障存储节点当前尚未成功存储的缺失的EC block中是否存在第二EC block。可以理解的,该故障存储节点当前尚未成功存储的缺失的EC block应包括:主节点当前还未发送给故障存储节点的缺失的EC block,以及当前已发送给故障存储节点但没有接收到对应的响应消息的缺失的EC block。
[0216] 上文中提到,分布式存储系统的卷逻辑可以分为多个逻辑区域,每个逻辑区域的大小均为k个数据块的大小且互不重叠。分布式存储系统的每个逻辑区域设置有唯一的key值,每个数据段落在的逻辑区域所对应的key值,就是该数据段对应的key值。数据下发装置将key值携带在数据段中下发给主节点,主节点根据该数据段生成的EC条带具有与该数据段相同的key值,而EC条带的key值在EC条带的EC block中携带。因此可以理解的,每个EC block落在的逻辑区域的key值即为该EC block的key值。
[0217] 为了便于理解上述实施例,下面将以上述实施例的一个具体应用场景为例进行描述。
[0218] 分布式存储系统以EC条带的形式存储数据,每个EC条带包括4个数据块和2个校验块。分布式存储系统包括100个存储节点组,其中存储节点组1包括6个存储节点,主节点为节点A,备节点为节点B、节点C、节点D、节点E和节点F。某时刻,节点F发生故障。三小时后节点F修复但数据已丢失。
[0219] 节点F向节点A发送修复消息,告知节点A节点F的故障已修复。节点A接收该修复消息。
[0220] 节点A在接收到该修复消息后,根据节点A、节点B、节点C、节点D、节点E上存储的所有EC block,计算得到200个节点F缺失的EC block。
[0221] 主节点每次向节点F发送一个缺失的EC block,在接收到节点F对该缺失的EC block的响应消息后,再发送下一个缺失的EC block。这样依次将200个缺失的EC block发送给节点F。
[0222] 在将第151个缺失的EC block发送给节点F后,节点A根据数据下发装置下发的数据段生成了新的EC条带,并确定由节点F存储该新的EC条带中的第一EC block,其中第一EC block的key值为25。
[0223] 由于节点A当前并没有接收到节点F发送的第151个缺失的EC block的响应消息,因此节点A判断第151~第200个缺失的EC block中,是否存在key值为25的第二EC block。节点A确定第190个缺失的EC block的key值为25。
[0224] 节点A暂时不向节点F发送第一EC block,在将第190个缺失的EC block发送给节点F,并接收到节点F发送的第190个缺失的EC block的响应消息后,再向节点F发送第一EC block。
[0225] 节点A将全部200个缺失的EC block发送给节点F,节点F就完成了数据恢复。
[0226] 上面的实施例给出了本发明实施例提供的数据存储或数据恢复方法,下面将提供相应的装置,以实现上述方法。
[0227] 本发明实施例提供了一种数据存储装置,该数据存储装置部署在任意一个存储节点组的主存储节点上,具体包括:
[0228] 数据编码模块601,用于接收待存储的数据段,对待存储的数据段进行EC编码得到目标EC条带。其中,待存储的数据段的大小不大于Z,Z为m个数据块的大小,目标EC条带包括m+k个目标EC block,具体包括m个目标数据块和k个目标校验块;
[0229] 节点确定模块602,用于确定存储节点组中用于存储m+k个目标EC block的m+k个目标存储节点,其中,每个目标存储节点用于存储一个目标EC block;
[0230] 消息发送模块603,用于向该m+k个目标存储节点分别发送准备消息,其中,每个准备消息中包括每个目标存储节点需要存储的目标EC block;
[0231] 消息接收模块604,用于接收m+k个目标存储节点中的任意一个目标存储节点发送的响应消息,该响应消息用于表示当前发送所述响应消息的目标备存储节点根据准备消息生成了准备日志,其中,准备日志中包括当前发送所述响应消息的目标存储节点需要存储的目标EC block;
[0232] 消息发送模块603还用于:在消息接收模块604接收到了该m+k个目标存储节点中的所有目标存储节点的响应消息后,向该m+k个目标存储节点发送执行消息,该执行消息用于指示该m+k个目标存储节点写入准备日志中的目标EC block。
[0233] 本实施例提供的数据存储装置中,数据编码模块601对待存储的数据段进行EC编码得到目标EC条带;节点确定模块602确定存储节点组的备存储节点中,用于存储该m+k个目标EC block的m+k个目标存储节点;消息发送模块603向目标存储节点发送准备消息;消息接收模块604接收目标存储节点发送的响应消息;消息发送模块603在接收到所有目标存储节点发送的响应消息后,向所有的目标存储节点发送执行消息,指示目标存储节点写入准备消息中的目标EC block。本实施例提供的数据存储装置使得用于存储目标EC条带的m+k个目标存储节点并不是直接将要存储的目标EC block写入,而是先将要存储的目标EC block写入本地生成的准备日志中,当所有的目标存储节点都生成了准备日志之后,再一同写入目标EC block。由于只有在所有的目标存储节点都生成了准备日志的情况下,目标存储节点才执行将目标EC block写入正确的位置的操作,因此即使在目标存储节点写入目标EC block的过程中出现故障,目标EC block也已经保存到了目标存储节点的准备日志中,这样就能保证不论写入目标EC block的操作是否成功,目标EC block都不会丢失,避免了部分目标存储节点上有目标EC条带的目标EC block,而另一部分目标存储节点没有目标EC条带的目标EC block的情况,使得目标EC条带能够一致存储,提高了分布式存储系统的存储一致性。
[0234] 优选的,作为本发明的又一个实施例,为了保证在目标存储节点故障时,目标存储节点生成的准备日志不丢失,因此目标存储节点可以将准备日志写入掉电保护介质中。
[0235] 优选的,作为本发明的又一个实施例,主节点向目标存储节点发送的准备消息中还包括目标EC条带的版本号,进而目标存储节点根据准备消息生成的准备日志中也包括该目标EC条带的版本号。执行消息具体指示该m+k个目标存储节点写入准备消息中的目标EC block,以及目标EC条带的版本号。
[0236] 优选的,作为本发明的又一个实施例,数据存储装置还可以包括版本判断模块605,用于在检测到该m+k个目标存储节点中存在故障存储节点时,待故障存储节点的故障修复后,判断该m+k个目标存储节点上的目标EC条带的版本号是否相同,其中,该m+k个目标存储节点上的目标EC条带的版本号包括:已生成准备日志的目标存储节点上的准备日志中目标EC条带的版本号,和/或,没有准备日志的目标存储节点所存储的目标EC条带的版本号。消息发送模块603具体用于:若该m+k个目标存储节点中的所有目标存储节点上的目标EC条带的版本号相同,则向已生成准备日志的目标存储节点发送执行消息;若该m+k个目标存储节点中的目标存储节点上的目标EC条带的版本号不相同,则向已生成准备日志的目标存储节点发送删除消息,该删除消息用于指示目标存储节点删除所述准备日志。
[0237] 本发明实施例还提供了一种数据存储装置,用于部署在备节点上。其结构请参阅图7,包括:
[0238] 接收消息模块701,用于接收主存储节点发送的准备消息,准备消息中包括该数据存储装置所在的备存储节点要存储的目标EC block;
[0239] 日志生成模块702,用于根据准备消息生成准备日志,该准备日志中包括该备存储节点要存储的目标EC block;
[0240] 发送消息模块703,用于向主存储节点发送响应消息,该响应消息用于表示备存储节点根据准备消息生成了准备日志;
[0241] 接收消息模块701还用于:接收主存储节点发送的执行消息;
[0242] 数据写入模块704,用于根据该执行消息,写入准备日志中的目标EC block。
[0243] 本实施例提供的数据存储装置中,接收消息模块701接收主节点发送的准备消息;日志生成模块702根据该准备消息生成准备日志;发送消息模块703向主节点发送响应消息;接收消息模块701接收主节点发送的送执行消息;数据写入模块704根据执行消息,写入准备日志中的目标EC block。本实施例提供的数据存储装置并不是直接写入要存储的目标EC block,而是先将要存储的目标EC block写入本地生成的准备日志中,当接收到主节点发送的执行消息后,再写入目标EC block,因此即使备节点在写入目标EC block的过程中出现故障,目标EC block也已经保存到了备节点的准备日志中,这样就能保证不论写入目标EC block的操作是否成功,目标EC block都不会丢失。若主节点确定的所有目标存储节点上的目标EC block都不丢失,就可以避免部分目标存储节点上有目标EC条带的目标EC block,而另一部分目标存储节点没有目标EC条带的目标EC block的情况,使得目标EC条带能够一致存储,提高了分布式存储系统的存储一致性。
[0244] 优选的,作为本发明的又一个实施例,该备存储节点要存储的目标EC block为主存储节点生成的目标EC条带中的一个数据块或校验块,该准备消息中,还包括主节点生成的目标EC条带的版本号,进而备节点根据准备消息生成的准备日志中也包括该目标EC条带的版本号。备节点根据执行消息,写入目标EC block的同时,也写入目标EC条带的版本号。
[0245] 优选的,作为本发明的又一个实施例,接收消息模块701还用于接收所述主存储节点发送的删除消息;数据存储装置还可以包括数据删除模块705,用于根据该删除消息删除准备日志。
[0246] 可以理解的,存储节点的身份是主节点或者备节点是可以自由设定的,且一个存储节点可以为一个存储节点组的主节点,同时又为另一个存储节点组的备节点,因此图6和图7所示的数据存储装置可以位于同一个存储节点上。
[0247] 为了便于理解上述实施例,下面将以上述实施例的一个具体应用场景为例进行描述,具体流程请仍参阅图4:
[0248] 分布式存储系统以EC条带的形式存储数据,每个EC条带包括4个数据块和2个校验块。分布式存储系统包括100个存储节点组,其中存储节点组1包括6个存储节点,主节点为节点A,备节点为节点B、节点C、节点D、节点E和节点F。
[0249] 401、生成目标EC条带。节点A接收数据下发装置下发的数据段,节点A的数据编码模块对数据段进行EC编码,得到目标EC条带。其中,目标EC条带的版本号为3,目标EC条带的数据部分的地址范围为4M~8M。
[0250] 402、确定目标存储节点。节点A的节点确定模块确定用于存储该目标EC条带的6个EC block的目标存储节点为节点A~F。
[0251] 403、发送准备消息。节点A的消息发送模块向节点A~F发送准备消息,发送给每个节点的准备消息中均携带有一个目标EC block和目标EC条带的版本号,节点A~F的接收消息模块接收该准备消息。
[0252] 404、生成准备日志。节点A~F的日志生成模块生成准备日志,该准备日志中包括要存储的目标EC block和目标EC条带的版本号。
[0253] 405、发送响应消息。在生成了准备日志后,节点A~F的发送消息模块向节点A发送响应消息。节点A的消息接收模块接收节点A~F发送的响应消息。
[0254] 406、向节点A~F发送执行消息。在接收到节点A~F发送的响应消息后,节点A的消息发送模块向节点A~F发送执行消息,节点A~F的接收消息模块接收该执行消息。
[0255] 407、节点A~E写入准备日志中的目标EC block和版本号,节点F出现故障。在节点A发送执行消息后,节点A~E的数据写入模块写入准备日志中的目标EC block和版本号,节点F在接收到执行消息的过程中出现故障。
[0256] 408、确定目标EC条带的版本号相同。节点A确定节点F出现故障,则待节点F故障恢复后,节点A的版本判断模块判断节点A~F上,目标EC条带的版本号是否相同。其中,节点A~E上没有准备日志,已经存储的目标EC block中携带的目标EC条带的版本号为3。节点F上有准备日志,准备日志中目标EC block中携带的目标EC条带的版本号为3。
[0257] 409、节点A的消息发送模块向节点F发送执行消息。节点F的接收消息模块接收该执行消息。
[0258] 410、节点F的数据写入模块写入准备日志中的目标EC block和版本号。
[0259] 本发明实施例还提供了一种数据恢复装置,用于恢复故障存储节点中缺失的数据,该数据恢复装置部署在故障存储节点所在的存储节点组的主存储节点上,具体结构请参阅图8,包括:
[0260] 修复消息模块801,用于当故障存储节点的故障修复后,接收故障存储节点发送的修复消息,该修复消息用于表示故障存储节点的故障已被修复;
[0261] 数据计算模块802,用于根据本存储节点组内非故障存储节点存储的EC block,计算得到N个故障存储节点的缺失的EC block,N为正整数;
[0262] 数据发送模块803,用于:依次将N个缺失的EC block发送给故障存储节点以执行存储;
[0263] key值判断模块804,用于:若在依次将N个缺失的EC block发送给故障存储节点的过程中,主存储节点生成了第一EC block,并确定由故障存储节点存储该第一EC block,则判断故障存储节点当前未成功存储的缺失的EC block中,是否存在与第一EC block的key值相同的第二EC block;
[0264] 数据发送模块803还用于:若故障存储节点当前未成功存储的缺失的EC block中,存在第二EC block,则待故障存储节点成功存储了第二EC block后,再将第一EC block发送给故障存储节点以执行存储。
[0265] 本实施例提供了一种数据恢复装置,其中,数据计算模块802在故障存储节点修复后,计算得到N个故障存储节点缺失的EC block,数据发送模块803依次将该N个缺失的EC block发送给故障存储节点以执行存储。若主节点在依次将N个缺失的EC block发送给故障存储节点的过程中生成了新的EC条带,并确定由该故障存储节点来存储该新的EC条带中的第一EC block,则Key值判断模块804判断故障存储节点当前尚未成功存储的缺失的EC block中是否存在第二EC block,其中第二EC block与第一EC block的key值相同。若确定存在该第二EC block,则数据发送模块803待故障存储节点成功存储了第二EC block后,再将第一EC block发送给故障存储节点以执行存储。通过这样的方法,能够避免新数据被旧数据覆盖,保证了修复后的故障存储节点上存储的EC block为当前的最新版本。
[0266] 优选的,作为本发明的又一个实施例,数据发送模块803具体用于:
[0267] 将第n个缺失的EC block发送给所述故障存储节点,其中1≤n≤N;
[0268] 接收所述第n个缺失的EC block对应的响应消息,所述响应消息由所述故障存储节点发送,所述响应消息用于表示所述故障存储节点成功存储了所述第n个缺失的EC block;
[0269] 在接收所述故障存储节点对所述第n个缺失的EC block的响应消息后,若n<N,则n值加1,并再次执行所述将第n个缺失的EC block发送给所述故障存储节点的步骤。
[0270] 优选的,作为本发明的又一个实施例,当前未成功存储的缺失的EC block包括:当前还未发送给故障存储节点的缺失的EC block,以及当前已发送给故障存储节点但没有接收到对应的响应消息的缺失的EC block。
[0271] 优选的,作为本发明的又一个实施例,分布式存储系统的逻辑卷包括多个逻辑区域,每个逻辑区域为k个数据块的大小且互不重叠,每个逻辑区域唯一对应一个key值,每个EC block落在的逻辑区域的key值即为该EC block的key值。
[0272] 为了便于理解上述实施例,下面将以上述实施例的一个具体应用场景为例进行描述。
[0273] 分布式存储系统以EC条带的形式存储数据,每个EC条带包括4个数据块和2个校验块。分布式存储系统包括100个存储节点组,其中存储节点组1包括6个存储节点,主节点为节点A,备节点为节点B、节点C、节点D、节点E和节点F。某时刻,节点F发生故障。三小时后节点F修复但数据已丢失。
[0274] 节点F向节点A发送修复消息,告知节点A节点F的故障已修复。节点A的修复消息模801接收该修复消息。
[0275] 节点A在接收到该修复消息后,数据计算模块802根据节点A、节点B、节点C、节点D、节点E上存储的所有EC block,计算得到200个节点F缺失的EC block。
[0276] 主节点的数据发送模块803每次向节点F发送一个缺失的EC block,在接收到节点F对该缺失的EC block的响应消息后,再发送下一个缺失的EC block。这样依次将200个缺失的EC block发送给节点F。
[0277] 在数据发送模块803将第151个缺失的EC block发送给节点F后,节点A根据数据下发装置下发的数据段生成了新的EC条带,并确定由节点F存储该新的EC条带中的第一EC block,其中第一EC block的key值为25。
[0278] 由于节点A当前并没有接收到节点F发送的第151个缺失的EC block的响应消息,因此节点A的key值判断模块804判断第151~第200个缺失的EC block中,是否存在key值为25的第二EC block。节点A确定第190个缺失的EC block的key值为25。
[0279] 节点A的数据发送模块803暂时不向节点F发送第一EC block,在将第190个缺失的EC block发送给节点F,并接收到节点F发送的第190个缺失的EC block的响应消息后,再向节点F发送第一EC block。
[0280] 节点A的数据发送模块803将全部200个缺失的EC block发送给节点F,节点F就完成了数据恢复。
[0281] 上面从单元化功能实体的角度对本发明实施例中的各装置进行了描述,下面从硬件处理的角度对本发明实施例中的装置进行描述。
[0282] 请参阅图9,本发明实施例提供的数据存储装置的另一实施例包括:
[0283] 输入装置901、输出装置902、处理器903和存储器904(其中数据存储装置900中的处理器903的数量可以一个或多个,图9中以一个处理器903为例)。在本发明的一些实施例中,输入装置901、输出装置902、处理器903和存储器904可通过总线或其它方式连接,其中,图9中以通过总线连接为例。
[0284] 其中,通过调用存储器904存储的操作指令,处理器903用于执行如下步骤:
[0285] 接收待存储的数据段,对所述待存储的数据段进行EC编码得到目标EC条带,所述待存储的数据段的大小不大于Z,所述Z为m个数据块的大小,所述目标EC条带包括m+k个目标EC block,所述m+k个目标EC block包括m个目标数据块和k个目标校验块;
[0286] 确定m+k个目标存储节点,其中,所述m+k个目标存储节点用于存储所述m+k个目标EC block,每个目标存储节点存储一个所述目标EC block;
[0287] 向所述m+k个目标存储节点分别发送准备消息,每个准备消息中包括所述每个目标存储节点需要存储的目标EC block;
[0288] 接收所述m+k个目标存储节点中的任意一个目标存储节点发送的响应消息,所述响应消息用于表示当前发送所述响应消息的目标备存储节点已经根据所述准备消息生成了准备日志,所述准备日志中包括所述当前发送所述响应消息的目标存储节点需要存储的目标EC block;
[0289] 在接收到了所述m+k个目标存储节点中的所有目标存储节点的响应消息后,向所述m+k个目标存储节点发送执行消息,所述执行消息用于指示所述m+k个目标存储节点写入所述准备日志中的目标EC block。
[0290] 本发明的一些实施例中,所述准备消息中还包括所述目标EC条带的版本号;
[0291] 所述目标备存储节点根据所述准备消息生成的所述准备日志中,还包括所述目标EC条带的版本号;
[0292] 所述执行消息具体用于:指示目标存储节点写入所述准备消息中的目标EC block,和所述目标EC条带的版本号。
[0293] 本发明的一些实施例中,处理器903还执行如下步骤:
[0294] 若检测到所述m+k个目标存储节点中存在故障存储节点,则待所述故障存储节点的故障修复后,判断所述m+k个目标存储节点上的目标EC条带的版本号是否相同,其中,所述m+k个目标存储节点上的所述目标EC条带的版本号包括:已生成准备日志的目标存储节点上的准备日志中目标EC条带的版本号,和/或,没有准备日志的目标存储节点所存储的目标EC条带的版本号;
[0295] 若所述m+k个目标存储节点中的所有目标存储节点上的目标EC条带的版本号相同,则向已生成准备日志的目标存储节点发送执行消息,所述执行消息用于指示目标存储节点写入所述准备日志中的目标EC block。
[0296] 本发明的一些实施例中,处理器903还执行如下步骤:
[0297] 若所述m+k个目标存储节点中的目标存储节点上的目标EC条带的版本号不相同,则向已生成准备日志的目标存储节点发送删除消息,所述删除消息用于指示目标存储节点删除所述准备日志。
[0298] 本发明实施例提供的数据存储装置的另一实施例请参阅图10,包括:
[0299] 输入装置1001、输出装置1002、处理器1003和存储器1004(其中数据存储装置1000中的处理器1003的数量可以一个或多个,图10中以一个处理器1003为例)。在本发明的一些实施例中,输入装置1001、输出装置1002、处理器1003和存储器1004可通过总线或其它方式连接,其中,图10中以通过总线连接为例。
[0300] 其中,通过调用存储器1004存储的操作指令,处理器1003用于执行如下步骤:
[0301] 接收所述主存储节点发送的准备消息,所述准备消息中包括所述备存储节点要存储的目标EC block;
[0302] 根据所述准备消息生成准备日志,所述准备日志中包括所述备存储节点要存储的目标EC block;
[0303] 向所述主存储节点发送响应消息,所述响应消息用于表示所述备存储节点根据所述准备消息生成了准备日志;
[0304] 接收所述主存储节点发送的送执行消息;
[0305] 根据所述执行消息,写入所述准备日志中的目标EC block。
[0306] 本发明的一些实施例中,所述备存储节点要存储的目标EC block为所述主存储节点生成的目标EC条带中的一个数据块或校验块,所述准备消息中还包括所述目标EC条带的版本号;
[0307] 所述备存储节点根据所述准备消息生成的所述准备日志中,还包括所述目标EC条带的版本号;
[0308] 所述执行消息具体用于:指示目标存储节点写入所述准备消息中的目标EC block,和所述目标EC条带的版本号。
[0309] 本发明的一些实施例中,处理器1003还执行如下步骤:
[0310] 接收所述主存储节点发送的删除消息;
[0311] 根据所述删除消息删除所述准备日志。
[0312] 本发明实施例提供的数据恢复装置的另一实施例请参阅图11,包括:
[0313] 输入装置1101、输出装置1102、处理器1103和存储器1104(其中数据存储装置1100中的处理器1103的数量可以一个或多个,图11中以一个处理器1103为例)。在本发明的一些实施例中,输入装置1101、输出装置1102、处理器1103和存储器1104可通过总线或其它方式连接,其中,图11中以通过总线连接为例。
[0314] 其中,通过调用存储器1104存储的操作指令,处理器1103用于执行如下步骤:
[0315] 当所述故障存储节点的故障修复后,接收所述故障存储节点发送的修复消息;
[0316] 根据本存储节点组内非故障存储节点存储的EC block,计算得到N个所述故障存储节点的缺失的EC block,所述N为正整数;
[0317] 依次将所述N个缺失的EC block发送给所述故障存储节点以执行存储;
[0318] 若在所述依次将所述N个缺失的EC block发送给所述故障存储节点的过程中,所述主存储节点生成了第一EC block,并确定由所述故障存储节点存储所述第一EC block,则判断所述故障存储节点当前未成功存储的所述缺失的EC block中是否存在与所述第一EC block的key值相同的第二EC block;
[0319] 若确定存在所述第二EC block,则待所述故障存储节点成功存储了所述第二EC block后,再将所述第一EC block发送给所述故障存储节点以执行存储。
[0320] 本发明的一些实施例中,处理器1103还执行如下步骤:
[0321] 将第n个缺失的EC block发送给所述故障存储节点,其中1≤n≤N;
[0322] 接收所述第n个缺失的EC block对应的响应消息,所述响应消息由所述故障存储节点发送,所述响应消息用于表示所述故障存储节点成功存储了所述第n个缺失的EC block;
[0323] 在接收所述故障存储节点对所述第n个缺失的EC block的响应消息后,若n<N,则n值加1,并再次执行所述将第n个缺失的EC block发送给所述故障存储节点的步骤。
[0324] 本发明的一些实施例中,所述当前未成功存储的所述缺失的EC block包括:当前还未发送给所述故障存储节点的所述缺失的EC block,以及当前已发送给所述故障存储节点但没有接收到对应的响应消息的所述缺失的EC block。
[0325] 本发明的一些实施例中,所述分布式存储系统的逻辑卷包括多个逻辑区域,每个逻辑区域为k个数据块的大小且互不重叠,每个所述逻辑区域唯一对应一个key值,每个EC block落在的逻辑区域的key值即为所述EC block的key值。
[0326] 本发明实施例还提供了一种存储节点,包括图6至图11中任意一幅或多幅所示的装置。
[0327] 所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0328] 在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0329] 所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0330] 另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0331] 所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
[0332] 以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。