掌桥专利:专业的专利平台
掌桥专利
首页

数据修复方法及分布式存储集群

文献发布时间:2023-06-19 09:26:02


数据修复方法及分布式存储集群

技术领域

本申请涉及存储技术领域,尤其涉及一种数据修复方法及分布式存储集群。

背景技术

在分布式存储集群中,通常采用副本技术来提升数据的可靠性和可用性。副本技术指将原始数据拷贝成几份相同数据,存储于分布式存储集群中。拷贝的每一份数据可称为数据副本。当某一数据副本出现损坏或者所在集群节点或磁盘发送故障时,可通过其他数据副本修复被损坏的数据副本,从而保证数据的可靠性及可用性。

在分布式存储集群中,通常以段(Segment)为单位修复数据。具体修复方式至少包括以下两种:

方式一,读取Segment的一个可用数据副本,生成新的数据副本,将该新的数据副本存储至分布式存储集群中。由于Segment的粒度较大(比如,256MB),当Segment中仅写入过少量数据(比如,64KB)时,该修复方式会导致不必要的系统资源消耗,影响数据修复效率。

方式二,将Segment划分为多个修复区间,比如,每1MB划分为一个修复区间。维护Segment的写入位图(bitmap),该写入位图中的每一位对应一个修复区间,用于标识对应修复区间是否已写入过数据。在对Segment进行修复时,可遍历该Segment对应写入位图,仅对标识写入过数据的修复区间进行修复。该修复方式可适当减少修复的数据量,提升数据修复效率,但是,需要在集群元数据服务器中存储写入位图,因此,会消耗分布式存储集群的存储资源。

发明内容

有鉴于此,本申请提出一种数据修复方法及分布式存储集群,用以提升数据修复效率,同时,可节约分布式存储集群的存储资源。

为实现上述申请目的,本申请提供了如下技术方案:

第一方面,本申请提供一种数据修复方法,应用于分布式存储集群,所述分布式存储集群包括至少一个集群节点,每一个集群节点包括至少一块用于存储数据的磁盘,每一块磁盘按照预设Block大小划分为多个Block,所述分布式存储集群配置有至少一个LUN,每一个LUN按照预设Segment大小划分为多个逻辑区间,每一个逻辑区间按照预设Block大小划分为多个子逻辑区间,每一个集群节点针对本节点上的每一块磁盘部署有对应的磁盘管理模块,每一个集群节点还部署有数据修复模块,所述方法包括:

接收到修复消息的目标数据修复模块,获取所述修复消息包括的待修复的目标Segment的标识以及用于存储修复后数据副本的第一磁盘的标识,其中,所述目标数据修复模块所属集群节点上的第二磁盘存储有所述目标Segment的可用数据副本;

所述目标数据修复模块按照预设修复粒度将所述目标Segment划分为多个修复区间;

针对每一个修复区间执行如下操作:

所述目标数据修复模块向所述第二磁盘对应的第二磁盘管理模块下发针对当前修复区间的修复读命令;

所述第二磁盘管理模块基于所述修复读命令,确定所述当前修复区间对应的各目标子逻辑区间;

针对每一个目标子逻辑区间,所述第二磁盘管理模块确定本地记录的所述目标Segment的映射表中是否存在该目标子逻辑区间对应的目标Block的标识,所述映射表用于记录所述目标Segment中已映射的子逻辑区间与Block的标识的映射关系;

如果存在,所述第二磁盘管理模块从所述目标Block中读取数据,并将该目标子逻辑区间在写入位图中对应位的值设置为第一值;如果不存在,所述第二磁盘管理模块将该目标子逻辑区间在写入位图中对应位的值设置为第二值;

所述第二磁盘管理模块向所述目标数据修复模块返回针对当前修复区间的读取结果,所述读取结果包括当前修复区间的写入位图;

如果所述写入位图中包括值为第一值的位,所述目标数据修复模块向所述第一磁盘对应的第一磁盘管理模块发送修复写命令,所述修复写命令包括读取到的数据以及所述写入位图;

