平码五不中公式规律
  • / 24
  • 下载费用:30 金币  

分布式存储系统中的数据重建的方法、装置和系统.pdf

关 键 ?#21097;?/dt>
分布式 存储系统 中的 数据 重建 方法 装置 系统
  专利查询网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
摘要
申请专利号:

CN201580044798.2

申请日:

2015.12.31

公开号:

CN106662983A

公开日:

2017.05.10

当前法律状态:

实审

?#34892;?#24615;:

审中

法?#19978;?#24773;: 实质审查的生效IPC(主分类):G06F 3/06申请日:20151231|||公开
IPC分类号: G06F3/06 主分类号: G06F3/06
申请人: 华为技术有限公司
发明人: 曾永强
地址: 518129 广东省深圳市龙岗区坂田华为总部办公楼
优?#28909;ǎ?/td>
专利代理机构: 代理人:
PDF完整版下载: PDF下载
法律状态
申请(专利)号:

CN201580044798.2

授权公告号:

|||

法律状态公告日:

2017.06.06|||2017.05.10

法律状态类型:

实质审查的生效|||公开

摘要

一种分布式存储系统中的数据重建的方法、装置和系统。分布式存储系统中的主存储节点对待写入数据进行EC编码,生成EC条带,将EC条带中的各个EC块分别存储在各个存储节点上,当部分存储节点由于故?#31995;?#33268;写入EC块失败时,主存储节点将分配给写入失败的存储节点的EC块存储在本地,并生成数据重建所需的元数据信息,当存储节点故障恢复后,主存储节点将存储的分配给写入失败的存储节点的EC块以及该EC块对应的元数据信息重新发送给该存储节点,以使得故障恢复后的该存储节点完成数据重建。本申请提供的分布式存储系统中的数据重建的方案,当部分存储节点故障时,无需执行EC反编码以恢复故障节点?#31995;?#25968;据,而是由主存储节点缓存分配给故障节点的EC块,再故障节点恢复后再将缓存的EC块重新发送给故障节点进行数据重建。避免了存储节点故障恢复进行数据重建时执行EC反编码带来的计算资源消耗,同?#24065;?#36991;免了执行EC反编码时传递大量数据带来的网络资源消耗。

权利要求书

1.一种分布式存储系统中数据重建的方法,其特征在于,包括:
第一存储节点获取待写入数据以及所述待写入数据的键key值,刷新所述key值对应的
版本号,对所述待写入数据进行纠删码EC编码,生成EC条带,所述EC条带包括m+k个EC块,其
中m个EC块为数据块,k个EC块为校验块,m为大于等于2的正整数,k为自然数;
所述第一存储节点查询分区视图,确定所述待写入数据所在的分区对应的备存储节
点,其中,所述第一存储节点为所述分区对应的主存储节点,第二存储节点为所述分区对应
的其中一个备存储节点;
所述第一存储节点向各备存储节点发送写入请求,所述写入请求携带所述待写入数据
所在的分区的分区标识ID、所述待写入数据的key值和版本号,以及分配给各备存储节点的
EC块的数据;
当所述第二存储节点写入失败时,所述第一存储节点存储所述分配给所述第二存储节
点的EC块的数据,生成与所述分配给所述第二存储节点的EC块对应的元数据信息,所述元
数据信息包括所述待写入数据所在的分区的分区ID、所述待写入数据的key值和版本号;
当所述第二存储节点故障恢复后,所述第一存储节点将存储的所述分配给所述第二存
储节点的EC块的数据以及所述元数据信息发送给所述第二存储节点,以使得所述第二存储
节点进行数据重建。
2.如权利要求1所述的方法,其特征在于,在所述第一存储节点存储所述分配给所述第
二存储节点的EC块的数据之前,所述方法还包括:
所述第一存储节点确定写入成功的存储节点的数量大于等于m。
3.如权利要求1所述的方法,其特征在于,所述第一存储节点向各备存储节点发送的写
入请求中还携带有分配给各备存储节点的EC块的块内数据偏移和块内数据长度,以使得各
存储节点根据接收到的所述写入请求中携带的所述数据偏移和块内数据长度写入所述EC
块的数据。
4.如权利要求1所述的方法,其特征在于,在所述第一存储节点将存储的所述分配给所
述第二存储节点的EC块的数据以及所述元数据信息发送给所述第二存储节点之前,所述方
法还包括:
所述第一存储节点接收所述第二存储节点发送的数据同步请求,所述数据同步请求中
携带所述分区ID;
所述第一存储节点从所述第二存储节点获取所述第二存储节点中记录的所述分区ID
对应的key值以及与所述key值的版本号;
所述第一存储节点将自身记录的所述分区ID对应的key值以及key值的版本号,与从所
述第二存储节点获取的所述分区ID对应的key值以及所述key值的版本号,进行比对,根据
比对结果确定需要进行数据重建;
所述第一存储节点根据所述元数据信息,将存储的需要进行数据重建的key值对应的
EC块的数据以及所述EC块的元数据信息发送给所述第二存储节点进行数据重建。
5.如权利要求4所述的方法,其特征在于,所述比对包括以下至少一种:
当所述第一存储节点记录的key值对应的版本号与从所述第二存储节点获取的所述
key值对应的版本号一致时,无需进行数据重建;
当所述第一存储节点记录的key值中不包含从所述第二存储节点获取的key值时,则通
知所述第二存储节点删除所述第一存储节点不包含的所述key值对应的数据;
当所述第一存储节点记录的key值对应的版本号大于从所述第二存储节点获取的所述
key值对应的版本号时,执行数据重建操作;或,
当所述第一存储节点记录的key值中不包含在从所述第二存储节点获取的key值中时,
则通知所述第二存储节点重建所述第二存储节点不包含的所述key值对应的数据。
6.如权利要求3所述的方法,其特征在于,在所述第二存储节点故障恢复后,还包括:
所述第二存储节点根据所述分配给所述第二存储节点的EC块的块内数据偏移和块内
数据长度,将所述EC块的数据写入到磁盘中,更新所述待写入数据的key值对应的版本号。
7.如权利要求2所述的方法,其特征在于,还包括:
以m个EC块的大小为粒度将所述逻辑卷的存储地?#26041;?#34892;等分,得到多个存储单元,为所
述多个存储单元分配数据偏移标识。
8.如权利要求7所述的方法,其特征在于,在所述第一存储节点获取待写入数据之前,
所述方法还包括:
所述存储客户?#31169;?#25910;上层应用发送的存储指令,所述存储指令中携带待存储的数据,
以及存储所述待存储的数据的所述逻辑卷的卷标识、数据偏移和数据长度;
所述存储客户端确定存储所述待存储的数据的地址范围对应的至少一个存储单元,将
每个存储单元对应的部分待存储的数据作为一次写入操作中需要写入到分布式存储系统
的所述待写入数据。
9.如权利要求1所述的方法,其特征在于,在第一存储节点查询分区视图之前,还包括:
第一存储节点使用一致性哈希算法计算所述待写入数据的key值对应的哈希值,确定
所述哈希值所属的分区的分区ID;或者,
第一存储节点从存储客户端获取所述待写入数据对应的分区的分区ID。
10.如权利要求1所述的方法,其特征在于,第一存储节点确定所述第二存储节点写入
失败包括:
所述第一存储节点接收所述第二存储节点返回的写入失败响应,确定所述第二存储节
点写入失败;或者,
所述第一存储节点根据所述分区视图,确定所述第二存储节点的状态为故障,其中,所
述分区视图中包含存储节点的状态信息。
11.如权利要求1所述的方法,其特征在于,所述第一存储节点存储所述分配给所述第
二存储节点的EC块的数据包括:
所述第一存储节点分配?#38556;?#30340;存储空间作为日志卷,用于存储分配给写入失败的存储
节点的EC块,所述日志卷由至少一个日志块组成,所述日志块的大小与所述EC块的大小相
同。
12.一种存储节点,其特征在于,包括:
获取单元,用于获取待写入数据以及所述待写入数据的key值,刷新所述key值对应的
版本号,对所述待写入数据进行EC编码,生成EC条带,所述EC条带包括m+k个EC块,其中m个
EC块为数据块,k个EC块为校验块,m为大于等于2的正整数,k为自然数;
处理单元,用于查询分区视图,确定所述待写入数据所在的分区对应的备存储节点,其
中,所述第一存储节点为所述分区对应的主存储节点,第二存储节点为所述分区对应的其
中一个备存储节点;
发送单元,用于向各备存储节点分别发送写入请求,所述写入请求携带所述待写入数
据所在的分区的分区ID、所述待写入数据的key值和版本号,以及分配给各备存储节点的EC
块的数据;
所述处理单元,用于确定所述第二存储节点写入失败时,存储所述分配给所述第二存
储节点的EC块的数据,生成与所述分配给所述第二存储节点的EC块对应的元数据信息,所
述元数据信息包括所述待写入数据所在的分区的分区ID、所述待写入数据的key值和版本
号;
当所述第二存储节点故障恢复后,所述发送单元,还用于将存储的所述分配给所述第
二存储节点的EC块的数据以及所述元数据信息发送给所述第二存储节点,以使得所述第二
存储节点进行数据重建。
13.如权利要求12所述的存储节点,其特征在于,所述处理单元,还用于确定写入成功
的存储节点的数量大于等于m。
14.如权利要求12所述的存储节点,其特征在于,
所述获取单元,还用于接收所述第二存储节点发送的数据同步请求,所述数据同步请
求中携带所述分区ID,从所述第二存储节点获取所述第二存储节点中记录的所述分区ID对
应的一个或多个key值,以及与所述key值的版本号;
所述处理单元,还用于将自身记录的所述分区ID对应的key值以及各key值的版本号,
与从所述第二存储节点获取的所述分区ID对应的一个或多个key值,以及与所述key值的版
本号,进行比对,根据比对结果确定需要进行数据重建;
所述发送单元,具体用于根据所述元数据信息,将存储的需要进行数据重建的key值对
应的EC块的数据以及所述EC块的元数据信息发送给所述第二存储节点进行数据重建。
15.如权利要求14所述的存储节点,其特征在于,所述处理单元,具体用于执行以下至
少一种比对处理:
当本存储节点记录的key值对应的版本号与从所述第二存储节点获取的所述key值对
应的版本号一致时,无需进行数据重建;
当本存储节点记录的key值中不包含从所述第二存储节点获取的key值时,则通知所述
第二存储节点删除所述本存储节点不包含的所述key值对应的数据;
当所述本存储节点记录的key值对应的版本号大于从所述第二存储节点获取的所述
key值对应的版本号时,执行数据重建操作;或,
当所述本存储节点记录的key值中不包含在从所述第二存储节点获取的key值中时,则
通知所述第二存储节点重建所述第二存储节点不包含的所述key值对应的数据。
16.如权利要求12所述的存储节点,其特征在于,
所述处理单元,还用于以m个EC块的大小为粒度将所述逻辑卷的存储地?#26041;?#34892;等分,得
到多个存储单元,为所述多个存储单元分配数据偏移标识。
17.如权利要求12所述的存储节点,其特征在于,
所述获取单元,具体用于使用一致性哈希算法计算所述待写入数据的key值对应的哈
希值,确定所述哈希值所属的分区的分区ID;或者,
所述获取单元,具体用于从存储客户端发送的写入请求中获取所述待写入数据对应的
分区的分区ID。
18.如权利要求12所述的存储节点,其特征在于,
所述获取单元,还用于接收所述第二存储节点返回的写入失败响应,确定所述第二存
储节点写入失败;或者,
所述获取单元,还用于根据所述分区视图,确定所述第二存储节点的状态为故障,其
中,所述分区视图中包含存储节点的状态信息。
19.如权利要求12所述的存储节点,其特征在于,
所述处理单元,具体用于分配?#38556;?#30340;存储空间作为日志卷,用于存储分配给写入失败
的存储节点的EC块,所述日志卷由至少一个日志块组成,所述日志块的大小与所述EC块的
大小相同。
20.一种分布式存储系统,其特征在于,包括第一存储节点和第二存储节点,所述第一
存储节点,用于获取待写入数据以及所述待写入数据的键key值,刷新所述key值对应的版
本号,对所述待写入数据进行纠删码EC编码,生成EC条带,所述EC条带包括m+k个EC块,其中
m个EC块为数据块,k个EC块为校验块,m为大于等于2的正整数,k为自然数;
所述第一存储节点,还用于查询分区视图,确定所述待写入数据所在的分区对应的备
存储节点,其中,所述第一存储节点为所述分区对应的主存储节点,第二存储节点为所述分
区对应的其中一个备存储节点;
所述第一存储节点,还用于向各备存储节点发送写入请求,所述写入请求携带所述待
写入数据所在的分区的分区ID、所述待写入数据的key值和版本号,以及分配给各备存储节
点的EC块的数据;
当所述第二存储节点写入失败时,所述第一存储节点,还用于存储所述分配给所述第
二存储节点的EC块的数据,生成与所述分配给所述第二存储节点的EC块对应的元数据信
息,所述元数据信息包括所述待写入数据所在的分区的分区ID、所述待写入数据的key值和
版本号;
当所述第二存储节点故障恢复后,所述第一存储节点,还用于将存储的所述分配给所
述第二存储节点的EC块的数据以及所述元数据信息发送给所述第二存储节点;
所述第二存储节点,用于根据所述元数据信息写入所述分配给所述第二存储节点的EC
块的数据。

