具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在具体描述本实施例的技术方案之前,首先对本发明实施例中所提到的独立冗余对象集阵列(Redundant Array of Independent objectSet,以下简称:RAIS)、对象集(对象的组合,以下简称:ObjectSet)以及对象(可以是物理上的磁盘,也可以是逻辑上的存储空间,以下简称:Object)之间的关系进行详细说明。
图1为本发明实施例中RAIS和ObjectSet之间的关系结构示意图,如图1所示,在本发明实施例中,一个RAIS包括多个ObjectSet。图2为本发明实施例中ObjectSet和Object之间的关系结构示意图,如图2所示,在本发明实施例中,一个ObjectSet包括多个Object。具体来说,若干Object的集合就是一个ObjectSet,或者说容纳Object的容器就是一个ObjectSet。ObjectSet是逻辑上的概念。RAIS不是一个实体,也是一个逻辑概念。
RAIS和ObjectSet之间的关系:一个ObjectSet只能属于一个RAIS。
ObjectSet和Object之间的关系:一个Object只能属于一个ObjectSet。
每个ObjectSet属于同一个物理设备,因此同一个ObjectSet内的所有Object也属于同一个物理设备。
图3为本发明实施例中存储节点、RAIS和ObjectSet之间的关系结构示意图,如图3所示,三个存储节点(以下简称:Storage Node)中每个StorageNode上均包含两个ObjectSet,其中,第一行虚线框中圈入的ObjectSet属于同一个RAIS,该RAIS对应的RAIS标识(以下简称:RAISID)例如可以为1,第二行虚线框中圈入的ObjectSet属于同一个RAIS,该RAIS对应的RAISID例如可以为2。需要说明的是,图3所示结构可以进一步扩展更多个StorageNode,也可以进一步扩展更多个RAIS,而且,图3所示的结构中,一个StorageNode上也可以有两个或者两个以上的ObjectSet同属于一个RAIS,其彼此之间的逻辑关系类似,此处不再赘述。
基于上述对分布式存储系统的逻辑划分,本发明实施例提出了下述技术方案,以提高存储空间的利用率,降低存储节点的负载,且支持多种类型的冗余备份方式,灵活性较高。
具体来说,本发明的一个实施例的技术方案可以为:
采用冗余算法生成待写入数据的M个切片数据和N个冗余片数据,所述M个切片数据和N个冗余片数据中任意损坏至多N个数据时,能够利用未损坏的数据恢复损坏的数据,其中M为大于1的自然数,N为不小于1的自然数;
将所述M个切片数据和N个冗余片数据分别存储到位于至少两个存储节点上的对象中,其中,每个存储节点包含至少一个对象集,每个对象集包含至少一个对象。上述实施例,可以应用于两种网络架构中,一种网络架构是集中式架构,另一种网络架构是分布式架构。
具体地,对于集中式架构来说,RAIS的相关描述信息均可以存储于独立元数据服务器上,客户端要向分布式存储系统中写入数据时,需要到元数据服务器上查询获取RAIS的相关描述信息。在这种网络架构下,上述实施例的执行主体可以是客户端,该客户端可以采用冗余算法生成待写入数据的切片数据和冗余片数据,然后根据获取的RAIS的相关描述信息即可将切片数据和冗余片数据发送给该RAIS中的各对象集中的对象。
对于分布式架构来说,RAIS的相关描述信息均存储在分布式存储系统的各个存储节点上,因此,上述实施例的执行主体可以是分布式存储系统中的任一存储节点。该存储节点可以生成客户端待写入数据的切片数据和冗余片数据,然后存储节点可以根据其本地存储的RAIS的相关描述信息将切片数据和冗余片数据发送给该RAIS中的各对象集中的对象。
需要说明的是,本发明上述实施例中的切片数据为对原始的待写入数据进行划分后获取的各片数据,而冗余片数据可以是采用冗余算法对切片数据进行冗余运算获取的几个冗余的数据,这几个冗余的数据可是保证在切片数据和冗余片数据中任意几个数据出错时,采用剩余的数据均能够恢复出原始数据,而具体可以允许几个数据出错,则由冗余算法确定。
本发明实施例,并非在各个Storage Node上进行多份存储,而是通过将切片数据和冗余片数据分别存储在位于至少两个存储节点上的对象中,从而可以实现Storage Node之间的冗余处理,在切片数据的个数大于1时可以提高存储空间地利用率且降低了Storage Node的负载,另外,本发明实施例可以支持不同的冗余算法,从而满足客户不同的可靠性需求,灵活性较高。
下面采用两个具体的实施例,对上述实施例进行详细说明。
图4为本发明数据冗余处理方法实施例一的流程图,如图4所示,本实施例的方法可以适用于集中式网络架构,本实施例的方法可以包括:
步骤401、向独立元数据服务器发送存储请求消息。
在客户端向分布式存储系统中的各个Storage Node中写入数据时,该客户端可以向独立元数据服务器发送存储请求消息。
步骤402、接收独立元数据服务器根据所述存储请求消息反馈的存储描述信息,该存储描述信息包含存储标识信息;
本实施例中的写数据请求中可以包含待写入数据和所需写入的RAIS的RAISID。举例来说,该RAISID可以是图3所示结构中第一行的RAIS的RAISID,也即,该待写入数据需要写入第一行的RAISID。
具体来说,在本实施例中,该独立元数据服务器上存储的RAIS的描述信息可以包含RAISID、RAIS中各对象集的标识信息和各对象集所在存储节点的标识信息。
相应地,客户端可以查询独立元数据服务器,获取RAIS的描述信息。该RAIS描述信息中包含RAISID、RAIS中各对象集的标识信息和各对象集所在Storage Node的标识信息。
举例来说,该独立元数据服务器上存储的一个RAIS的描述信息的格式如下所示:
{RAISID,{ObjSet1ID,ObjSet1IP},...,{ObjSetnID,ObjSetnIP}}
该存储描述信息描述了与RAISID对应的RAIS的各成员,其中,ObjSet1ID,...,ObjSetnID即为该RAIS中的成员,ObjSet1IP,...,ObjSetnIP即为各成员所在的Storage Node的地址。可以理解的是,在分布式存储系统中有多少个RAIS,就可以对应地在独立元数据服务器上存储多少个与上述RAIS的描述信息类似格式的信息。
本实施例并不限定独立元数据服务器将那个RAIS的描述信息反馈给客户端,本领域技术人员可以自行设计策略使独立元数据服务器根据预设策略向客户端反馈RAIS的描述信息,举例来说,该策略可以是各Storage Node上的负载,独立元数据服务器可以优先反馈负载较小的Storage Node对应的RAIS。
步骤403、采用冗余算法生成待写入数据的M个切片数据和N个冗余片数据。
客户端可以自行采用冗余算法生成待写入数据的M个切片数据和N个冗余片数据。
需要说明的是,步骤403也可以在步骤402之前执行,或者与步骤402并行执行。
客户端生成的M个切片数据和N个冗余片数据分别与RAIS中的一个ObjectSet中的对象对应。以图3所示结构举例来说,生成的切片数据有两个,冗余片数据有一个,两个切片数据可以与图3中第一行的RAIS的两个ObjectSet对应,一个冗余片数据可以与剩下的一个ObjectSet对应。需要说明的是,本实施例并不限定具体采用哪种冗余算法,本领域技术人员可以理解的是,只要能够将待写入数据生成切片数据,并利用切片数据生成冗余片数据的冗余算法均可。优选地,本实施例中的冗余算法可以采用现有技术中独立磁盘冗余阵列(Redundant Array of Independent Disc,以下简称:RAID)的算法实现,该RAID的算法包括RAID1,RAID5、RAID6等,或者本实施例中的冗余算法也可以采用纠删码的冗余算法。上述冗余算法均为现有技术,本实施例不再赘述。
可以理解的是,基于不同的冗余算法,所生成的切片数据的个数与冗余片数据的个数是不同的,例如采用RAID5这种冗余算法即可生成多个切片数据和一个冗余片数据,相应地,采用RAID5这种冗余算法的分布式存储系统的结构可以在图3所示结构的基础上再扩展几个Storage Node,每个StorageNode上均有一个ObjectSet,多个切片数据和一个冗余片数据可以与StorageNode上的ObjectSet中的对象对应。
由上述描述可知,基于所采用的冗余算法将待写入数据生成M份切片数据和N份冗余片数据,存储空间的利用率为M/(M+N),因此,只要M>1,则存储空间的利用率必然大于现有技术中多份机制的空间利用率1/(N+1)。
步骤404、根据对象集的标识信息和对象集所在存储节点的标识信息,将所述M个切片数据和N个冗余片数据存储到与所述存储标识信息对应的位于至少两个存储节点上的对象集中的对象中。
具体来说,每个Storage Node上还存储了对象集描述信息,该对象集描述信息中包含所述对象集的标识信息、对象的标识信息以及对象的磁盘分布信息。
举例来说,本实施例中的对象集描述信息可以采用如下格式:
{ObjSetID,{Obj1ID,Obj1Dev},...,{ObjnID,ObjnDev}}
其中,Obj1ID,...,ObjnID即为ObjSetID标识的ObjectSet中的对象,Obj1Dev,...,ObjnDev即为各对象对应的磁盘分布信息。
因此,每个Storage Node上的存储控制器可以根据该对象集描述信息将数据存储在对应的对象中。
上述实施例描述了集中式网络架构下数据的冗余处理方法,针对这种冗余处理方法,客户端读取数据的过程可以为:查询独立元数据服务器,获取与待读出数据对应的存储描述信息;根据该存储描述信息,从位于至少两个存储节点上的各对象集的对象中获取M个切片数据,对M个切片数据进行整合处理,获取待读出数据。
本发明上述实施例,客户端可以采用各种冗余算法获得M个切片数据和N个冗余片数据,并存储在RAIS的各ObjectSet的对象中,从而实现在RAIS中的各ObjectSet之间进行数据冗余处理,也即实现Storage Node之间的数据冗余处理。而且,本实施例的技术方案并非在各个Storage Node上进行多份存储,而是在其中几个Storage Node的ObjectSet上存储切片数据,在另外一个或者几个Storage Node的ObjectSet上存储冗余片数据,在切片数据的个数大于1时可以提高存储空间地利用率且降低了Storage Node的负载,另外,本实施例可以支持不同的冗余算法,从而满足客户不同的可靠性需求,灵活性较高。
图5为本发明数据冗余处理方法实施例二的流程图,图6为图5所示方法实施例二的处理过程示意图,如图5和6所示,本实施例中的方法可以适用于分布式架构,本实施例的方法可以包括:
步骤501、作为写发起者(Write Initiator,以下简称:WI)的Storage Node接收客户端发送的写数据请求,该写数据请求中包含待写入数据。
步骤502、作为WI的Storage Node获取本地存储的所述切片数据和冗余片数据所需写入的存储描述信息,该存储描述信息包含存储标识信息。
在本实施例中。该存储描述信息存储在作为WI的Storage Node本地,该存储描述信息可以包含RAISID、该存储节点上的对象集的标识信息以及所述RAIS中其它对象集的标识信息和所在存储节点的标识信息。
优选地,在每个Storage Node上,均可以存储存储描述信息,从而可使Storage Node互为备份。
具体来说,图6中的第一个Storage Node即为WI,该Storage Node接收客户端发送的写数据请求后,可以查询本地存储的存储描述信息。
举例来说,该作为WI的Storage Node本地存储的存储描述信息的格式可以为:
{RAISID,ObjSetID,{ObjSet1ID,ObjSet1IP},...,{ObjSetnID,ObjSetnIP}}
该存储描述信息也描述了与RAISID对应的RAIS的各成员,与图4所示实施例中的存储描述信息的不同之处在于,其中的ObjSetID即为作为WI的Storage Node上的成员,{ObjSet1ID,ObjSet1IP},...,{ObjSetnID,ObjSetnIP}即为该RAIS中其它成员和所在的Storage Node的地址。可以理解的是,在分布式存储系统中有多少个RAIS,就可以对应地在作为WI的Storage Node上存储多少个与上述存储描述信息类似格式的信息。
步骤503、作为WI的Storage Node采用冗余算法生成待写入数据的切片数据和冗余片数据。
在本实施例中,客户端可以不用生成切片数据和冗余片数据,而又该作为WI的Storage Node生成,简化了图4所示方法中客户端的操作。
步骤504、作为WI的Storage Node根据对象集的标识信息和对象集所在存储节点的标识信息,将所述M个切片数据和N个冗余片数据存储到与所述存储标识信息对应的位于至少两个存储节点上的对象集中的对象中。
具体来说,在作为WI的Storage Node上的存储控制器在获知RAIS中各ObjectSet的分布信息后,即可将切片数据和冗余片数据对应地发送给各Storage Node上的ObjectSet。举例来说,本实施例中第一个Storage Node可以将两个切片数据发送给第一Storage Node和第二个Storage Node,将冗余片数据发送给第三个Storage Node。
步骤505、各Storage Node在对象集的各对象中存储数据。
具体来说,每个Storage Node上还存储了对象集描述信息,该对象集描述信息中包含所述对象集的标识信息、对象的标识信息以及对象的磁盘分布信息。
举例来说,本实施例中的对象集描述信息可以采用如下格式:
{ObjSetID,{Obj1ID,Obj1Dev},...,{ObjnID,ObjnDev}}
其中,Obj1ID,...,ObjnID即为ObjSetID标识的ObjectSet中的对象,Obj1Dev,...,ObjnDev即为各对象对应的磁盘分布信息。
因此,每个Storage Node上的存储控制器可以根据该对象集描述信息将数据存储在对应的对象中。
步骤506、各Storage Node将存储响应发送给作为WI的Storage Node。
步骤507、作为WI的Storage Node将响应发送给客户端。
需要说明的是,图6仅示出了分布式存储系统中的三个Storage Node,本领域技术人员可以理解的是,该分布式存储系统还可以包括更多没有示出的Storage Node。
本发明上述实施例,作为WI的Storage Node可以采用各种冗余算法在RAIS中的各ObjectSet之间进行数据冗余处理,从而可以实现Storage Node之间的数据冗余处理。而且,本实施例的技术方案并非在各个Storage Node上进行多份存储,而是在其中几个Storage Node的ObjectSet上存储切片数据,在另外一个或者几个Storage Node的ObjectSet上存储冗余片数据,在切片数据的个数大于1时可以提高存储空间地利用率且降低了Storage Node的负载,另外,本实施例可以支持不同的冗余算法,从而满足客户不同的可靠性需求,灵活性较高。
图7为本发明数据冗余处理方法实施例三的流程图,图8为图7所示方法实施例三的处理过程示意图,如图7和8所示,本实施例中的方法是在采用图5所示方法实施例写入数据后的读数据过程,本实施例的方法可以包括:
步骤701、作为读发起者(Read Initiator,以下简称:RI)的Storage Node接收客户端发送的读数据请求。
需要说明的是,本实施例中作为RI的Storage Node既可以是与上述作为WI的Storage Node是同一个Storage Node,也可以是不同的Storage Node。本实施例也以第一个Storage Node为作为RI的Storage Node为例进行说明。
步骤702、作为RI的Storage Node获取本地存储的与待读取数据对应的存储描述信息。
步骤703、根据所述存储描述信息,从位于至少两个存储节点上的各对象集的对象中获取M个切片数据。
具体来说,本实施例中作为RI的Storage Node可以根据存储描述信息,从各对象集中获取切片数据。参见图8可知,第一个Storage Node可以根据获取的存储描述信息获知该第一个Storage Node与第二个Storage Node和第三个Storage Node属于同一个RAIS。因此,该作为RI的Storage Node,即第一个Storage Node即可从本地、第二个Storage Node和第三个Storage Node的ObjectSet上分别获取数据,该数据包括了切片数据。在具体实现时,各Storage Node仍然可以参考上述对象集描述信息的内容获知在其各自的ObjectSet中对象的分布信息等。
步骤704、作为RI的Storage Node对M个切片数据进行整合处理,获取待读出数据。
当作为RI的Storage Node获取到全部切片数据后,即可将这些切片数据进行整合处理,从而获取待读出数据。该过程可以采用现有技术实现,举例来说,若写入数据时采用的冗余算法是RAID5,则读出时也仍然按照RAID5对切片数据进行整合。
步骤705、作为RI的Storage Node将待读出数据反馈给客户端。
需要说明的是,图8仅示出了分布式存储系统中的三个Storage Node,本领域技术人员可以理解的是,该分布式存储系统还可以包括更多没有示出的Storage Node。
本实施例,基于上述数据写入过程,在数据读出过程中,可以分别从部署在不同Storage Node上属于同一个RAIS的ObjectSet中获取切片数据,并对这些切片数据进行整合后即可反馈给客户端。
图9为本发明数据冗余处理方法实施例四的处理过程示意图,如图9所示,本实施例在图4、图5或者图7的基础上,在采用新的Storage Node进行扩容后,提出一种对象集分解和迁移的解决方案。参考图9举例来说,当一个ObjectSet满足下面两个条件之一时,即可对ObjectSet进行分解:
1、一个ObjectSet容量超过阈值
2、一个新的Storage Node加入。
本实施例的图9中仅示出了有新的Storage Node加入的情况,本领域技术人员可以理解的是,对于ObjectSet容量超过阈值的情况来说,其处理过程类似,不再赘述。
本实施例中针对ObjectSet进行分解和迁移的原则为:将位于至少两个存储节点上的各对象集分解为至少两个子集,根据各存储节点上的负载状态,将分解后的至少两个子集中的部分子集分配给所述新的存储节点。
参见图9具体来说,在原来的四个Storage Node上,RAIS1包括3个ObjectSet1,分别分布在前三个Storage Node上,RAIS2包括3个ObjectSet2,分别分布在后三个Storage Node上。图9在原来的四个Storage Node的基础上,新增加了一个Storage Node,即New Node。因此,本实施例可以将RAIS1上的部分数据迁移到New Node上。需要说明的是,本实施例也可以对RAIS2上的数据进行迁移,或者将RAIS1和RAIS2上的部分数据都迁移。
本实施例对RAIS1所进行的分解和迁移过程如下:
将前三个Storage Node上的每个ObjectSet1分解为两个子set,即ObjectSet3和ObjectSet4。因为ObjectSet是抽象概念,所以该分裂过程并不涉及数据迁移。
由图9可以看出,分解后负载最重的Storage Node为第二个Storage Node和第三个Storage Node,因此,本实施例可以将从第二个Storage Node和第三个Storage Node上的ObjectSet3或者ObjectSet4对应的数据迁移到New Node上。由图9可以看出,在数据迁移后,各Storage Node上的负载较为均衡。
上述过程给出了扩容后,依据负载状态对各Storage Node上的数据进行迁移的过程,本领域技术人员可以理解的是,如果要删除某一个或几个StorageNode,则可以先将待删除的Storage Node上的数据迁移到保留的Storage Node上,然后再删除该Storage Node。
本实施例,在前述方法实施例的基础上,可以针对Storage Node的扩容和删除进行相应的数据迁移,既保证了数据存储的可靠性,由充分考虑到负载均衡,而且,分布式存储系统内部的Storage Node的管理也十分方便。
图10为本发明数据冗余处理装置实施例一的结构示意图,如图10所示,本实施例中的数据冗余处理装置包括:生成模块11和存储模块12,其中,生成模块11,用于采用冗余算法生成待写入数据的M个切片数据和N个冗余片数据,所述M个切片数据和N个冗余片数据中任意损坏至多N个数据时,能够利用未损坏的数据恢复损坏的数据,其中M为大于1的自然数,N为不小于1的自然数;存储模块12,用于将所述M个切片数据和N个冗余片数据分别存储到位于至少两个存储节点上的对象中,其中,每个存储节点包含至少一个对象集,每个对象集包含至少一个对象。
本实施例的数据冗余处理装置可以是分布式数据冗余处理装置中的一个Storage Node中的存储控制器,本实施例的数据冗余处理装置并非在各个Storage Node上进行多份存储,而是在分布式存储系统中的一个或几个Storage Node的ObjectSet上存储切片数据,在另外一个或者几个Storage Node的ObjectSet上存储冗余片数据,从而实现了Storage Node之间的冗余处理,在切片数据的个数大于1时可以提高存储空间地利用率且降低了StorageNode的负载,另外,本发明实施例可以支持不同的冗余算法,从而满足客户不同的可靠性需求,灵活性较高。
图11为本发明数据冗余处理装置实施例二的结构示意图,如图11所示,本实施例中的数据冗余处理装置在图10所示数据冗余处理装置的基础上,进一步包括:写请求接收模块13和描述信息获取模块14,其中写请求接收模块13,用于接收客户端发送的写数据请求,所述写数据请求中包含所述待写入数据;描述信息获取模块14,用于获取本地存储的写入所述M个切片数据和N个冗余片数据所需的存储描述信息,所述存储描述信息包含存储标识信息。存储模块12可以具体用于将所述M个切片数据和N个冗余片数据存储到与所述存储标识信息对应的位于至少两个存储节点上的对象集中的对象中。
本实施例的数据冗余处理装置可以用于执行图5所示方法实施例的方法,其实现原理和技术效果类似,此处不再赘述。
图12为本发明数据冗余处理装置实施例三的结构示意图,如图12所示,本实施例中的数据冗余处理装置在图10所示数据冗余处理装置的基础上,进一步地,包括:读请求接收模块15和数据读取模块16,其中,读请求接收模块15,用于接收客户端发送的读数据请求;数据读取模块16,用于获取本地存储的与待读取数据对应的存储描述信息;根据所述存储描述信息,从位于至少两个存储节点上的各对象集的对象中获取所述M个切片数据;对所述M个切片数据进行整合处理,获取待读出数据,并将所述待读出数据发送给所述客户端。
本实施例的数据冗余处理装置可以用于执行图7所示方法实施例的方法,其实现原理和技术效果类似,此处不再赘述。
图13为本发明数据冗余处理装置实施例四的结构示意图,如图13所示,本实施例中的数据冗余处理装置在图10所示数据冗余处理装置的基础上,进一步地,还包括:分解迁移模块17,用于将位于至少两个存储节点上的各对象集分解为至少两个子集,根据各存储节点上的负载状态,将分解后的至少两个子集中的部分子集分配给所述新的存储节点。
本实施例的数据冗余处理装置可以用于执行图9所示处理过程,其实现原理和技术效果类似,此处不再赘述。
鉴于上述方法和数据冗余处理装置的实施例,本发明还可以提供一种分布式存储系统,该存储系统包括至少两个存储节点,其中至少有一个存储节点可以包括图10~13所示的数据冗余处理装置,包括该数据冗余处理装置的存储节点即可为作为WI的Storage Node或者作为RI的Storage Node。本实施例的系统,其实现原理和技术效果在前述方法实施例和对应的数据冗余处理装置实施例中已经详细描述,此处不再赘述。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。