所述第一磁盘管理模块为所述写入位图中每一个值为第一值的位所标识的子逻辑区间分配对应的Block,并将数据写入新分配的Block中。

可选的,如果所述写入位图中不包括值为第一值的位,所述目标数据修复模块结束针对当前修复区间的操作。

可选的,所述如果存在,所述第二磁盘管理模块从所述目标Block中读取数据之后,所述方法还包括:

如果从所述目标Block读取的数据为0,所述第二磁盘管理模块将该目标Block对应目标子逻辑区间在写入位图中对应位的值设置为第二值。

可选的,所述将数据写入新分配的Block中之后,所述方法还包括:

所述第一磁盘管理模块记录值为第一值的位所标识的子逻辑区间与为其分配的Block的映射关系。

可选的,所述写入位图包括的位的个数等于修复区间包括的目标子逻辑区间的个数。

第二方面,本申请提供一种分布式存储集群,所述分布式存储集群包括至少一个集群节点,每一个集群节点包括至少一块用于存储数据的磁盘,每一块磁盘按照预设Block大小划分为多个Block,所述分布式存储集群配置有至少一个LUN,每一个LUN按照预设Segment大小划分为多个逻辑区间,每一个逻辑区间按照预设Block大小划分为多个子逻辑区间,每一个集群节点针对本节点上的每一块磁盘部署有对应的磁盘管理模块,每一个集群节点还部署有数据修复模块;

目标数据修复模块,用于在接收到修复消息时,获取所述修复消息包括的待修复的目标Segment的标识以及用于存储修复后数据副本的第一磁盘的标识,其中,所述目标数据修复模块所属集群节点上的第二磁盘存储有所述目标Segment的可用数据副本;按照预设修复粒度将所述目标Segment划分为多个修复区间;向所述第二磁盘对应的第二磁盘管理模块下发针对当前修复区间的修复读命令;

所述第二磁盘管理模块,用于基于所述修复读命令,确定所述当前修复区间对应的各目标子逻辑区间;针对每一个目标子逻辑区间,确定本地记录的所述目标Segment的映射表中是否存在该目标子逻辑区间对应的目标Block的标识,所述映射表用于记录所述目标Segment中已映射的子逻辑区间与Block的标识的映射关系;如果存在,从所述目标Block中读取数据,并将该目标子逻辑区间在写入位图中对应位的值设置为第一值;如果不存在,将该目标子逻辑区间在写入位图中对应位的值设置为第二值;向所述目标数据修复模块返回针对当前修复区间的读取结果,所述读取结果包括当前修复区间的写入位图;

所述目标数据修复模块,还用于如果所述写入位图中包括值为第一值的位,向所述第一磁盘对应的第一磁盘管理模块发送修复写命令,所述修复写命令包括读取到的数据以及所述写入位图;

所述第一磁盘管理模块,用于为所述写入位图中每一个值为第一值的位所标识的子逻辑区间分配对应的Block,并将数据写入新分配的Block中。

可选的,所述目标数据修复模块,还用于如果所述写入位图中不包括值为第一值的位,结束针对当前修复区间的操作。

可选的,所述第二磁盘管理模块,还用于如果从所述目标Block读取的数据为0,将该目标Block对应目标子逻辑区间在写入位图中对应位的值设置为第二值。

可选的,所述第一磁盘管理模块,还用于记录值为第一值的位所标识的子逻辑区间与为其分配的Block的映射关系。

可选的,所述写入位图包括的位的个数等于修复区间包括的目标子逻辑区间的个数。

由以上描述可以看出,本申请实施例中,分布式存储集群可基于更小粒度筛选需要修复的数据,因此,可有效减少修复数据量,提升数据修复效率。此外,在修复过程中,由于可根据子逻辑区间与Block的映射关系自动生成写入位图,而无需占用存储空间存储该写入位图,因此,可有效解决分布式存储集群的存储资源。