说明书

分布式存储系统中的数据重建的方法、装置和系统

技术领域

本发明涉及IT技术领域,尤其涉及分布式存储系统中的数据重建的方法、装置和
系统。

背景技术

存储系统中,为了保证数据的安全,通常使用多副本存储技术?#35789;?#29616;数据的冗余
备份。多副本冗余技术就是对一份数据同时存储多份相同的副本,当一份数据丢失时,可以
通过其他副本的数据将丢失的数据恢复出来,从而?#26723;?#25968;据丢失的概?#30465;?#21103;本个数的增加
将会大大增加系统存储空间和网络带宽的消耗,从而增加数据存储的成本。如两副本情况
下,用户真正可用空间是整个系统总存储空间的50%,而在三副本的情况下,用户真正可用
空间则只有33%。

由于多副本存储技术存在存储空间浪费的缺点,?#32440;?#27573;的分布式存储系统越来越
多的采用纠删码(EC,Erasure Code)技术对数据进行存储。目前在存储领域广泛应用的是
Reed-Solomen类纠删码,具体原理是,将数据分割成m个数据块,采用冗余算法对m个数据块
进行校验编码,用编码矩阵和m个数据块做乘法运算,从而生成k个校验块,该m个数据块与k
个校验块组成一个EC条带。由于矩阵运算是可逆,当EC条带中的m+k个块中小于或等于k个
块丢失时,均可以还原丢失的块中的数据。

相对副本而言,纠删码的编码技术无疑对存储空间利用率带来很大提升,但由于
引入额外的编码、解码运算,对分布式存储系统的计算能力带来额外的要求。

发明内容

本申请描述了一种分布式存储系统中的数据重建的方法、装置和系统,解决了故
障节点恢复后重建故障节点?#31995;?#25968;据的问题,无需使用EC反编码的方式来恢复数据,?#26723;?br />了计算资源以及网络资源的消耗。

一方面,本发明实施例提供了一种分布式存储系统中数据重建的方法,第一存储
节点获取待写入数据,确定所述待写入数据的key值,刷新所述key值对应的版本号,对所述
待写入数据进行EC编码,生成EC条带,所述EC条带包括m+k个EC块,其中m个EC块为数据块,k
个EC块为校验块,m为大于等于2的正整数,k为自然数;第一存储节点查询分区视图,确定所
述待写入数据所在的分区对应的第二存储节点,所述第一存储节点为所述分区对应的主存
储节点,所述第二存储节点为所述分区对应的备存储节点;所述第一存储节点向所述第二
存储节点发送写入请求,所述写入请求携带所述待写入数据所在的分区标识(ID)、所述待
写入数据的key值和版本号,以及分配给所述第二存储节点的EC块的数据、块内数据偏移和
块内数据长度;第一存储节点确定所述第二存储节点写入失败,存储所述分配给所述第二
存储节点的EC块的数据,生成与所述分配给所述第二存储节点的EC块对应的元数据信息,
所述元数据信息包括所述待写入数据所在的分区的分区ID、所述待写入数据的key值和版
本号,以及分配给所述第二存储节点的EC块的块内数据偏移和块内数据长度;当所述第二
存储节点故障恢复后,所述第一存储节点将存储的所述分配给所述第二存储节点的EC块的
数据以及所述元数据信息发送给所述第二存储节点,以使得所述第二存储节点进行数据重
建。

分布式存储系统中的主存储节点对待写入数据进行EC编码,生成EC条带,将EC条
带中的各个EC块分别存储在各个存储节点上,当部分存储节点由于故?#31995;?#33268;写入EC块失败
时,主存储节点将分配给写入失败的存储节点的EC块存储在本地,并生成数据重建所需的
元数据信息,当存储节点故障恢复后,主存储节点将存储的分配给写入失败的存储节点的
EC块以及该EC块对应的元数据信息重新发送给该存储节点,以使得故障恢复后的该存储节
点完成数据重建。本申请提供的分布式存储系统中的数据重建的方案,当部分存储节点故
障时,无需执行EC反编码以恢复故障节点?#31995;?#25968;据,而是由主存储节点缓存分配给故障节
点的EC块,再故障节点恢复后再将缓存的EC块重新发送给故障节点进行数据重建。通过上
述方案,避免了存储节点故障恢复进行数据重建时执行EC反编码带来的计算资源消耗,同
?#24065;?#36991;免了执行EC反编码时传递大量数据带来的网络资源消耗。?#32416;?#24615;的,当EC编码为4+2
时,恢复1份数据需要4份数据,而本申请中,只是在故障节点恢复后,由主存储节点向故障
节点重新发送1份数据,明?#36234;档?#20102;网络资源消耗;进一步的,分布式存储系统中,丢失1份
数据的概?#35797;对?#22823;于丢失两份数据,而丢失1份数据时,仍然可以还原出原始数据,因此,无
需立刻执行EC反编码将丢失的数据还原,当故障节点恢复后,采用本申请提出的数据重建
的方案即可将故障节点?#31995;?#25968;据与其他存储节点进行同步。

在一种可能的实施方式中,所述待写入数据的key值用于表示存储所述待写入数
据的逻辑卷的地址范围。

在一种可能的实施方式中,所述待写入数据的key值由存储所述待写入数据的逻
辑卷的卷标识和数据偏移标识组成,所述数据偏移标识表示所述待写入数据在所述逻辑卷
中的地址范围。

在一种可能的实施方式中,存储客户端根据存储所述待写入数据的逻辑卷的卷标
识和数据偏移标识,确定所述待写入数据的key值,所述数据偏移标识表示所述待写入数据
在所述逻辑卷中的地址范围。可以将逻辑卷的卷标识和数据偏移标识合并后得到的?#22336;?#20018;
作为所述待写入数据的key值。所述待写入数据的key值可以用来唯一区分该待写入数据存
储的地址范围。

在一种可能的实施方式中,存储客户端使用一致性哈希算法计算所述待写入数据
的key值对应的哈希值,确定所述哈希值所属的分区的分区ID。存储客户端确定该分区对应
的主存储节点为第一存储节点时,向第一存储节点发送写入请求,所述写入请求携带所述
待写入数据、所述key值、分区ID,以及待写入数据的数据偏移和数据长度。

在一种可能的实施方式中,所述分区视?#21450;?#25324;分区ID、主存储节点标识以及备存
储节点标识。分区视图由分区视图管理模块维护并分发给各存储节点。通过统一的分区视
图管理,可以实现待写入数据尽量均衡的写入到各个分区,且各个分区尽量均衡的分布在
分布式存储系统的各个存储节点上,实现数据的冗余备份。

在一种可能的实施方式中,第一存储节点接收分区视图管理模块发送的故障节点
通知消息,所述故障节点通知消息中携带所述第二存储节点的标识,确定所述第二存储节
点写入失败。需要说明的是,当第一存储节点接收到备存储节点返回的写入失败响应确定
备存储节点写入失败,不一定认为备存储节点必然会写入失败,由于发送备存储节点的数
据可能丢失,此时,第一存储节点会向备存储节点再次发送写入请求,备存储节点重试写入
EC块。因此,优选地,以分区视图管理模块发送的故障节点通知消息为准确定存储节点写入
失败。

当第二存储节点故障恢复后,第二存储节点向分区视图管理模块请求最新的分区
视图,确定自身存储的分区对应的主存储节点,向分区对应的主存储节点请求数据同步。故
障节点上可能存在多个分区,每个分区的主存储节点可能不同,因此,针对不同的分区,故
障节点需要向不同的主存储节点请求数据同步。

具体的,所述第一存储节点接收所述第二存储节点发送的数据同步请求,所述数
据同步请求中携带所述分区ID;所述第一存储节点从所述第二存储节点获取所述第二存储
节点中记录的所述分区ID对应的一个或多个key值,以及与所述key值的版本号;所述第一
存储节点将自身记录的所述分区ID对应的key值以及各key值的版本号,与从所述第二存储
节点获取的所述分区ID对应的一个或多个key值,以及与所述key值的版本号,进行比对,根
据比对结果确定需要进行数据重建;所述第一存储节点根据所述元数据信息,将存储的需
要进行数据重建的key值对应的EC块的数据以及所述EC块的元数据信息发送给所述第二存
储节点进行数据重建。

当第一存储节点接收到第二存储节点的数据同步请求时,执行比对操作,判断需
要针对那些key值对应的数据进行同步,所述比对包括以下至少一种:

当所述第一存储节点记录的key值对应的版本号与从所述第二存储节点获取的所
述key值对应的版本号一致时,无需进行数据重建;

当所述第一存储节点记录的key值中不包含从所述第二存储节点获取的key值时,
则通知所述第二存储节点删除所述第一存储节点不包含的所述key值对应的数据;

当所述第一存储节点记录的key值对应的版本号大于从所述第二存储节点获取的
所述key值对应的版本号时,执行数据重建操作;或,

当所述第一存储节点记录的key值中不包含在从所述第二存储节点获取的key值
中时,则通知所述第二存储节点重建所述第二存储节点不包含的所述key值对应的数据。

在一种可能的实施方式中,当第二存储节点在故障恢复后接收到第一存储节点缓
存的EC块以及对应的元数据信息时,所述第二存储节点根据所述分配给所述第二存储节点
的EC块的块内数据偏移和块内数据长度,将所述EC块的数据写入到磁盘中,更新所述待写
入数据的key值对应的版本号,从而完成该EC块的数据重建。

在一种可能的实现方式中,本申请以m个EC块的大小为粒度将所述逻辑卷的存储
地?#26041;?#34892;等分,得到多个存储单元,为所述多个存储单元分配数据偏移标识。进一步的,所
述存储客户?#31169;?#25910;上层应用发送的存储指令,所述存储指令中携带待存储的数据,以及存
储所述待存储的数据的所述逻辑卷的卷标识、数据偏移和数据长度;所述存储客户端确定
存储所述待存储的数据的地址范围对应的至少一个存储单元,将每个存储单元对应的部分
待存储的数据作为一次写入操作中需要写入到分布式存储系统的所述待写入数据。

当一次存储的数据较大时,待存储的数据可能需要分成多段分?#22797;?#20889;入到分布式
存储系统中。本申请提供了一种对待存储数据进行分段写入的方法,一次写入的数据被称
为待写入数据。

更进一步的,第一存储节点使用一致性哈希算法计算所述待写入数据的key值对
应的哈希值,确定所述哈希值所属的分区的分区ID。通过采用一致性哈希的方式,将数据均
匀的分布到各个分区上。