附图说明

为了更清楚地说明本申请实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1是示例性示出的针对同一原始数据存储多个数据副本的示意图;

图2是示例性示出的一种逻辑资源到物理资源的映射关系示意图;

图3是示例性示出的修复后的逻辑资源到物理资源的映射关系示意图;

图4是本申请实施例示出的一种数据修复方法流程图;

图5是本申请实施例示出的一种逻辑资源到物理资源的映射关系示意图;

图6是本申请实施例示出的修复后的逻辑资源到物理资源的映射关系示意图。

具体实施方式

这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。

在本申请实施例使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本申请实施例。在本申请实施例中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。

应当理解,尽管在本申请实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请实施例范围的情况下,协商信息也可以被称为第二信息,类似地,第二信息也可以被称为协商信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。

分布式存储集群通常包括多台服务器(亦称为集群节点)。每一个集群节点包括至少一块用于存储数据的磁盘(亦称为数据盘)。以下描述中若无特殊说明,磁盘均指数据盘。

为了保证数据的可靠性和可用性,在分布式存储集群中,针对同一原始数据会存储多个数据副本。参见图1,为示例性示出的针对同一原始数据存储多个数据副本的示意图。从图1可以看出,该原始数据对应3个数据副本(数据副本1~数据副本3),分别存储于磁盘OSD1~OSD3中。

用户基于逻辑单元号(Logical Unit Number,LUN)访问分布式存储集群中各集群节点上的存储资源。

这里,需要说明的是,分布式存储集群天然支持精简配置,随用随给。即,在实际写入过程中,为LUN分配真实的物理资源,完成从逻辑资源到物理资源的映射。

参见图2,为示例性示出的一种逻辑资源到物理资源的映射关系示意图。图2所示分布式存储集群包括4个集群节点(Server1~Server4),其中,Server1包括2块磁盘,分别记为OSD1和OSD4;Server2包括1块磁盘,记为OSD2;Server3包括2块磁盘,分别记为OSD3和OSD5;Server4包括1块磁盘,记为OSD6。

该分布式存储集群配置有LUN1,LUN1按照预设Segment(可缩写为Seg)大小(256MB)划分为多个逻辑区间,包括:【0,256MB】、【256MB,512MB】、【512MB,768MB】,以此类推。相应的,每一块磁盘(OSD)按照预设Block大小(256MB)划分为多块Block(可缩写为Blk)。

如图2所示,LUN1的逻辑区间【0,256MB】内已写入过数据块A和数据块C,且该逻辑区间已映射到Seg1,则当前LUN1的映射表可表示为:

LUN1→[0:Seg1]

其中,“0”为逻辑区间【0,256MB】的起始地址,用于标识该逻辑区间。从该映射表可以看出,当前LUN1中已有一个逻辑区间被映射,或者说,已有一个逻辑区间被写入过数据。

此外,从图2中还可以看出,Seg1对应数据在分布式存储集群中存在3个数据副本,分别存储于OSD1的Blk5、OSD2的Blk3以及OSD3的Blk8,则Seg1对应映射表可表示为:

Seg1→[OSD1:Blk5;OSD2:Blk3;OSD3:Blk8]

当OSD1故障导致存储于OSD1中的数据副本丢失时,为了保证数据的高可靠性,需要修复该丢失的数据副本。

作为一种实施方式,可从OSD2的Blk3(或者OSD3的Blk8)中读取整块数据(即整个Seg1的数据副本),写入OSD6的Blk10中,从而使Seg1恢复3个数据副本,如图3所示。此时,Seg1对应映射表为:

Seg1→[OSD2:Blk3;OSD3:Blk8;OSD6:Blk10]

由于Segment粒度(比如,256MB)较大,修复整个Segment对应数据会导致系统资源消耗较大,尤其在Segment中实际写入数据较少时,会产生大量无用的系统资源消耗,影响数据修复效率。