在一种可能的实施方式中,第一存储节点可以在接收到写入失败响应后,确定发
送写入失败响应的存储节点故障;或者,第一存储节点可以根据分区视图中记录的存储节
点的状态信息确定故障节点。

在一种可能的实施方式中,本申请?#22266;?#20379;?#35828;?#19968;存储节点缓存分配给写入失败的
故障节点的EC块的方法,具体的,所述第一存储节点分配?#38556;?#30340;存储空间作为日志卷,用于
存储分配给写入失败的存储节点的EC块,所述日志卷由至少一个日志块组成,所述日志块
的大小与所述EC块的大小相同。

通过设定日志块的大小与EC块的大小相同,即实现了EC块粒度的数据重建,重建
方法复杂度低。

另一方面,本发明实施例提供了一种存储节点,该存储节点具体实现上述方法中
第一存储节点的功能。所述功能可以通过?#24067;?#23454;现,?#37096;?#20197;通过?#24067;?#25191;行相应的软件实现。
所述?#24067;?#25110;软件包括一个或多个与上述功能相对应的模块。

在一个可能的设计中,存储节点的结构中包括处理器和存储器,所述处理器被配
置为支持存储节点执行上述系统中相应的功能。所述存储节点还可以包括存储器,所述存
储器用于与处理器耦?#24076;?#20854;保存存储节点执行上述功能所必要的程序指令和数据。

又一方面,本发明实施例提供了一种分布式存储系统,该分布式存储系统具体实
现上述方法中第一存储节点、第二存储节点、存储客户端以及分区视图管理模块的功能。所
述功能可以通过?#24067;?#23454;现,?#37096;?#20197;通过?#24067;?#25191;行相应的软件实现。所述?#24067;?#25110;软件包括一
个或多个与上述功能相对应的模块。

再一方面,本发明实施例提供了一种计算机存储介?#21097;?#29992;于储存为第一存储节点
所用的计算机软件指令,其包含用于执行上述方面所设计的程序。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现
有技术描述中所需要使用的附图作简单地介绍。显而?#20934;?#22320;,下面附图中反映的仅仅是本
发明的一部分实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还
可以根据这些附图获得本发明的其他实施方式。而所有这些实施例或实施方式都在本发明
的保护范围之内。

图1为实现本发明的一种可能的分布式存储系统的结?#25925;?#24847;图;

图2为所示为本发明实施例提供的主存储节点上存储EC块的结?#25925;?#24847;图;

图3为本发明实施例提供的一种日志块的管理逻辑示意图;

图4为所示为本发明实施例提供的计算机设备示意图;

图5为本发明实施例提供的一?#20013;?#25968;据的流程示意图;

图6为本发明实施例提供的一种逻辑卷存储空间的等分示意图;

图7为本发明实施例提供的DHT哈希环的示意图;

图8为本发明实施例提供的一种故障节点恢复后的数据重建方法流程示意图;

图9为本发明实施例提供的一种存储节点的结?#25925;?#24847;图;

图10为本发明实施例提供的一种分布式存储系统的结?#25925;?#24847;图。

具体实施方式

下面将结合附图,对本发明实施例中的技术方案进行清楚、完整地描述。显然,所
描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,
本领域普通技术人员在没有付出创造性劳动前提下所获得的所有其他实施例,都属于本发
明保护的范围。

本发明实施例描述的网络架构以及业务场景是为了更加清楚的说明本发明实施
例的技术方案,并?#36824;?#25104;对于本发明实施例提供的技术方案的限定,本领域普通技术人员
可知,随着网络架构的演变和新业务场景的出现,本发明实施例提供的技术方案对于类似
的技术问题,同样适用。

分布式存储系统使用EC技术进行数据存储时,会根据待存储的数据的大小生成一
条或多条EC条带,并将每个EC条带的m个数据块及k个校验块分发给分布式存储系统的m+k
个存储节点进行存储,EC条带中的每个数据块或校验块?#37096;?#20197;称为一个纠删码块EC
block。当分布式存储系统中有节点故障时,只要故障节点的数量小于k,就可以根据非故障
节点?#31995;?#21516;一个EC条带的EC块将故障节点上存储的EC块恢复出来。恢复的方法为,首先获
取至少m个存储节点上存储的属于同一个EC条带的m个EC块,针对m个EC块中的数据执行EC
反编码,即可将故障节点?#31995;?#21516;一个EC条带的EC块恢复出来。因此,采用EC技术存储数据的
分布式存储系统具有很高的可靠性。

但是,EC反编码技术对分布式存储系统的计算能力要求较高,?#19968;?#22797;故障节点上
的1个EC块的数据需要传递m个EC块数据,对网络传输也造成?#31169;?#22823;的负担。为克服上述问
题,本发明实施例提供了一种分布式存储系统中的数据重建的方法,当出现存储节点故障
的时候,将本来要写入故障节点的EC块临时存储到另一节点存储(优选的,存储到主存储节
点上)。当故障节点恢复后,将转存到另一存储节点的EC块再重新写回到已恢复的故障节点
上,从而实现该EC块中的数据在故障节点?#31995;?#25968;据重建。采用本申请提出的方案,由于未进
行EC反编码达到了节省计算资源的目的,同时数据重建仅需要将待重建的数据写回已恢复
的故障节点,?#26723;?#20102;网络传输的带宽消耗。在一种可能的实施方式中,由主存储节点存储分
配给故障节点的数据,具体的,在主存储节点上分配一块?#38556;?#30340;存储空间,当某个存储节点
出现故障时,将本来要写入故障节点的数据暂时存储在主存储节点?#31995;?#19978;述?#38556;?#30340;存储空
间中。等故?#31995;?#33410;点恢复时,直接将主节点上保存的数据发送给故障节点。

如图1所示,为本发明实施例提供的一种分布式存储系统的结?#25925;?#24847;图。分布式存
储系统中包括多个存储节点,多个存储客户端以及分区视图(Partition View,PT View)管
理模块。存储客户?#31169;?#25910;上层应用发送的数据存储请求,采用纠删码技术,将待写入的数据
存储到多个存储节点进行冗余备份存储,图1中的各组件的功能如下所述:

PT view管理模块:可以部署在一台服务器上,也部署在一台存储节点上。其主要
功能包括:

1.监控各存储节点的状态。具体的,PT view管理模块与各存储节点之间存在心跳
连接,通过心跳连接监控各存储节点的状态:

存储节点的状态为正常,则表示存储节点存储的数据状态正常,存储节点未出现
异常掉电或者在异常掉电后存储节点已完成数据重建;存储节点的状态为故障,表示存储
节点存储的数据状态异常,存储节点出现异常掉电,或者未完成数据重建,与其他存储节点
的数据不同步。

2.生成及更新分区视图:基于存储节点状态及个数,根据Partition分区分配算法
生成或更新分区视图,每个分区对应的存储节点包括一个主存储节点以及若干备份存储节
点,每个分区对应的存储节点的总个数为EC条带包含的EC块的个数,即为m+k。如下所示,为
本发明实施例给出的PT view的示意图,为每个分区分配m+k个存储节点,指定其中一个存
储节点为主存储节点,其他存储节点为备份存储节点,分区视图中包括各存储节点当前的
状态信息。


分区视图可以由管理员进行手动设置,?#37096;?#20197;由管理服务器进行分配,只要尽可
能离散地将各分区分配给各存储节点即可,本发明实施例并不限定分区视图的建立方式。

3.将分区视图发布给各存储客户端及存储节点.

存储客户端:部署在服务器?#31995;?#36923;辑功能模块。负责接收外部主机发送的数据存
储请求,并将数据存储请求转换成对存储节点的键值对(key-Value)形式的IO请求;

存储节点:可以是物理存储节点,?#37096;?#20197;是由物理存储节点划分的多个逻辑存储
节点。主要功能有:数据相关处理(例如,EC编码),完成分布式事务(两阶段事务)处理,并将
IO最终转换为对盘的读写请求处理;

优选的,在各分区的主存储节点上需要分配一块?#38556;?#30340;存储空间,用于存放分配
给写入失败的故障存储节点的EC块的数据,该?#38556;?#30340;存储空间可以称为日志卷。将日志卷
的存储空间划分为若干个日志块,每个日志块的大小与EC块的大小相同,每个日志块对应
一个日志块标识(identity,ID)。日志块在被分配使用的时候,会生成一个元数据信息,元
数据信息中记录了分区ID、写入该日志块的数据的Key值、该数据的版本号,以及该EC块的
块内数据偏移和块内数据长度,进一步的,元数据信息还可以包括该日志块的ID。

在一种可能的实现方式中,可以采用空间队列来管理?#38556;?#30340;日志块,使用HashMap
方式来管理已被使用的日志块,Hash的键值为分区ID,这样相同分区的日志块放在一个队
列中。当需要向日志卷写入新数据时,首先在?#38556;?#22359;列表中申请一个?#38556;?#30340;块,根据待写入
数据的分区ID插入到对应的HashMap中。当该日志块使用完后,将该日志块重新放回?#38556;?#22359;
列表中。

如图1所示的存储客户端、存储节点及分区视图管理模块可以采用?#24067;?软件实
现,?#32416;?#24615;的,如图4所示,为本发明实施例提供的计算机设备示意图。计算机设备200包括
至少一个处理器201,通信总线202,存储器203以及至少一个通信接口204。

处理器201可以是一个通用中央处理器(CPU),微处理器,特定应用集成电路
(application-specific integrated circuit,ASIC),或一个或多个用于控制本发明方案
程序执行的集成电路。

通信总线202可包括一通路,在上述组件之间传送信息。所述通信接口304,使用任
何收发器一类的装置,用于与其他设备或通信网络通信,如以太网,无线接入网(RAN),无线
局域网(Wireless Local Area Networks,WLAN)?#21462;?br />

存储器203可以是只读存储器(read-only memory,ROM)或可存储静态信息和指令
的其他类型的静态存储设备,随机存取存储器(random access memory,RAM)或者可存储信
息和指令的其他类型的动态存储设备,?#37096;?#20197;是电可擦可编程只读存储器(Electrically
Erasable Programmable Read-Only Memory,EEPROM)、只读光盘(Compact Disc Read-
Only Memory,CD-ROM)或其他光盘存储、光碟存储(包括压缩光碟、激光碟、光碟、数字通用
光碟、蓝光光碟等)、磁盘存储介质或者其他磁存储设备、或者能够用于携带或存储具有指
令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介?#21097;?#20294;不限于此。
存储器可以是独立存在,通过总线与处理器相连接。存储器?#37096;?#20197;和处理器集成在一起。

其中,所述存储器203用于存储执行本发明方案的应用程序代码,并由处理器201
来控制执行。所述处理器201用于执行所述存储器203中存储的应用程序代码。

在具体实现中,作为一种实施例,处理器201可以包括一个或多个CPU,例如图2中
的CPU0和CPU1。

在具体实现中,作为一种实施例,计算机设备200可以包括多个处理器,例如图2中
的处理器201和处理器208。这些处理器中的每一个可以是一个单核(single-CPU)处理器,
?#37096;?#20197;是一个多核(multi-CPU)处理器。这里的处理器可以指一个或多个设备、电路、和/或
用于处理数据(例如计算机程序指令)的处理核。

在具体实现中,作为一种实施例,计算机设备200还可以包括输出设备205和输入
设备206。输出设备205和处理器201通信,可以以多种方式来显示信息。例如,输出设备205
可以是液晶显示器(liquid crystal display,LCD),发光二级管(light emitting diode,
LED)显示设备,阴极射线管(cathode ray tube,CRT)显示设备,或?#38431;?#20202;(projector)?#21462;?br />输入设备206和处理器201通信,可以以多种方式接受用户的输入。例如,输入设备206可以
是鼠标、键盘、触摸屏设备或传感设备?#21462;?br />

上述的计算机设备200可以是一个通用计算机设备或者是一个专用计算机设备。
在具体实现中,计算机设备200可以是台式机、便携式电脑、网络服务器、掌?#31995;?#33041;
(Personal Digital Assistant,PDA)、移动?#21482;?#24179;板电脑、无线终端设备、通信设备、嵌入
式设备或有图4中类似结构的设备。本发明实施例不限定计算机设备200的类型。

图1中的存储客户端、存储节点及分区视图管理模块可以为图4所示的设备,存储
器中存储了一个或多个软件模块,用于实现存储客户端、存储节点及分区视图管理模块的
功能(例如:存储节点的日志块的存储功能等)。存储客户端、存储节点及分区视图管理模块
可以通过处理器以及存储器中的程序代码?#35789;迪中?#25311;机间的应用拓扑发现的方法。

需要说明的是,图4所示的计算机设备仅仅是给出了分布式存储系统中各部分的
可能的?#24067;?#23454;现方式,根据系统各部分功能的不同或者变化,可以对计算机设备的?#24067;?#32452;
件进行增删,以使得与系统各部分的功能进行匹配。

如图5所示,为本发明实施例给出的一种存在故障节点时的写数据的流程示意图,
本发明实施例以m=2,k=1为例进行说明,此时,针对每个EC条带,存在3个EC块,需要将3个
EC块分别存储到3个存储节点中,EC块块的大小假定为1M,?#32416;?#24615;的,本发明实施例以存储
节点2的状态为故障为例进行说明。

在本发明实施例中,针对逻辑卷的存储空间,以m个EC块的大小为粒度(下图以m=
2,EC块块大小为1M为例),将逻辑卷进行等分,如下所示,为逻辑卷存储空间的等分示意图。
从地址0开始,等分后的逻辑卷的各个部分的数据偏移ID分别为0,1,2……n。

步骤501:存储客户?#31169;?#25910;外部主机发送的存储指令,所述存储指令携带待存储的
数据的逻辑卷的卷标识、数据偏移、数据长度,以及待存储的数据,所述存储客户端根据待
存储的数据的数据偏移及数据长度生成每次写入操作时需要写入的待写入数据的数据偏
移ID。每次写入操作对应的待写入数据对应一个数据偏移ID。

进一步的,所述存储客户端将所述逻辑卷的卷标识与所述待写入数据的数据偏移
ID合并,生成待写入的数据的key值。当需要将待写入数据分成多次写入过程进行数据存储
时,生成与每次写入过程的待写入数据对应的key值。

具体的,存储客户端对接收到的带存储的数据进?#20889;?#29702;,划分成多次写入对应的
待写入数据的过程如下:

?#32416;?#24615;的,假如所述待存储的数据的数据长度为3M,数据偏移为2.5M,则待存储的
数据存储的逻辑卷的地址范围为2.5M至5.5M,该待存储的数据将会落到等分后的逻辑卷的
第2,3个部分,两个部分分别对应的数据偏移ID为1和2,数据偏移ID为1的存储空间存储的
是地址范围为2.5M至4M的第一段待写入数据、数据偏移为2的存储空间存储的是地址范围
为4M至5.5M的第二段待写入数据。此时,存储客户端会将上述待存储的数据分成上述两段
待写入的数据,执行两次写入操作,将两端待写入数据分两次写入到存储节点中。第一段待
写入数据的key值为所述逻辑卷的卷标识和数据偏移ID1合并生成的?#22336;?#20018;;第二段待写入
数据的key值为所述逻辑卷的卷标识和数据偏移ID2合并生成的?#22336;?#20018;,由此可以看出,待
写入数据的key值是由待写入数据的地址范围决定的,与待写入数据的具体内容无关。

需要说明的是,本发明实施例以写入第一段待写入数据为例进行说明,此时,待写
入数据的地址范围为2.5M至4M。本领域技术人员可以理解的是,当待存储的数据分成多段
数据,需要分别执行多次写入操作时,多次写入的过程类似。鉴于不同写入过程中的待写入
数据的数据偏移ID不同,所以不同写入过程中的待写入数据的key值不同,每次写入操作的
待写入数据的数据偏移、数据长度发生变化而?#36873;?br />