作为另一种实施方式,可将Segment划分为多个修复区间,并维护Segment的写入位图(bitmap)。该写入位图中的每一位(bit)对应Segment的一个修复区间,用于标识该修复区间是否写入过数据。比如,bit=0,表示对应修复区间未写入过数据;bit=1,表示对应修复区间已写入过数据。

仍以Seg1为例,将Seg1按照1MB大小划分为多个修复区间,依次为【0,1MB】、【1MB,2MB】、【2MB,3MB】、……、【255MB,256MB】,则对应写入位图包括256bit。以数据块A、数据块C均位于修复区间【0,1MB】为例,则当前Seg1的写入位图可表示为:

Seg1→[bitmap:10000000……000]

其中,Seg1的修复区间【0,1MB】对应bit为1,表示已写入过数据;其它修复区间对应bit为0,表示未写入过数据。

当OSD1故障导致需要修复Seg1对应数据副本时,可根据Seg1对应写入位图确定出实际写入过数据的修复区间,即,对应bit为1的修复区间【0,1MB】,可从OSD2的Blk3(或者OSD3的Blk8)中仅读取【0,1MB】区间的数据,并写入OSD6的Blk10中。

可以看出,本实施方式需要修复的数据量变少,可在一定程度上提升修复效率。但是,Segment的写入位图需要存储至集群元数据服务器中,因此,会消耗集群元数据服务器的存储资源。

针对上述问题,本申请实施例提出一种数据修复方法,该方法可基于更小粒度筛选需要修复的数据,减少修复数据量,提升数据修复效率。此外,在修复过程中,无需占用存储空间存储写入位图,可有效解决分布式存储集群的存储资源。

为了使本申请实施例的目的、技术方案和优点更加清楚,下面结合附图和具体实施例对本申请实施例执行详细描述:

参见图4,为本申请实施例示出的一种数据修复方法的流程图。该流程应用于分布式存储集群。

该分布式存储集群包括至少一个集群节点。每一个集群节点包括至少一块用于存储数据的磁盘。每一块磁盘按照预设Block大小(比如,64KB)划分为多个Block。

该分布式存储集群配置有至少一个LUN,每一个LUN按照预设Segment大小(比如,256MB)划分为多个逻辑区间,比如,【0,256MB】、【256MB,512MB】、【512MB,768MB】,以此类推。

每一个逻辑区间按照预设Block大小(比如,64KB)划分为多个子逻辑区间,比如,【0,64KB】、【64KB,128KB】、【128KB,192KB】,以此类推。

在数据写入过程中,分布式存储集群建立逻辑资源到物理资源的映射。该映射主要包括:逻辑区间到Segment的映射,Segment到磁盘的映射,以及子逻辑区间到Block的映射。

参见图5,为本申请实施例示出的一种逻辑资源到物理资源的映射示意图。如图5所示,LUN1的逻辑区间【0,256MB】内已写入数据块A和数据块C。数据块A的起始逻辑地址为0,数据块大小为64KB,位于子逻辑区间【0,64KB】内;数据块C的起始逻辑地址为128KB,数据块大小为64KB,位于子逻辑区间【128KB,192KB】内。

逻辑区间【0,256MB】已映射到Seg1,因此,LUN1的映射表可表示为:

LUN1→[0:Seg1]

其中,“0”为逻辑区间【0,256MB】的起始地址,用于标识该逻辑区间。

Seg1在图5所示分布式存储集群中对应3个数据副本,分别存储于磁盘OSD1~OSD3,则Seg1到各磁盘的映射关系可表示为:

Seg1→[OSD1;OSD2;OSD3]

这里,需要说明的是,LUN的映射表(用于记录LUN中逻辑区间与Segment的映射关系)以及Segment到磁盘的映射关系均存储在集群元数据服务器中。

此外,如图5所示,在OSD1中,Seg1的子逻辑区间【0,64KB】被映射到Blk100,子逻辑区间【128KB,192KB】被映射到Blk200,则OSD1中该Seg1的映射表可表示为:

Seg1→[0:Blk100;128KB:Blk200]

其中,“0”为子逻辑区间【0,64KB】的起始地址;“128KB”为子逻辑区间【128KB,192KB】的起始地址。该映射表存储在OSD1中。

在OSD2中,Seg1的子逻辑区间【0,64KB】被映射到Blk15,子逻辑区间【128KB,192KB】被映射到Blk68,则OSD2中该Seg1的映射表可表示为:

Seg1→[0:Blk15;128KB:Blk68]

该映射表存储在OSD2中。

在OSD3中,Seg1的子逻辑区间【0,64KB】被映射到Blk68,子逻辑区间【128KB,192KB】被映射到Blk20,则OSD3中该Seg1的映射表可表示为:

Seg1→[0:Blk68;128KB:Blk20]

该映射表存储在OSD3中。

从上述描述可以看出,本申请实施例中,逻辑区间到Segment的映射以及Segment到磁盘的映射均存储在集群元数据服务器中,而子逻辑区间到Block的映射存储在各磁盘中。

基于上述分布式存储集群的存储结构以及映射关系,下面对本申请实施例的具体数据修复流程进行介绍。如图4所示,该流程可包括以下步骤:

步骤401,接收到修复消息的目标数据修复模块,获取修复消息包括的待修复的目标Segment的标识以及用于存储修复后数据副本的第一磁盘的标识。

这里,需要说明的是,分布式存储集群部署有集群管理模块。集群管理模块负责在检测到Segment需要修复时,从集群中,为该Segment指定用于存储修复后数据副本的磁盘。

这里,将当前需要修复的Segment,称为目标Segment;将为目标Segment指定的用于存储修复后数据副本的磁盘,称为第一磁盘。可以理解的是,之所以称为目标Segment、第一磁盘,只是为便于区分而进行的命名,并非用于限定。

仍以图5所示分布式存储集群为例,比如,OSD1故障导致Seg1在OSD1中对应的数据副本丢失,则集群管理模块可指定OSD6存储修复后的Seg1的数据副本。

本申请实施例中,集群仍需利用可用数据副本修复丢失的数据副本。为此,集群管理模块可根据已记录的Segment与磁盘的映射关系,确定可用数据副本所在磁盘。

比如,Seg1与各磁盘的映射关系如下:

Seg1→[OSD1;OSD2;OSD3]

当前OSD1故障,则还存在两份可用数据副本,分别位于OSD2和OSD3中。

集群管理模块可选择任一可用数据副本所在磁盘所属集群节点发送修复消息。这里,需要说明的是,每一个集群节点部署有数据修复模块。集群管理模块具体将修复消息发送至集群节点的数据修复模块。

这里,将接收到集群管理模块发送的修复消息的数据修复模块,称为目标数据修复模块。该目标数据修复模块所属集群节点的第二磁盘中存储有目标Segment的可用数据副本。可以理解的是,之所以称为目标数据修复模块、第二磁盘,只是为便于区分而进行的命名,并非用于限定。

目标数据修复模块从修复消息中获取待修复的目标Segment的标识以及用于存储修复后数据副本的第一磁盘的标识。

步骤402,目标数据修复模块按照预设修复粒度将目标Segment划分为多个修复区间。

这里,需要说明的是,该预设修复粒度小于预设Segment大小,但大于预设Block大小。比如,预设Segment大小为256MB,预设Block大小为64KB,预设修复粒度为1MB。

仍以Seg1为例,按照预设修复粒度1MB,可将Seg1划分为256个修复区间,依次为【0,1MB】、【1MB,2MB】、【2MB,3MB】、……、【255MB,256MB】。

针对每一个修复区间执行后续修复处理。

步骤403,目标数据修复模块向第二磁盘对应的第二磁盘管理模块下发针对当前修复区间的修复读命令。

这里,需要说明的是,集群节点针对本节点上每一块磁盘配置对应的磁盘管理模块,该磁盘管理模块通常指磁盘的服务进程。这里,将第二磁盘对应的磁盘管理模块称为第二磁盘管理模块。

目标数据修复模块向第二磁盘管理模块下发用于针对当前修复区间的修复读命令。

比如,当前修复区间为【0,1MB】,第二磁盘为OSD2,则目标数据修复模块向OSD2对应磁盘管理模块下发针对【0,1MB】的修复读命令。

步骤404,第二磁盘管理模块基于修复读命令,确定当前修复区间对应的各目标子逻辑区间。

第二磁盘管理模块可从修复读命令中获取此次需要读取的范围(即当前修复区间),然后,确定该当前修复区间对应的各子逻辑区间。

这里,需要说明的是,LUN的每一个逻辑区间已按照预设Block大小(比如,64KB)划分为多个子逻辑区间。当逻辑区间被映射到Segment时,相当于Segment按照预设Block大小划分为多个子逻辑区间,因此,当目标Segment需要修复时,该目标Segment的每一个修复区间必定对应一定的子逻辑区间。

本申请实施例中,将当前修复区间对应的各子逻辑区间,均称为目标子逻辑区间。可以理解的是,之所以称为目标子逻辑区间,只是为便于区分而进行的命名,并非用于限定。

仍以当前修复区间为【0,1MB】为例,该修复区间对应16个子逻辑区间,依次为【0,64KB】、【64KB,128KB】、【128KB,192KB】、……、【1MB-64KB,1MB】。

步骤405,第二磁盘管理模块针对每一个目标子逻辑区间,确定本地记录的目标Segment的映射表中是否存在该目标子逻辑区间对应的目标Block的标识。

如前所述,Segment的映射表用于记录Segment中已映射的子逻辑区间与Block的标识的映射关系。因此,第二磁盘管理模块通过查询目标Segment的映射表,可确定该映射表中是否存在各目标子逻辑区间对应的目标Block的标识。这里,目标Block只是为便于区分而进行的命名,并非用于限定。

步骤406,如果存在,第二磁盘管理模块从目标Block中读取数据,并将该目标子逻辑区间在写入位图中对应位的值设置为第一值;如果不存在,第二磁盘管理模块将目标子逻辑区间在写入位图中对应位的值设置为第二值。

这里,需要说明的是,如果目标Segment的映射表中存在目标子逻辑区间对应的目标Block的标识,说明该目标子逻辑区间写入过数据,则第二磁盘管理模块可从该目标子逻辑区间对应目标Block读取相应数据;如果目标Segment的映射表中不存在该目标子逻辑区间对应的目标Block的标识,说明该目标子逻辑区间未写入过数据,则不执行针对该目标子逻辑区间的读取操作。

此外,第二磁盘管理模块还需根据各目标子逻辑区间的映射情况,生成修复区间的写入位图。该写入位图中的每一位对应修复区间中一个目标子逻辑区间。

具体为,如果目标Segment的映射表中存在当前目标子逻辑区间对应的目标Block的标识,则将该目标子逻辑区间在写入位图中对应位的值设置为第一值;如果目标Segment的映射表中不存在当前目标子逻辑区间对应的目标Block的标识,则将该目标子逻辑区间在写入位图中对应位的值设置为第二值。即,通过第一值和第二值标识对应目标子逻辑区间是否已写入过数据。比如,第一值为1,表示对应目标子逻辑区间写入过数据;第二值为0,表示对应目标子逻辑区间未写入过数据。

仍以图5所示Seg1为例,OSD2对应磁盘管理模块接收到针对Seg1的修复区间【0,1MB】的修复读命令,确定该修复区间对应Seg1中的16个子逻辑区间,分别为【0,64KB】、【64KB,128KB】、【128KB,192KB】、……、【1MB-64KB,1MB】。该磁盘管理模块获取本地记录的Seg1的映射表如下:

Seg1→[0:Blk15;128KB:Blk68]