在本发明实施例中,待存储数据为存储客户端从上层应用或者外部主机接收到的
存储指令中所包含的待存储的数据;待写入数据为存储客户端在一次写入操作中写入到各
存储节点的数据,一次写入过程中的待写入数据以一个EC条带的形式写入到各存储节点
中。

步骤502:存储客户端计算所述待写入数据的key值的哈希值,确定计算得到的哈
希值对应的分区ID。

在一种可能的实施方式中,可以采用一致性哈希的方式计算待写入数据的key值
对应的分区ID。如图5所示,为DHT哈希环的?#32416;?#22312;系统初始化的时候,会对[0,2^32-1]这
个大范围的整数区间进行分段,分成多个区间大小相等的分区(partition),每个分区内的
Hash整数个数一样,代表了相同长度的Hash空间。根据待写入数据的key值的哈希值,确定
该哈希值落到的分区的分区ID。

步骤503:存储客户端根据所述分区ID查询分区视图,确定处理所述待写入数据的
主存储节点。

分布式存储系统中的分区视图管理模块会维护分区与存储节点(存储节点可以是
物理节点,?#37096;?#20197;是由物理节点逻辑划分的多个逻辑节点)的对应关系,该对应关系即为分
区视图。

进一步的,当待存储的数据较大,需要分成多个待写入的数据经过多次写入过程
写入到存储节点时,第一段待写入数据的数据偏移与待存储数据的数据偏移相同,后续各
段待写入数据的数据偏移为0。当待存储数据可以在一次写入过程中写入时,待写入数据的
数据偏移即为待存储数据的数据偏移。

步骤504:存储客户端向主存储节点发送写入请求,所述写入请求携带所述待写入
数据,以及所述待写入数据对应的key值、数据偏移、数据长度以及分区ID等?#21462;?br />

本发明实施例以存储节点1为主存储节点,存储节点2,3为备存储节点为例进行说
明。

步骤505:主存储节点对待写入数据执行EC编码,生成m个数据块以及k个校验块,m
+k个EC块构成一个EC条带,由m+k个存储节点分别进?#20889;?#29702;(包括主存储节点)。主存储节点
生成或刷新所述待写入数据的版本号,并存储key值与版本号的对应关系。

具体的,主存储节点将待写入数据以EC块的粒度进行切分,形成m个数据块,执行
EC编码,生成与m个数据块对应的k个校验块。主存储节点对所述待写入数据进行上述处理,
生成了m+k个EC块。主存储节点生成针对每个EC块的数据偏移以及数据长度。?#32416;?#24615;的,待
写入数据的地址范围为2.5M至4M,EC块的大小为1M,因此,待写入数据被划分为2M-3M以及
3M-4M这两个EC块。其中,第一个EC块的块内数据偏移为0.5M,块内数据长度为0.5M;第二个
EC块的块内数据偏移为0M,块内数据长度为1M;校验块的数据偏移为各个EC块数据偏移的
最小值,校验块的数据长度为各EC块数据长度的地址范围的叠加,具体的,在本例中,k=1,
即生成1个校验块,此时,校验块的块内数据偏移为0,校验块的数据长度为1M。在一种可能
的实施方式中,在主存储节点记录校验块的块内数据偏移和块内数据长度,在各备存储节
点以整个块为粒度进行校验块的写入。

需要说明的是,计算EC块的块内数据偏移以及块内数据长度可以采用现有技术中
EC编码的常用方式,本发明实施例对此并不进行限定。

在一种可能的实施方式中,当逻辑卷的存储空间被第一次写入数据时,此时,在写
入操作过程中,主存储节点生成该存储空间存储的待写入数据的版本号,当该存储空间中
存储的数据被刷新的过程中,主存储节点刷新上述版本号,可以采用每次刷新将版本号加1
的方式。

步骤506:主存储节点根据分区视图确定该分区ID对应的备存储节点,向备存储节
点发送写入请求,写入请求中携带待写入数据的key值和版本号,以及分配给该备存储节点
的EC块的数据内容、块内数据偏移以及块内数据长度。

在一种可能的实施方式中,所述写入请求可以使prepare请求。主存储节点处理1
个EC块,将剩余的m+k-1个EC块分别发送给分区视图中与分区ID对应的m+k-1个备存储节
点。主存储节点分配EC块可以采用随机分配的方式或者按照存储节点的标?#31471;?#24207;分配的方
式,本发明实施例对此并不进行限定。

步骤507:备存储节点接收所述写入请求,根据所述写入请求将EC块中的数据内容
按照写入到块内数据偏移以及块内数据长度对应的磁盘地址空间中,备存储节点记录待写
入数据的key以及版本号。写入操作完成后,备存储节点向主存储节点返回写入成功响应。
如果备存储节点发生故?#31995;?#33268;写入失败时,备存储节点向所述主存储节点返回写入失败响
应。

在一种可能的实施方式中,所述写入响应为prepare log消息,其中携带成功或失
败的指示标识。

在一种可能的实施方式中,主存储节点可以根据分区视图中存储节点的状态信息
确定备存储节点是否故障,如果备存储节点故障,主存储节点可以直接将分配给故?#31995;?#22791;
存储节点的EC块存储在本地,?#24674;?#34892;步骤506和507。

步骤508:主存储节点接收各备存储节点返回的写入响应,当确定写入成功的备存
储节点数量大于或等于m个时,主存储节点确定本次写入操作成功,存储分配给写入失败的
备存储节点的EC块,生成元数据信息,所述元数据信息包括待写入数据的分区ID、key值和
版本号,以及写入失败的EC blcok的块内数据偏移和块内数据长度。

在一种可能的方式中,主存储节点可以在接收到备存储节点返回的写入成功响应
时,确定发送该写入成功响应的备存储节点已经成功的将待写入数据写入磁盘。另外,主存
储节点可以从分区视图管理模块接收节点状态通知消息,确定故障节点写入失败,或者,主
存储节点接收到写入失败响应,确定发送写入失败响应的备存储节点写入失败。

元数据信息中:所述key值为步骤504中主存储节点接收到的待写入数据的key值,
版本号为步骤505中生成的与所述key值对应的版本号,块内数据偏移和块内数据长度为步
骤506中所述主存储节点向写入失败的备存储节点发送的写入请求中包含的,分区ID为步
骤504中存储客户端向主存储节点发送的所述待写入数据所属的分区ID。

主存储节点存储分配给写入失败的备存储节点的待写入数据的具体方式可以如
图3所示的方式。

在一种可能的实施方式中,当写入失败的备存储节点的个数大于k个时,主存储节
点确定写入失败,向存储客户端返回写入失败响应。

步骤509:主存储节点向写入成功的备存储节点返回确认消息,向存储客户端返回
写入成功响应。

在一种可能的实施方式中,所述确认消息具体为commit消息。

如图8所示,本发明实施例?#22266;?#20379;了一种故障节点恢复后的数据重建方法流程示
意图,包括:

步骤801:存储节点2在故障恢复以后,从分区视图管理模块获取分区视图,所述分
区视?#21450;?#25324;分区ID,以及与所述分区ID对应的主存储节点和备存储节点。

分区视图管理模块在收到存储节点2发送的分区视图获取请求时,将与所述存储
节点2相关分区的分区视图返回给所述存储节点2。与所述存储节点2相关的分区为:主存储
节点或备存储节点为存储节点2的分区。

在一种可能的实施方式中,当存储节点故障时,该故障节点可能是某些分区ID对
应的主存储节点,此时,分布式存储系统的管理模块会将该故障节点降格为备存储节点,并
刷新分区视图。

在一种可能的实施方式中,故障节点可能对应于多个分区ID,为多个分区ID的备
存储节点,故障节点以分区为粒度进行数据重建,本发明实施例以重建故障节点上一个分
区的数据为例进行说明。存储节点2向分区ID对应的主存储节点请求同步数据,本领域技术
人员可以理解的是,当存储节点上有多个分区的数据需要同步时,可以分别向各个分区ID
对应的主存储节点请求同步数据。

步骤802:存储节点2向主存储节点发送数据同步请求,所述数据同步请求携带分
区ID、key值以及与所述key值对应的版本号;

需要说明的是,在一种可能的实施方式中,存储节点2可以先向主存储节点发送分
区ID,主存储节点接收到分区ID后,再从存储节点2获取该分区ID下的所有key值以及各key
值对应的版本号。本领域技术人员可以理解的是,?#37096;?#20197;分多次重建一个分区下的数据,本
发明实施例对此并不进行限定。

步骤803:主存储节点将本节点记录的所述分区ID对应的各key值以及各key值对
应的版本号,与所述存储节点2上报的所述分区ID对应的所有key值以及与所述所有key值
对应的版本号进行比对:

情况一、当主存储节点上记录的所述分区ID对应的key值不包含在所述存储节点2
上报的所述分区ID对应的key值中时,说明在存储节点2故障期间,?#34892;?#30340;数据(与未包含的
key值对应)写入,主存储节点已成功写入该新的数据对应的EC块,但由于存储节点2故障,
分配给存储节点2的EC块暂时存储在主存储节点上,因此,该key值对应的数据(具体是分配
给存储节点2的EC块)未写入到存储节点2中,所述主存储节点将所述分配给存储节点2的EC
块以及元数据信息发送给所述存储节点2,存储节点2重建所述key值对应的数据;

情况二、所述key值对应的版本号与存储节点2上报的所述key值对应的版本号,当
版本号一致时,则说明存储节点2上所述key值对应的数据无需更新,即在存储节点2故障期
间,所述key值对应的数据没有发生更新,版本号没有发生变化;

情况三、当主存储节点未查询到所述key值时,说明主存储节点?#31995;?#25152;述key值对
应的数据已经被删除,所述主存储节点通知所述存储节点2删除所述key值对应的数据;

情况四、当主存储节点?#31995;?#25152;述key值对应的版本号大于所述存储节点2上报的
key值对应的版本号时,说明存储节点2在故障期间,所述key值对应的数据发生了更新,所
述主存储节点将所述key值对应的数据(具体是分配给存储节点2的EC块)以及元数据信息
发送给所述存储节点2,存储节点2重建所述key值对应的数据;

在情况一和情况?#27169;?#38656;要进行数据重建,数据重建的具体过程包括:

步骤804:主存储节点根据所述分区ID和待重建的数据对应的key值,查找元数据
信息,确定待重建的EC块对应的日志卷以及元数据信息,所述主存储节点将日志卷中记录
的待重建的EC块以及元数据信息中包含的块内数据偏移、块内数据长度以及版本号发送给
存储节点2。

步骤805:存储节点2进行数据重建,根据所述分配给所述第二存储节点的EC块的
块内数据偏移和块内数据长度,将所述EC块的数据写入到磁盘中,更新所述待写入数据的
key值对应的版本号。。数据重建完成后,向所述主存储节点返回数据重建成功消息。

步骤806:主存储节点删除已完成重建的数据的日志卷和元数据信息,所述主存储
节点回收所述日志卷,放入?#38556;?#38431;列。

在一种可能的实施方式中,当存储节点2正在进行数据重建时,如果数据恢复过程
中,?#34892;?#30340;写请求要写入到正在恢复的故障节点,当写的位置?#24065;?#32463;恢复完成的,则可以直
接写;如果还没恢复或正在恢复的位置,则等待,等数据恢复完以后再写。

本申请提供了一种分布式存储系统中的数据重建的方法、装置和系统,分布式存
储系统中的主存储节点对待写入数据进行EC编码,生成EC条带,将EC条带中的各个EC块分
别存储在各个存储节点上,当部分存储节点由于故?#31995;?#33268;写入EC块失败时,主存储节点将
分配给写入失败的存储节点的EC块存储在本地,并生成数据重建所需的元数据信息,当存
储节点故障恢复后,主存储节点将存储的分配给写入失败的存储节点的EC块以及该EC块对
应的元数据信息重新发送给该存储节点,以使得故障恢复后的该存储节点完成数据重建。
本申请提供的分布式存储系统中的数据重建的方案,当部分存储节点故障时,无需执行EC
反编码以恢复故障节点?#31995;?#25968;据,而是由主存储节点缓存分配给故障节点的EC块,再故障
节点恢复后再将缓存的EC块重新发送给故障节点进行数据重建。通过上述方案,避免了存
储节点故障时执行EC反编码带来的计算资源消耗,同?#24065;?#36991;免了执行EC反编码时传递大量
数据带来的网络资源消耗。?#32416;?#24615;的,当EC编码为4+2时,恢复1份数据需要4份数据,而本申
请中,只是在故障节点恢复后,由主存储节点向故障节点重新发送1份数据,明?#36234;档?#20102;网
络资源消耗;进一步的,分布式存储系统中,丢失1份数据的概?#35797;对?#22823;于丢失两份数据,而
丢失1份数据时,仍然可以还原出原始数据,因此,无需立刻执行EC反编码将丢失的数据还
原,当故障节点恢复后,采用本申请提出的数据重建的方案即可将故障节点?#31995;?#25968;据与其
他存储节点进行同步。

如前述分布式存储系统中数据重建的方法实施例相对应,如图9所示,本发明实施
例?#22266;?#20379;了一种存储节点,所述存储节点包括:

获取单元901,用于获取待写入数据以及所述待写入数据的key值,刷新所述key值
对应的版本号,对所述待写入数据进行EC编码,生成EC条带,所述EC条带包括m+k个EC块,其
中m个EC块为数据块,k个EC块为校验块,m为大于等于2的正整数,k为自然数;

处理单元902,用于查询分区视图,确定所述待写入数据所在的分区对应的备存储
节点,其中,所述第一存储节点为所述分区对应的主存储节点,第二存储节点为所述分区对
应的其中一个备存储节点;

发送单元903,用于向各备存储节点分别发送写入请求,所述写入请求携带所述待
写入数据所在的分区的分区ID、所述待写入数据的key值和版本号,以及分配给各备存储节
点的EC块的数据;

所述处理单元902,用于确定所述第二存储节点写入失败时,存储所述分配给所述
第二存储节点的EC块的数据,生成与所述分配给所述第二存储节点的EC块对应的元数据信
息,所述元数据信息包括所述待写入数据所在的分区的分区ID、所述待写入数据的key值和
版本号;

当所述第二存储节点故障恢复后,所述发送单元903,还用于将存储的所述分配给
所述第二存储节点的EC块的数据以及所述元数据信息发送给所述第二存储节点,以使得所
述第二存储节点进行数据重建。

进一步的,所述处理单元902,还用于确定写入成功的存储节点的数量大于等于m。

所述获取单元901,还用于接收所述第二存储节点发送的数据同步请求,所述数据
同步请求中携带所述分区ID,从所述第二存储节点获取所述第二存储节点中记录的所述分
区ID对应的一个或多个key值,以及与所述key值的版本号;

所述处理单元902,还用于将自身记录的所述分区ID对应的key值以及各key值的
版本号,与从所述第二存储节点获取的所述分区ID对应的一个或多个key值,以及与所述
key值的版本号,进行比对,根据比对结果确定需要进行数据重建;

所述发送单元903,具体用于根据所述元数据信息,将存储的需要进行数据重建的
key值对应的EC块的数据以及所述EC块的元数据信息发送给所述第二存储节点进行数据重
建。

所述处理单元902,具体用于执行以下至少一种比对处理:

当本存储节点记录的key值对应的版本号与从所述第二存储节点获取的所述key
值对应的版本号一致时,无需进行数据重建;

当本存储节点记录的key值中不包含从所述第二存储节点获取的key值时,则通知
所述第二存储节点删除所述本存储节点不包含的所述key值对应的数据;

当所述本存储节点记录的key值对应的版本号大于从所述第二存储节点获取的所
述key值对应的版本号时,执行数据重建操作;或,