针对子逻辑区间【0,64KB】,磁盘管理管理模块查询Seg1的映射表,可知该子逻辑区间【0,64KB】已被映射到Blk15,则从OSD2的Blk15中读取对应数据,并将该子逻辑区间【0,64KB】在写入位图中对应位设置为1,用于表明该子逻辑区间【0,64KB】已写入过数据。

针对子逻辑区间【64KB,128KB】,磁盘管理管理模块查询Seg1的映射表,可知该子逻辑区间【64KB,128KB】未被映射,因此,无需执行针对该子逻辑区间的读取操作,并将该子逻辑区间【64KB,128KB】在写入位图中对应位设置为0,表明该子逻辑区间【64KB,128KB】未写入过数据。

同理,针对其它各子逻辑区间分别执行上述操作,可得到Seg1的修复区间【0,1MB】对应的写入位图:

Seg1的【0,1MB】→[bitmap:1010000000000000]

这里,需要补充说明的是,第二磁盘管理模块从目标Block读取到数据后,可进一步对该数据进行判断。如果该数据为0(修复没有意义),则第二磁盘管理模块将该目标Block对应目标子逻辑区间在写入位图中对应位的值设置为第二值。后续处理中将不对这部分数据进行修复,以减少修复的数据量,提升数据修复效率。

步骤407,第二磁盘管理模块向目标数据修复模块返回针对当前修复区间的读取结果,该读取结果包括当前修复区间的写入位图。

目标数据修复模块判断写入位图中是否包括值为第一值的位。如果不包括,说明该修复区间未写入过数据,不需要修复,结束针对当前修复区间的操作,返回步骤403,执行针对下一修复区间的操作;如果包括,说明该修复区间写入过数据,需要执行修复处理,转步骤408。

步骤408,目标数据修复模块向第一磁盘对应的第一磁盘管理模块发送修复写命令,该修复写命令包括读取到的数据以及当前修复区间的写入位图。

这里,将第一磁盘对应的磁盘管理模块称为第一磁盘管理模块。可以理解的是,之所以称为第一磁盘管理模块,只是为便于区分而进行的命名,并非用于限定。

步骤409,第一磁盘管理模块为写入位图中每一个值为第一值的位所标识的子逻辑区间分配对应的Block,并将数据写入该新分配的Block中。

如前所述,第一磁盘为指定的用于存储修复数据副本的磁盘。第一磁盘管理模块从第一磁盘中为写入位图中值为第一值的位所标识的子逻辑区间分配对应的Block,并将读取的数据写入相应的Block中。

仍以Seg1的修复区间【0,1MB】为例,该修复区间对应的写入位图为:

Seg1的【0,1MB】→[bitmap:1010000000000000]

第一磁盘为OSD6,则OSD6对应磁盘管理模块接收到修复写命令后,获取该命令中携带的待修复的数据以及修复区间【0,1MB】的写入位图。

OSD6的磁盘管理模块依次遍历写入位图中的各个位(从左到右依次为bit0~bit15)。bit0=1,则磁盘管理模块从OSD6中为该bit0对应子逻辑区间【0,64KB】分配对应Block(记为Blk0),并将子逻辑区间【0,64KB】的数据写入Blk0;bit1=0,则磁盘管理模块无需分配Block;bit2=1,则磁盘管理模块从OSD6中为该bit2对应子逻辑区间【128KB,192KB】分配对应Block(记为Blk1),并将子逻辑区间【128KB,192KB】的数据写入Blk1;以此类推。

可以看出,针对修复区间【0,1MB】的修复,最终只涉及到实际写入过数据的两个子逻辑区间的修复,因此,可大大减少修复的数据量,提升修复效率。

此外,还需要说明的是,第一磁盘管理模块将数据写入第一磁盘后,还需建立数据所属子逻辑区间与对应Block的映射关系。

比如,前述所述,OSD6的磁盘管理模块为Seg1的子逻辑区间【0,64KB】分配Blk0;为Seg1的子逻辑区间【128KB,192KB】分配Blk1,则OSD6的磁盘管理模块本地记录Seg1的映射表为:

Seg1→[0:Blk0;128KB:Blk1]

并将该映射表存储至OSD6中。

此时,逻辑资源到物理资源的映射关系如图6所示。

至此,完成图4所示流程。

通过图4所示流程可以看出,本申请实施例可大幅减少需要修复的数据量,提升数据修复效率。此外,由于可根据子逻辑区间与Block的映射关系自动生成写入位图,而无需占用存储空间存储该写入位图,因此,可有效解决分布式存储集群的存储资源。

以上对本申请实施例提供的方法进行了描述,下面对本申请实施例提供的分布式存储集群进行描述:

该分布式存储集群包括至少一个集群节点,每一个集群节点包括至少一块用于存储数据的磁盘,每一块磁盘按照预设Block大小划分为多个Block,所述分布式存储集群配置有至少一个LUN,每一个LUN按照预设Segment大小划分为多个逻辑区间,每一个逻辑区间按照预设Block大小划分为多个子逻辑区间,每一个集群节点针对本节点上的每一块磁盘部署有对应的磁盘管理模块,每一个集群节点还部署有数据修复模块;

目标数据修复模块,用于在接收到修复消息时,获取所述修复消息包括的待修复的目标Segment的标识以及用于存储修复后数据副本的第一磁盘的标识,其中,所述目标数据修复模块所属集群节点上的第二磁盘存储有所述目标Segment的可用数据副本;按照预设修复粒度将所述目标Segment划分为多个修复区间;向所述第二磁盘对应的第二磁盘管理模块下发针对当前修复区间的修复读命令;

所述第二磁盘管理模块,用于基于所述修复读命令,确定所述当前修复区间对应的各目标子逻辑区间;针对每一个目标子逻辑区间,确定本地记录的所述目标Segment的映射表中是否存在该目标子逻辑区间对应的目标Block的标识,所述映射表用于记录所述目标Segment中已映射的子逻辑区间与Block的标识的映射关系;如果存在,从所述目标Block中读取数据,并将该目标子逻辑区间在写入位图中对应位的值设置为第一值;如果不存在,将该目标子逻辑区间在写入位图中对应位的值设置为第二值;向所述目标数据修复模块返回针对当前修复区间的读取结果,所述读取结果包括当前修复区间的写入位图;

所述目标数据修复模块,还用于如果所述写入位图中包括值为第一值的位,向所述第一磁盘对应的第一磁盘管理模块发送修复写命令,所述修复写命令包括读取到的数据以及所述写入位图;

所述第一磁盘管理模块,用于为所述写入位图中每一个值为第一值的位所标识的子逻辑区间分配对应的Block,并将数据写入新分配的Block中。

作为一个实施例,所述目标数据修复模块,还用于如果所述写入位图中不包括值为第一值的位,结束针对当前修复区间的操作。

作为一个实施例,所述第二磁盘管理模块,还用于如果从所述目标Block读取的数据为0,将该目标Block对应目标子逻辑区间在写入位图中对应位的值设置为第二值。

作为一个实施例,所述第一磁盘管理模块,还用于记录值为第一值的位所标识的子逻辑区间与为其分配的Block的映射关系。

作为一个实施例,所述写入位图包括的位的个数等于修复区间包括的目标子逻辑区间的个数。

由以上描述可以看出,本申请实施例中,分布式存储集群可基于更小粒度筛选需要修复的数据,因此,可有效减少修复数据量,提升数据修复效率。此外,在修复过程中,由于可根据子逻辑区间与Block的映射关系自动生成写入位图,而无需占用存储空间存储该写入位图,因此,可有效解决分布式存储集群的存储资源。

以上所述仅为本申请实施例的较佳实施例而已,并不用以限制本申请,凡在本申请实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本申请保护的范围之内。

相关技术
  • 数据修复方法及分布式存储集群
  • 用于分布式存储集群的数据修复方法及系统
技术分类

06120112168185