当所述本存储节点记录的key值中不包含在从所述第二存储节点获取的key值中
时,则通知所述第二存储节点重建所述第二存储节点不包含的所述key值对应的数据。

所述处理单元902,还用于以m个EC块的大小为粒度将所述逻辑卷的存储地?#26041;?#34892;
等分,得到多个存储单元,为所述多个存储单元分配数据偏移标识。

所述获取单元901,具体用于使用一致性哈希算法计算所述待写入数据的key值对
应的哈希值,确定所述哈希值所属的分区的分区ID;或者,

所述获取单元901,具体用于从存储客户端发送的写入请求中获取所述待写入数
据对应的分区的分区ID。

所述获取单元901,还用于接收所述第二存储节点返回的写入失败响应,确定所述
第二存储节点写入失败;或者,

所述获取单元901,还用于根据所述分区视图,确定所述第二存储节点的状态为故
障,其中,所述分区视图中包含存储节点的状态信息。

所述处理单元902,具体用于分配?#38556;?#30340;存储空间作为日志卷,用于存储分配给写
入失败的存储节点的EC块,所述日志卷由至少一个日志块组成,所述日志块的大小与所述
EC块的大小相同。

如图10所示,本发明实施例?#22266;?#20379;了一种分布式存储系统,包括第一存储节点
1001和第二存储节点1002,

所述第一存储节点1001,用于获取待写入数据以及所述待写入数据的键key值,刷
新所述key值对应的版本号,对所述待写入数据进行纠删码EC编码,生成EC条带,所述EC条
带包括m+k个EC块,其中m个EC块为数据块,k个EC块为校验块,m为大于等于2的正整数,k为
自然数;

所述第一存储节点1001,还用于查询分区视图,确定所述待写入数据所在的分区
对应的备存储节点,其中,所述第一存储节点1001为所述分区对应的主存储节点,第二存储
节点1002为所述分区对应的其中一个备存储节点;

所述第一存储节点1001,还用于向各备存储节点发送写入请求,所述写入请求携
带所述待写入数据所在的分区的分区ID、所述待写入数据的key值和版本号,以及分配给各
备存储节点的EC块的数据;

当所述第二存储节点1002写入失败时,所述第一存储节点1001,还用于存储所述
分配给所述第二存储节点1002的EC块的数据,生成与所述分配给所述第二存储节点1002的
EC块对应的元数据信息,所述元数据信息包括所述待写入数据所在的分区的分区ID、所述
待写入数据的key值和版本号;

当所述第二存储节点1002故障恢复后,所述第一存储节点1001,还用于将存储的
所述分配给所述第二存储节点1002的EC块的数据以及所述元数据信息发送给所述第二存
储节点1002;

所述第二存储节点1002,用于根据所述元数据信息写入所述分配给所述第二存储
节点1002的EC块的数据。

分布式存储系统中的主存储节点对待写入数据进行EC编码,生成EC条带,将EC条
带中的各个EC块分别存储在各个存储节点上,当部分存储节点由于故?#31995;?#33268;写入EC块失败
时,主存储节点将分配给写入失败的存储节点的EC块存储在本地,并生成数据重建所需的
元数据信息,当存储节点故障恢复后,主存储节点将存储的分配给写入失败的存储节点的
EC块以及该EC块对应的元数据信息重新发送给该存储节点,以使得故障恢复后的该存储节
点完成数据重建。本申请提供的分布式存储系统中的数据重建的方案,当部分存储节点故
障时,无需执行EC反编码以恢复故障节点?#31995;?#25968;据,而是由主存储节点缓存分配给故障节
点的EC块,再故障节点恢复后再将缓存的EC块重新发送给故障节点进行数据重建。通过上
述方案,避免了存储节点故障恢复进行数据重建时执行EC反编码带来的计算资源消耗,同
?#24065;?#36991;免了执行EC反编码时传递大量数据带来的网络资源消耗。?#32416;?#24615;的,当EC编码为4+2
时,恢复1份数据需要4份数据,而本申请中,只是在故障节点恢复后,由主存储节点向故障
节点重新发送1份数据,明?#36234;档?#20102;网络资源消耗;进一步的,分布式存储系统中,丢失1份
数据的概?#35797;对?#22823;于丢失两份数据,而丢失1份数据时,仍然可以还原出原始数据,因此,无
需立刻执行EC反编码将丢失的数据还原,当故障节点恢复后,采用本申请提出的数据重建
的方案即可将故障节点?#31995;?#25968;据与其他存储节点进行同步。

在图9和10对应的实施例中,存储节点是以功能单元/功能模块的形式来呈现。这
里的“单元/模块”可以指特定应用集成电路(application-specific integrated
circuit,ASIC),电路,执行一个或多个软件或固件程序的处理器和存储器,集成逻辑电路,
和/或其他可以提供上述功能的器件。在一个简单的实施例中,本领域的技术人员可以想到
存储节点可以采用图2所示的形式。例如,获取单元901、处理单元902或发送单元903可以通
过图2的处理器和存储器?#35789;?#29616;。

本发明实施例?#22266;?#20379;了一种计算机存储介?#21097;?#29992;于储存为上述图9和10所示的设
备所用的计算机软件指令,其包含用于执行上述方法实施例所设计的程序。通过执行存储
的程序,可以实现应用分布式存储系统中数据重建的方法。

尽管在?#31169;?#21512;各实施例对本发明进行了描述,然而,在实施所要求保护的本发明
过程中,本领域技术人员通过查看所述附图、公开内容、以及所附权利要求书,可理解并实
现所述公开实施例的其他变化。在权利要求中,“包括”(comprising)一词不排除其他组成
部分或步骤,“一”或“一个”不排除多个的情况。单个处理器或其他单元可以实现权利要求
中列举的若?#19978;?#21151;能。相互不同的从属权利要求中记载了某些措施,但这并不表示这些措
施不能组合起来产生良好的效果。

本领域技术人员应明白,本发明的实施例可提供为方法、装置(设备)、或计算机程
序产品。因此,本发明可采用完全?#24067;?#23454;施例、完全软件实施例、或结合软件和?#24067;?#26041;面的
实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算
机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序
产品的形式。计算机程序存储/分布在合适的介质中,与其它?#24067;?#19968;起提供或作为?#24067;?#30340;一
部分,?#37096;?#20197;采用其他分布形式,如通过Internet或其它有线或无线电信系统。

本发明是参照本发明实施例的方法、装置(设备)和计算机程序产品的流程图和/
或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/
或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令
到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一
个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在
流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令?#37096;?#23384;储在能引导计算机或其他可编程数据处理设备以特
定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指
令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或
多个方框中指定的功能。

这些计算机程序指令?#37096;?#35013;载到计算机或其他可编程数据处理设备上,使得在计
算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或
其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一
个方框或多个方框中指定的功能的步骤。

尽管结合具体特征及其实施例对本发明进行了描述,显而?#20934;?#30340;,在不脱离本发
明的精神和范围的情况下,可对其进行各?#20013;?#25913;和组合。相应地,本说明书和附图仅仅是所
附权利要求所界定的本发明的?#32416;运?#26126;,且视为已覆盖本发明范围内的?#25105;?#21644;所?#34892;?br />改、变化、组合或等同物。显然,本领域的技术人员可以对本发明进行各种改动和变型而不
脱离本发明的精神和范围。这样,?#28909;?#26412;发明的这些修改和变型属于本发明权利要求及其
等同技术的范围之内,则本发明也意?#21450;?#21547;这些改动和变型在内。

关于本文
本文标题:分布式存储系统中的数据重建的方法、装置和系统.pdf
链接地址:http://www.pqiex.tw/p-6091715.html
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

[email protected] 2017-2018 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备17046363号-1 
 


收起
展开
平码五不中公式规律 至尊千炮捕鱼app下载 快乐12胆拖投注价格表 双色球复式投注方法 双色球中奖规则及金额 鹅贝贝游戏能赚钱吗 福建时时官网平台 玩老虎机有什么绝招 微信猜大小单双技巧 江西快三计划软件手机版 蚂蚁财富的基金赚钱吗