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

数据处理方法及分布式存储集群

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


数据处理方法及分布式存储集群

技术领域

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

背景技术

分布式存储集群通常由若干通用物理服务器组成。集群中的物理服务器亦称为集群节点,每一个集群节点包括至少一块用于存储数据的物理磁盘。

用户基于逻辑单元号(英文:Logical Unit Number,缩写:LUN)访问集群中各集群节点上的存储资源。这就涉及到逻辑资源到物理资源的映射,以实现将分散的、小粒度的存储资源分配给LUN。

分布式存储集群支持精简配置,即,只有在发生实际写入时,才为LUN分配真实的物理空间。在分配过程中,记录已分配的逻辑资源到物理资源的映射关系。该映射关系通常包括:LUN内逻辑地址范围到Segment(段,LUN内逻辑空间划分的基本单元)的映射关系,Segment到磁盘内Block(块,磁盘内物理空间划分的基本单元)的映射关系。这些映射关系被称为集群元数据,通常存储于集群中的元数据服务器。

随着集群规模的不断壮大,需要维护的元数据的数据量也在线性增大,给集群元数据服务器带来不小的压力。为了控制产生的元数据的体量,通常划分较大的Segment,相应地,存储该Segment对应数据的Block的容量也随之增大。即,采用较大的空间分配粒度分配存储资源,比如,设置Segment和Block的大小均为256MB。

在需要写入大量小块随机数据(比如,64KB)的情况下,这种较大粒度的分配方式,会导致存储空间浪费较大。

发明内容

有鉴于此,本申请提出一种数据处理方法及分布式存储集群,用以在减轻元数据服务器存储压力的前提下,更加有效地利用存储资源。

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

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

接收到针对目标LUN的写请求的第一集群节点确定所述写请求在所述目标LUN中对应的至少一个第一逻辑区间,将所述写请求拆分成针对每一个第一逻辑区间的子写请求;

针对每一个第一逻辑区间执行如下处理:

所述第一集群节点从已记录的逻辑区间与Segment的标识的映射关系中,查询是否存在与当前第一逻辑区间对应的第一Segment的标识;

如果存在,所述第一集群节点从已记录的Segment的标识与磁盘的标识的映射关系中,获取与所述第一Segment的标识对应的第一磁盘的标识;

如果不存在,所述第一集群节点向所述集群管理模块发送用于请求分配Segment的分配请求,所述分配请求包括所述目标LUN的标识以及当前第一逻辑区间的起始地址;

所述集群管理模块为所述当前第一逻辑区间分配第一Segment,指定用于存储该第一Segment对应数据的第一磁盘;并将所述目标LUN的所述当前第一逻辑区间与所述第一Segment的标识的映射关系,以及所述第一Segment的标识与所述第一磁盘的标识的映射关系存储至用于存储集群元数据的第二集群节点;

所述集群管理模块向所述第一集群节点返回分配响应,所述分配响应包括所述第一Segment的标识与所述第一磁盘的标识的映射关系;

所述第一集群节点向所述第一磁盘对应的第一磁盘管理模块发送针对所述第一Segment的子写请求,该子写请求包括所述第一Segment的标识、待写入数据在所述第一Segment中的起始地址、待写入数据大小;

所述第一磁盘管理模块根据待写入数据在所述第一Segment中的起始地址以及待写入数据大小,确定所述待写入数据在所述第一Segment中对应的至少一个第一子逻辑区间;

所述第一磁盘管理模块从已记录的子逻辑区间与Block的标识的映射关系中,查询是否存在与各第一子逻辑区间对应的Block的标识;

如果所述各第一子逻辑区间中存在没有找到对应Block标识的至少一个第二子逻辑区间,所述第一磁盘管理模块分别为各第二子逻辑区间分配用于存储第二子逻辑区间对应数据的Block;并在所述第一磁盘中存储所述第一Segment中各第二子逻辑区间与对应Block的标识的映射关系;

所述第一磁盘管理模块在确定各第一子逻辑区间对应的Block后,将各第一子逻辑区间对应数据分别写入各第一子逻辑区间对应的Block中。

可选的,所述集群管理模块指定用于存储当前第一逻辑区间对应数据的第一磁盘之前,所述方法还包括:

每一个磁盘管理模块在检测到对应磁盘发生容量变化,且容量变化量达到预设的第一容量变化阈值时,向所述集群管理模块上报其所管理磁盘的容量信息;

所述集群管理模块指定用于存储当前第一逻辑区间对应数据的第一磁盘,包括:

所述集群管理模块根据各磁盘的容量信息,从所述各磁盘中,选择剩余容量最大的磁盘作为第一磁盘。

可选的,所述方法还包括:

所述磁盘管理模块检测到磁盘的剩余容量小于预设的剩余容量阈值,且容量变化量达到预设的第二容量变化阈值时,向所述集群管理模块上报磁盘的容量信息,其中,所述第二容量变化阈值小于所述第一容量变化阈值。

可选的,所述第一磁盘管理模块分别为各第二子逻辑区间分配用于存储第二子逻辑区间对应数据的Block,包括:

获取用于记录第一磁盘中各Block分配情况的位图,其中,所述位图的每一位用于标识对应Block是否已分配;

分别为各第二子逻辑区间分配标识为未分配的位对应的Block。

可选的,所述位图中相邻的位对应物理空间中相邻的Block;所述分别为各第二子逻辑区间分配标识为未分配的位对应的Block,包括:

统计所述至少一个第二子逻辑区间的数量;

从所述位图中查找所述数量个连续的均标识为未分配的位;

将所述数量个连续的均标识为未分配的位对应的Block依次分配给各第二子逻辑区间。

可选的,所述方法还包括:

所述第一集群节点接收到针对所述目标LUN的读请求时,确定所述读请求在所述目标LUN中对应的至少一个第二逻辑区间,将所述读请求拆分成针对各第二逻辑区间的子读请求;

针对每一个第二逻辑区间执行如下处理:

所述第一集群节点从已记录的逻辑区间与Segment的标识的映射关系中,查询是否存在与当前第二逻辑区间对应的第二Segment的标识;

如果不存在,所述第一集群节点将当前第二逻辑区间对应数据填充为0;

如果存在,所述第一集群节点从已记录的Segment的标识与磁盘的标识的映射关系中,获取与所述第二Segment的标识对应的第二磁盘的标识;

所述第一集群节点向所述第二磁盘对应的第二磁盘管理模块发送针对所述第二Segment的子读请求,所述第二Segment的子读请求包括所述第二Segment的标识、待读取数据在所述第二Segment中的起始地址、待读取数据大小;

所述第二磁盘管理模块确定是否存在所述第二Segment相关的映射关系,所述第二Segment相关的映射关系用于记录所述第二Segment中已写入数据的子逻辑区间与对应Block的标识的关系;

如果不存在,所述第二磁盘管理模块将所述第二Segment对应数据填充为0;

如果存在,所述第二磁盘管理模块根据所述待读取数据在所述第二Segment中的起始地址以及待读取数据大小,确定所述待读取数据在所述第二Segment中对应的至少一个第三子逻辑区间;

针对每一个第三子逻辑区间,所述第二磁盘管理模块从已记录的子逻辑区间与对应Block的标识的映射关系中,查询是否存在与该第三子逻辑区间对应的Block的标识;

如果存在,所述第二磁盘管理模块从该第三子逻辑区间对应Block中,读取该第三子逻辑区间对应数据;

如果不存在,所述第二磁盘管理模块将该第三子逻辑区间对应数据填充为0;

所述第二磁盘管理模块将各第三子逻辑区间对应数据合并,返回给第一集群节点;

所述第一集群节点将基于各子读请求读取到的数据合并,作为所述读请求读取到的数据。

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

第一集群节点,用于接收针对目标LUN的写请求,并确定所述写请求在所述目标LUN中对应的至少一个第一逻辑区间,将所述写请求拆分成针对每一个第一逻辑区间的子写请求;针对每一个第一逻辑区间,从已记录的逻辑区间与Segment的标识的映射关系中,查询是否存在与当前第一逻辑区间对应的第一Segment的标识;如果存在,从已记录的Segment的标识与磁盘的标识的映射关系中,获取与所述第一Segment的标识对应的第一磁盘的标识;如果不存在,向集群管理模块发送用于请求分配Segment的分配请求,所述分配请求包括所述目标LUN的标识以及当前第一逻辑区间的起始地址;接收集群管理模块返回的分配响应,所述分配响应包括所述第一Segment的标识与所述第一磁盘的标识的映射关系;向所述第一磁盘对应的第一磁盘管理模块发送针对所述第一Segment的子写请求,该子写请求包括所述第一Segment的标识、待写入数据在所述第一Segment中的起始地址、待写入数据大小;

集群管理模块,用于在接收到所述分配请求时,为所述当前第一逻辑区间分配第一Segment,指定用于存储该第一Segment对应数据的第一磁盘;并将所述目标LUN的所述当前第一逻辑区间与所述第一Segment的标识的映射关系,以及所述第一Segment的标识与所述第一磁盘的标识的映射关系存储至用于存储集群元数据的第二集群节点;向所述第一集群节点返回分配响应,所述分配响应包括所述第一Segment的标识与所述第一磁盘的标识的映射关系;

第一磁盘管理模块,用于根据待写入数据在所述第一Segment中的起始地址以及待写入数据大小,确定所述待写入数据在所述第一Segment中对应的至少一个第一子逻辑区间;从已记录的子逻辑区间与Block的标识的映射关系中,查询是否存在与各第一子逻辑区间对应的Block的标识;如果所述各第一子逻辑区间中存在没有找到对应Block标识的至少一个第二子逻辑区间,分别为各第二子逻辑区间分配用于存储第二子逻辑区间对应数据的Block;并在所述第一磁盘中存储所述第一Segment中各第二子逻辑区间与对应Block的标识的映射关系;在确定各第一子逻辑区间对应的Block后,将各第一子逻辑区间对应数据分别写入各第一子逻辑区间对应的Block中。

可选的,磁盘管理模块,用于在检测到对应磁盘发生容量变化,且容量变化量达到预设的第一容量变化阈值时,向所述集群管理模块上报其所管理磁盘的容量信息;

所述集群管理模块,具体用于根据各磁盘的容量信息,从所述各磁盘中,选择剩余容量最大的磁盘作为第一磁盘。

可选的,所述磁盘管理模块,还用于在检测到磁盘的剩余容量小于预设的剩余容量阈值,且容量变化量达到预设的第二容量变化阈值时,向所述集群管理模块上报磁盘的容量信息,其中,所述第二容量变化阈值小于所述第一容量变化阈值。

可选的,所述第一磁盘管理模块,具体用于获取用于记录第一磁盘中各Block分配情况的位图,其中,所述位图的每一位用于标识对应Block是否已分配;分别为各第二子逻辑区间分配标识为未分配的位对应的Block。

可选的,所述位图中相邻的位对应物理空间中相邻的Block;

所述第一磁盘管理模块,具体用于统计所述至少一个第二子逻辑区间的数量;从所述位图中查找所述数量个连续的均标识为未分配的位;将所述数量个连续的均标识为未分配的位对应的Block依次分配给各第二子逻辑区间。

可选的,所述第一集群节点,还用于接收针对所述目标LUN的读请求,并确定所述读请求在所述目标LUN中对应的至少一个第二逻辑区间,将所述读请求拆分成针对各第二逻辑区间的子读请求;针对每一个第二逻辑区间,从已记录的逻辑区间与Segment的标识的映射关系中,查询是否存在与当前第二逻辑区间对应的第二Segment的标识;如果不存在,将当前第二逻辑区间对应数据填充为0;如果存在,从已记录的Segment的标识与磁盘的标识的映射关系中,获取与所述第二Segment的标识对应的第二磁盘的标识;向所述第二磁盘对应的第二磁盘管理模块发送针对所述第二Segment的子读请求,所述第二Segment的子读请求包括所述第二Segment的标识、待读取数据在所述第二Segment中的起始地址、待读取数据大小;接收并合并各第二磁盘管理模块返回的子读请求的数据,作为所述读请求读取到的数据。

所述第二磁盘管理模块,用于确定是否存在所述第二Segment相关的映射关系,所述第二Segment相关的映射关系用于记录所述第二Segment中已写入数据的子逻辑区间与对应Block的标识的关系;如果不存在,将所述第二Segment对应数据填充为0;如果存在,根据所述待读取数据在所述第二Segment中的起始地址以及待读取数据大小,确定所述待读取数据在所述第二Segment中对应的至少一个第三子逻辑区间;针对每一个第三子逻辑区间,从已记录的子逻辑区间与对应Block的标识的映射关系中,查询是否存在与该第三子逻辑区间对应的Block的标识;如果存在,从该第三子逻辑区间对应Block中,读取该第三子逻辑区间对应数据;如果不存在,将该第三子逻辑区间对应数据填充为0;将各第三子逻辑区间对应数据合并,返回给第一集群节点。

由以上描述可以看出,本申请中,将元数据分为两部分,一部分存储于集群元数据服务器,一部分存储于磁盘中,可有效减轻集群元数据服务器的存储压力,同时,通过更小粒度的Block分配方式,可减少存储资源浪费。

附图说明

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

图1是示例性示出的一种映射关系示意图;

图2是示例性示出的一种数据处理方法流程图;

图3是示例性示出的一个位图的示意图;

图4是示例性示出的一种映射关系示意图;

图5是示例性示出的一种数据读取流程图。

具体实施方式

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

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

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

分布式存储集群通常包括多台服务器(亦称为集群节点)。每一个集群节点包括至少一块用于存储数据的物理磁盘。

用户基于LUN(逻辑卷,可访问的逻辑空间)使用集群中各集群节点上的存储资源。在向集群写入数据的过程中,集群会产生大量用于记录逻辑资源到物理资源映射关系的元数据,这些元数据存储在集群的元数据服务器上。

参见图1,为示例性示出的一种映射关系示意图。该示意图以2个集群节点(Server1和Server2)为例,其中,Server1包括2块用于存储数据的物理磁盘,分别记为OSD1和OSD2;Server2包括2块用于存储数据的物理磁盘,分别记为OSD3和OSD4。

为了减轻元数据服务器的存储压力,通常设置较大的Segment以及Block。比如,预设Segment(缩写:Seg)大小和Block(缩写:Blk)大小均为256MB。LUN1可按照预设Segment大小(256MB)划分为多个逻辑区间;OSD可按照预设Block大小(256MB)划分为多块Block。

如图1所示,逻辑区间【0,256MB】被写入过数据块A,逻辑区间【1GB,1GB+256MB】被写入过数据块B,则集群元数据中记录已使用逻辑区间到Segment的映射关系。如图1所示,逻辑区间【0,256MB】映射到Seg1,逻辑区间【1GB,1GB+256MB】映射到Seg2,则具体映射关系可表述为:

LUN1→[0:Seg1;1GB:Seg2]

其中,“0”为逻辑区间【0,256MB】的起始地址;“1GB”为逻辑区间【1GB,1GB+256MB】的起始地址。即,通过逻辑区间的起始地址标识对应逻辑区间。通过上述映射关系可知,LUN1中已有2个逻辑区间被写入数据。

集群元数据中除了记录已使用逻辑区间到Segment的映射关系,还记录Segment到磁盘中Block的映射关系,从而确定数据在磁盘中的存储位置。如图1所示,Seg1映射到OSD1的Blk8;Seg2映射到OSD3的Blk3,则具体映射关系可表述为:

Seg1→[OSD1:Blk8]

Seg2→[OSD3:Blk3]

以上所有映射关系均需存储到元数据服务器中。

随着存储集群的不断扩大,需要存储的集群元数据的数据量也在线性增长。既使已增大Segment和Block的划分粒度,元数据服务器的存储压力仍然较大。此外,由于Block的划分粒度较大,在写入一些小块随机数据时,会造成存储资源的浪费。

针对上述问题,本申请提出一种数据处理方法。该方法在数据处理过程中,将需要存储的元数据分为两部分,一部分存储于元数据服务器,一部分存储于磁盘中,以减轻元数据服务器的存储压力,同时,通过减小Block的划分粒度,减少对存储资源的浪费。

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

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

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

每一块磁盘按照预设Block大小划分为多个Block。每一个集群节点针对本节点上的每一块磁盘部署对应的磁盘管理模块。该磁盘管理模块通常指磁盘的服务进程。

该分布式存储集群还配置有至少一个LUN。每一个LUN按照预设Segment大小划分为多个逻辑区间,每一个逻辑区间按照预设Block大小划分为多个子逻辑区间。可以看出,本申请中的Block大小小于Segment大小。

比如,预设Segment大小为256MB,预设Block大小为64KB,则可将LUN按照256MB大小划分为多个逻辑区间,再将每一个256MB大小的逻辑区间按照64KB大小划分为多个子逻辑区间。也就是说,每一个逻辑区间的大小为256MB,每一个子逻辑区间的大小为64KB。

此外,分布式存储集群还部署有集群管理模块。该集群管理模块可部署在任一集群节点上。优选地,将该集群管理模块部署在存储集群元数据的集群节点上。

如图2所示,该流程可包括以下步骤:

步骤201,接收到针对目标LUN的写请求的第一集群节点确定该写请求在目标LUN中对应的至少一个第一逻辑区间,将写请求拆分成针对每一个第一逻辑区间的子写请求。

在用户通过上层应用下发的写请求中包括待访问的LUN的标识。这里,将当前待访问的LUN称为目标LUN。

将接收到写请求的集群节点称为第一集群节点。可以理解的是,之所以称为第一集群节点,只是为便于区分而进行的命名,并非用于限定。

第一集群节点接收到的写请求中还包括待写入数据在目标LUN中的起始地址以及待写入数据的大小。第一集群节点可根据该待写入数据在目标LUN中的起始地址以及数据大小,确定该待写入数据在目标LUN中的逻辑地址范围。比如,待写入数据在目标LUN中的起始地址为300MB,数据大小为256KB,则该待写入数据在目标LUN中的逻辑地址范围为【300MB,300MB+256KB】。

第一集群节点根据待写入数据在目标LUN中的逻辑地址范围,确定写请求在目标LUN中对应的至少一个逻辑区间。这里,将写请求在目标LUN中对应的各逻辑区间均称为第一逻辑区间。可以理解的是,之所以称为第一逻辑区间,只是为便于区分而进行的命名,并非用于限定。

仍以Segment大小为256MB为例,按照该Segment大小可将目标LUN划分为【0,256MB】、【256MB,512MB】、【512MB,768MB】等若干逻辑区间。若待写入数据在目标LUN中的逻辑地址范围为【256MB-256KB,256MB+256KB】,则该逻辑地址范围在目标LUN中所涉及到的逻辑区间包括【0,256MB】和【256MB,512MB】,因此,确定【0,256MB】和【256MB,512MB】为写请求在目标LUN中对应的第一逻辑区间。

第一集群节点将针对目标LUN的写请求拆分成针对各第一逻辑区间的子写请求。比如,拆分成针对逻辑区间【0,256MB】的子写请求和针对逻辑区间【256MB,512MB】的子写请求。

针对每一个拆分后的子写请求执行后续处理。

步骤202,第一集群节点从已记录的逻辑区间与Segment的标识的映射关系中,查询是否存在与当前第一逻辑区间对应的第一Segment的标识。

如前所述,每一个子写请求对应一个第一逻辑区间。本步骤针对当前处理的子写请求对应的第一逻辑区间,查询是否存在与该第一逻辑区间对应的Segment的标识。这里,将与第一逻辑区间对应的Segment称为第一Segment。可以理解的是,之所以称为第一Segment,只是为了便于描述而进行的命名,并非用于限定。

需要说明的是,对于已写入过数据的逻辑区间,集群节点会记录该逻辑区间与已为该逻辑区间分配的Segment的标识的映射关系。本申请通过为逻辑区间分配Segment,或者说,将逻辑区间映射到Segment,来标识LUN中已使用的逻辑区间。后续针对该Segment的操作即为针对该Segment对应逻辑区间的操作。

参见如下已记录映射关系示例:

LUN1→[0:Seg1;1GB:Seg2]

其中,“0:Seg1”表示LUN1中起始地址为0的逻辑区间已映射到Seg1;“1GB:Seg2”表示LUN1中起始地址为1GB的逻辑区间已映射到Seg2。

因此,通过查询已记录的逻辑区间与Segment的标识的映射关系,可知是否存在与当前第一逻辑区间对应的第一Segment的标识。

如果存在,说明当前第一逻辑区间已映射到Segment,转步骤203;如果不存在,说明当前第一逻辑区间未被使用过,还不存在映射的Segment,转步骤204。

步骤203,第一集群节点从已记录的Segment的标识与磁盘的标识的映射关系中,获取与第一Segment的标识对应的第一磁盘的标识。

对于已映射到Segment的逻辑区间,第一集群节点会记录该逻辑区间对应的Segment的标识与为该Segment分配的磁盘的标识的映射关系。参见如下已记录映射关系示例:

Seg1→[OSD1]

Seg2→[OSD3]

该示例表示Seg1对应数据存储在OSD1中;Seg2对应数据存储在OSD3中。

因此,通过查询已记录的Segment的标识与磁盘的标识的映射关系,可知是否存在与第一Segment的标识对应的第一磁盘的标识。这里,将为第一Segment分配的磁盘称为第一磁盘。可以理解的是,之所以称为第一磁盘,只是为便于区分而进行的命名,并非用于限定。

即,通过本步骤可确定第一Segment对应数据应写入的磁盘,转步骤207。

步骤204,第一集群节点向集群管理模块发送用于请求分配Segment的分配请求。

当通过步骤202确定当前第一逻辑区间还未映射到Segment时,即,第一逻辑区间未被使用过时,第一集群节点向集群管理模块请求分配Segment。该分配请求包括目标LUN的标识以及当前第一逻辑区间的起始地址。

步骤205,集群管理模块为当前第一逻辑区间分配第一Segment,指定用于存储该第一Segment对应数据的第一磁盘,并将目标LUN的当前第一逻辑区间与第一Segment的标识的映射关系,以及第一Segment的标识与第一磁盘的标识的映射关系存储至用于存储集群元数据的第二集群节点。

这里,需要说明的是,集群管理模块通常基于负载均衡原则,为新分配的Segment选择存储该Segment对应数据的磁盘。为此,集群管理模块需要知道每一个磁盘的负载情况,即,磁盘使用情况。

在一些实施例中,可由各磁盘对应的磁盘管理模块主动上报磁盘容量信息。具体为,磁盘管理模块在检测到磁盘发生容量变化,且容量变化量达到预设的第一容量变化阈值时,向集群管理模块上报其所管理磁盘的容量信息。这里,第一容量变化阈值只是为了便于区分而进行的命名,并非用于限定。

该第一容量变化阈值的大小可根据集群总容量动态调整。一般来说,集群总容量越大,对容量的细微变化越不敏感,可设置较大的第一容量变化阈值。比如,设置第一容量变化阈值为5GB,则磁盘管理模块在磁盘已使用容量每增加或减少5GB时,向集群管理模块发送磁盘容量信息。

在一些实施例中,当磁盘管理模块检测到磁盘的剩余容量小于预设的剩余容量阈值(比如,500MB)时,说明磁盘的可用空间(剩余空间)不多,此时,可启用预设的第二容量变化阈值,该第二容量变化阈值小于第一容量变化阈值,比如,预设第二容量变化阈值为10MB。可以理解的是,之所以称为第二容量变化阈值,只是为了便于区分而进行的命名,并非用于限定。

当剩余容量小于预设的剩余容量阈值,且容量变化量达到第二容量变化阈值时,向集群管理模块上报磁盘的容量信息。即,在剩余容量较少时,通过缩小磁盘容量感知粒度,使集群管理模块及时掌握磁盘容量变化情况,以启动相应容量告警等处理机制。

这里,还需要说明的是,磁盘管理模块上报的磁盘容量信息包括但不限于已用磁盘容量、剩余磁盘容量等。

集群管理模块可根据各磁盘管理模块上报的磁盘容量信息,确定各磁盘的剩余容量,进而选择剩余容量最大的磁盘作为存储当前第一Segment对应数据的第一磁盘。

集群管理模块在为当前第一逻辑区间分配第一Segment,并指定存储该第一Segment对应数据的第一磁盘后,将目标LUN的当前第一逻辑区间与第一Segment的标识的映射关系,以及第一Segment的标识与第一磁盘的标识的映射关系存储至用于存储集群元数据的第二集群节点。这里,第二集群节点只是为便于区分而进行的命名,并非用于限定。

比如,目标LUN为LUN1,当前第一逻辑区间为【256MB,512MB】,集群管理模块为该第一逻辑区间分配的Segment为Seg3,并指定存储该Seg3对应数据的磁盘为OSD2,则集群管理模块可建立【256MB,512MB】与Seg3的映射关系,以及Seg3与OSD2的映射关系,并将上述映射关系存储至第二集群节点上。

此时,第二集群节点上可存在如下映射关系:

LUN1→[0:Seg1;1GB:Seg2;256MB:Seg3]

Seg1→[OSD1]

Seg2→[OSD3]

Seg3→[OSD2]

可以看出,本申请实施例中,集群管理模块不再指定Segment在OSD中的具体存储位置(Block),因此,可有效减少存储在元数据服务器(第二集群节点)上的元数据的体量,减轻元数据服务器的存储压力。

步骤206,集群管理模块向第一集群节点返回分配响应,该分配响应包括第一Segment的标识与第一磁盘的标识的映射关系。

第一集群节点可在本地内存中记录目标LUN的第一逻辑区间与第一Segment的标识的映射关系,以及第一Segment的标识与第一磁盘的标识的映射关系,以便在处理后续写请求或读请求时提升处理效率。

步骤207,第一集群节点向第一磁盘对应的第一磁盘管理模块发送针对当前第一Segment的子写请求。

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

这里,第一Segment的子写请求包括但不限于第一Segment的标识、待写入数据在第一Segment中的起始地址、待写入数据大小。

步骤208,第一磁盘管理模块根据待写入数据在第一Segment中的起始地址以及待写入数据大小,确定待写入数据在第一Segment中对应的至少一个第一子逻辑区间。

如前所述,LUN按照Segment大小划分为若干逻辑区间,每一个逻辑区间又按照Block大小划分为若干子逻辑区间,则在完成逻辑区间到Segment的映射后,逻辑区间的子逻辑区间就相当于Segment的子逻辑区间。

本申请实施例中,第一磁盘管理模块可根据待写入数据在第一Segment中的起始地址以及待写入数据大小,确定待写入数据在第一Segment中对应的逻辑地址范围,进而根据该逻辑地址范围确定所涉及到的至少一个子逻辑区间。这里,将待写入数据在第一Segment中对应的各子逻辑区间均称为第一子逻辑区间。可以理解的是,之所以称为第一子逻辑区间,只是为便于区分而进行的命名,并非用于限定。

仍以第一Segment为Seg3为例,映射到Seg3的逻辑区间为【256MB,512MB】,该逻辑区间按照预设Block大小(比如,64KB)划分为多个子逻辑区间。待写入数据在Seg3中的起始地址为0,待写入数据大小为256KB。用于存储Seg3对应数据的磁盘为OSD2。则OSD2对应磁盘管理模块根据待写入数据在Seg3中的起始地址以及待写入数据大小,可确定该待写入数据在Seg3中对应的逻辑地址范围为【0,256KB】,该逻辑地址范围涉及到Seg3中4个子逻辑区间,分别为【0,64KB】、【64KB,128KB】、【128KB,192KB】、【192KB,256KB】。其中,Seg3的第0位置对应LUN1的第256MB位置;Seg3的第64KB位置对应LUN1的第256MB+64KB位置;以此类推。

步骤209,第一磁盘管理模块从已记录的子逻辑区间与Block的标识的映射关系中,查询是否存在与各第一子逻辑区间对应的Block的标识。

本申请实施例中,由磁盘管理模块负责分配具体的物理资源(Block),并建立子逻辑区间与Block的标识的映射关系。因此,当第一磁盘管理模块通过步骤208确定待写入数据对应的至少一个第一子逻辑区间时,可通过查询已建立(已记录)的子逻辑区间与Block的标识的映射关系,确定是否存在与各第一子逻辑区间对应的Block的标识。

若存在与当前第一子逻辑区间对应的Block的标识,说明已完成对该第一子逻辑区间的Block分配;若不存在与该第一子逻辑区间对应的Block的标识,说明还未对该第一子逻辑区间分配Block。

步骤210,如果通过查询确定第一子逻辑区间中存在没有找到对应Block标识的至少一个第二子逻辑区间,第一磁盘管理模块分别为各第二子逻辑区间分配用于存储第二子逻辑区间对应数据的Block,并在第一磁盘中存储第一Segment中各第二子逻辑区间与对应Block的标识的映射关系。

这里,将未查找到对应Block标识的第一子逻辑区间称为第二子逻辑区间。可以理解的是,之所以称为第二子逻辑区间,只是为了便于区分而进行的命名,并非用于限定。第一磁盘管理模块需要为各第二子逻辑区间分配Block。

在一些实施例中,第一磁盘管理模块可获取用于记录第一磁盘中各Block分配情况的位图。位图的位数由磁盘中Block的数量决定,即,每一位对应一个Block。每一位的值用于表示对应Block的分配情况,比如,“0”表示对应Block未被分配;“1”表示对应Block已被分配。参见图3,为示例性示出的一个位图的示意图。该位图中每一位的值均为0,表示该磁盘中的各Block均未被分配。

这里,需要说明的是,位图中相邻的位对应物理空间中相邻的Block。当第一磁盘管理模块通过步骤209确定存在多个未分配Block的第二子逻辑区间时,可根据第二子逻辑区间的数量,从位图中选择该数量个连续的标识为未分配的位,将该数量个连续的标识为未分配的位对应的Block依次分配给各第二子逻辑区间。通过选择物理空间上连续的多个Block,对于传统机械硬盘,可减少磁盘寻道时间,大大提升磁盘的读写性能。

第一磁盘管理模块在确定各第二子逻辑区间对应的Block后,建立各第二子逻辑区间与对应Block的标识的映射关系,并将各第二子逻辑区间与对应Block的标识的映射关系存储至第一磁盘中。

仍以Seg3为例,待写入数据在Seg3中对应的子逻辑区间分别为【0,64KB】、【64KB,128KB】、【128KB,192KB】、【192KB,256KB】。Seg3对应数据被指定存储在OSD2中。当前OSD2对应位图如图3所示。

从图3中可以看出,当前OSD2中所有Block均未被分配,也就是说,当前不存在任何Seg3中子逻辑区间与OSD2中Block的映射关系。OSD2对应磁盘管理模块需要为当前待写入数据的4个子逻辑区间【0,64KB】、【64KB,128KB】、【128KB,192KB】以及【192KB,256KB】分配对应的Block。

首先,磁盘管理模块从图3所示位图中,选择4个连续标识为“0”的位,比如,选择bit0~bit3。该bit0~bit3对应物理地址连续的4块Block,记为Blk0~Blk3。磁盘管理模块将Blk0~Blk3依次分配给Seg3的子逻辑区间【0,64KB】、【64KB,128KB】、【128KB,192KB】以及【192KB,256KB】,即,分别建立【0,64KB】与Blk0、【64KB,128KB】与Blk1、【128KB,192KB】与Blk2以及【192KB,256KB】与Blk3的映射关系。上述映射关系可表达为:

Seg3→[0:Blk0;64KB:Blk1;128KB:Blk2;192KB:Blk3]

即,当前已为Seg3分配4块Block,共计256KB物理空间。该分配的物理空间远远小于一个Segment的大小(256MB)。

参见图4,为本申请实施例示出的映射关系示意图。通过该示意图可以更加清晰地看出,在缩小Block的分配粒度(图中Block分配粒度为64KB)后,可有效节约物理资源。

最后,磁盘管理模块将Seg3中已建立的子逻辑区间与Block的映射关系存储至OSD2中。通过在磁盘中存储这部分元数据,可减轻元数据服务器的存储压力。同时,由于各磁盘仅保存与自身相关的元数据,具有布局分散、作用域独立的突出优点,因此,一个磁盘故障,不会对其它磁盘造成影响,且不会影响集群元数据服务器中已存储的元数据。

此外,本申请由磁盘管理模块分配Block,可有效提升数据控制的灵活性,比如,为磁盘内已有数据增加校验、移动数据在磁盘中的位置(从一个Block移动至另一个Block)等。

步骤211,第一磁盘管理模块在确定各第一子逻辑区间对应的Block后,将各第一子逻辑区间对应数据分别写入各第一子逻辑区间对应的Block中。

即,在完成对子写请求所涉及各子逻辑区间的映射后,将子写请求中的数据拆分写入各子逻辑区间对应的Block中。

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

通过图2所示流程可以看出,本申请实施例在数据写入过程中,将产生的元数据分两部分存储,一部分存储于集群元数据服务器,一部分存储于磁盘中,可有效减轻集群元数据服务器的存储压力,同时,通过采用更小粒度的Block分配方式,可有效降低存储资源的浪费。

下面对数据读取过程进行描述。参见图5,为本申请实施例示出的一种数据读取流程。如图5所示,该流程包括以下步骤:

步骤501,第一集群节点接收到针对目标LUN的读请求时,确定读请求在目标LUN中对应的至少一个第二逻辑区间,将读请求拆分成针对各第二逻辑区间的子读请求。

读请求包括目标LUN的标识、待读取数据在目标LUN中的起始地址以及待读取数据的大小。第一集群节点可根据该待读取数据在目标LUN中的起始地址以及数据大小,确定该待读取数据在目标LUN中的逻辑地址范围。

第一集群节点根据待读取数据在目标LUN中的逻辑地址范围,确定读请求在目标LUN中对应的至少一个逻辑区间。比如,目标LUN划分为【0,256MB】、【256MB,512MB】、【512MB,768MB】等若干逻辑区间,待读取数据在目标LUN中的逻辑地址范围为【256MB-256KB,256MB+256KB】,则基于该逻辑地址范围确定读请求在目标LUN中对应的逻辑区间包括【0,256MB】和【256MB,512MB】。

这里,将读请求在目标LUN中对应的各逻辑区间均称为第二逻辑区间。可以理解的是,之所以称为第二逻辑区间,只是为便于区分而进行的命名,并非用于限定。

第一集群节点将针对目标LUN的读请求拆分成针对各第二逻辑区间的子读请求。针对每一个拆分后的子读请求执行后续处理。

步骤502,第一集群节点从已记录的逻辑区间与Segment的标识的映射关系中,查询是否存在与当前第二逻辑区间对应的第二Segment的标识。

如前所述,每一个子读请求对应一个第二逻辑区间。本步骤针对当前处理的子读请求对应的第二逻辑区间,查询是否存在与该第二逻辑区间对应的Segment的标识。这里,将与第二逻辑区间对应的Segment称为第二Segment。可以理解的是,之所以称为第二Segment,只是为了便于描述而进行的命名,并非用于限定。

如果不存在,说明当前第二逻辑区间没有写入过数据,转步骤503;如果存在,说明当前第二逻辑区间写入过数据,转步骤504。

步骤503,第一集群节点将当前第二逻辑区间对应数据填充为0,转步骤513。

步骤504,第一集群节点从已记录的Segment的标识与磁盘的标识的映射关系中,获取与第二Segment的标识对应的第二磁盘的标识。

即,查找用于存储第二Segment(第二逻辑区间)对应数据的磁盘。这里,将存储第二Segment对应数据的磁盘称为第二磁盘。可以理解的是,之所以称为第二磁盘,只是为便于区分而进行的命名,并非用于限定。

步骤505,第一集群节点向第二磁盘对应的第二磁盘管理模块发送针对第二Segment的子读请求。

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

这里,第二Segment的子读请求包括但不限于第二Segment的标识、待读取数据在第二Segment中的起始地址、待读取数据大小。

步骤506,第二磁盘管理模块确定是否存在第二Segment相关的映射关系,该第二Segment相关的映射关系用于记录第二Segment中已写入数据的子逻辑区间与对应Block的标识的关系。

如果不存在,说明未针对该第二Segment内子逻辑区间分配过Block,第二磁盘内不存在第二Segment对应数据,转步骤507;如果存在,说明该第二Segment内写入过数据,转步骤508。

步骤507,第二磁盘管理模块将第二Segment对应数据填充为0,转步骤513。

步骤508,第二磁盘管理模块根据待读取数据在第二Segment中的起始地址以及待读取数据大小,确定待读取数据在第二Segment中对应的至少一个第三子逻辑区间。

这里,将待读取数据在第二Segment中对应的各子逻辑区间均称为第三子逻辑区间。可以理解的是,之所以称为第三子逻辑区间,只是为便于区分而进行的命名,并非用于限定。

仍以Seg3为例,Seg3对应逻辑区间【256MB,512MB】按照预设Block大小(比如,64KB)划分为多个子逻辑区间【0,64KB】、【64KB,128KB】、【128KB,192KB】、【192KB,256KB】、……、【512MB-64KB,512MB】。待读取数据在Seg3中的起始地址为0,待读取数据大小为256KB,则该待读取数据在Seg3中中对应的子逻辑区间包括【0,64KB】、【64KB,128KB】、【128KB,192KB】、【192KB,256KB】。

步骤509,针对每一个第三子逻辑区间,第二磁盘管理模块从已记录的子逻辑区间与对应Block的标识的映射关系中,查询是否存在与该第三子逻辑区间对应的Block的标识。

如果存在,说明已为该第三子逻辑区间分配过Block,Block中存在该第三子逻辑区间对应数据,转步骤510;如果不存在,说明未为该第三子逻辑区间分配过Block,第二磁盘中没有该第三子逻辑区间对应数据,转步骤511。

步骤510,第二磁盘管理模块从该第三子逻辑区间对应Block中,读取该第三子逻辑区间对应数据,转步骤512。

步骤511,第二磁盘管理模块将该第三子逻辑区间对应数据填充为0。

步骤512,第二磁盘管理模块将各第三子逻辑区间对应数据合并,返回给第一集群节点。

即,将处理的子读取请求的读取结果返回给第一集群节点。

步骤513,第一集群节点将基于各子读请求读取到的数据合并,作为读请求读取到的数据。

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

通过图5所示流程可以看出,本申请实施例可基于集群层面的映射关系(Segment到磁盘的映射关系)以及磁盘层面的映射关系(Segment到Block的映射关系),实现数据读取。

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

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

第一集群节点,用于接收针对目标LUN的写请求,并确定所述写请求在所述目标LUN中对应的至少一个第一逻辑区间,将所述写请求拆分成针对每一个第一逻辑区间的子写请求;针对每一个第一逻辑区间,从已记录的逻辑区间与Segment的标识的映射关系中,查询是否存在与当前第一逻辑区间对应的第一Segment的标识;如果存在,从已记录的Segment的标识与磁盘的标识的映射关系中,获取与所述第一Segment的标识对应的第一磁盘的标识;如果不存在,向集群管理模块发送用于请求分配Segment的分配请求,所述分配请求包括所述目标LUN的标识以及当前第一逻辑区间的起始地址;接收集群管理模块返回的分配响应,所述分配响应包括所述第一Segment的标识与所述第一磁盘的标识的映射关系;向所述第一磁盘对应的第一磁盘管理模块发送针对所述第一Segment的子写请求,该子写请求包括所述第一Segment的标识、待写入数据在所述第一Segment中的起始地址、待写入数据大小;

集群管理模块,用于在接收到所述分配请求时,为所述当前第一逻辑区间分配第一Segment,指定用于存储该第一Segment对应数据的第一磁盘;并将所述目标LUN的所述当前第一逻辑区间与所述第一Segment的标识的映射关系,以及所述第一Segment的标识与所述第一磁盘的标识的映射关系存储至用于存储集群元数据的第二集群节点;向所述第一集群节点返回分配响应,所述分配响应包括所述第一Segment的标识与所述第一磁盘的标识的映射关系;

第一磁盘管理模块,用于根据待写入数据在所述第一Segment中的起始地址以及待写入数据大小,确定所述待写入数据在所述第一Segment中对应的至少一个第一子逻辑区间;从已记录的子逻辑区间与Block的标识的映射关系中,查询是否存在与各第一子逻辑区间对应的Block的标识;如果所述各第一子逻辑区间中存在没有找到对应Block标识的至少一个第二子逻辑区间,分别为各第二子逻辑区间分配用于存储第二子逻辑区间对应数据的Block;并在所述第一磁盘中存储所述第一Segment中各第二子逻辑区间与对应Block的标识的映射关系;在确定各第一子逻辑区间对应的Block后,将各第一子逻辑区间对应数据分别写入各第一子逻辑区间对应的Block中。

作为一个实施例,磁盘管理模块,用于在检测到对应磁盘发生容量变化,且容量变化量达到预设的第一容量变化阈值时,向所述集群管理模块上报其所管理磁盘的容量信息;

所述集群管理模块,具体用于根据各磁盘的容量信息,从所述各磁盘中,选择剩余容量最大的磁盘作为第一磁盘。

作为一个实施例,所述磁盘管理模块,还用于在检测到磁盘的剩余容量小于预设的剩余容量阈值,且容量变化量达到预设的第二容量变化阈值时,向所述集群管理模块上报磁盘的容量信息,其中,所述第二容量变化阈值小于所述第一容量变化阈值。

作为一个实施例,所述第一磁盘管理模块,具体用于获取用于记录第一磁盘中各Block分配情况的位图,其中,所述位图的每一位用于标识对应Block是否已分配;分别为各第二子逻辑区间分配标识为未分配的位对应的Block。

作为一个实施例,所述位图中相邻的位对应物理空间中相邻的Block;

所述第一磁盘管理模块,具体用于统计所述至少一个第二子逻辑区间的数量;从所述位图中查找所述数量个连续的均标识为未分配的位;将所述数量个连续的均标识为未分配的位对应的Block依次分配给各第二子逻辑区间。

作为一个实施例,所述第一集群节点,还用于接收针对所述目标LUN的读请求,并确定所述读请求在所述目标LUN中对应的至少一个第二逻辑区间,将所述读请求拆分成针对各第二逻辑区间的子读请求;针对每一个第二逻辑区间,从已记录的逻辑区间与Segment的标识的映射关系中,查询是否存在与当前第二逻辑区间对应的第二Segment的标识;如果不存在,将当前第二逻辑区间对应数据填充为0;如果存在,从已记录的Segment的标识与磁盘的标识的映射关系中,获取与所述第二Segment的标识对应的第二磁盘的标识;向所述第二磁盘对应的第二磁盘管理模块发送针对所述第二Segment的子读请求,所述第二Segment的子读请求包括所述第二Segment的标识、待读取数据在所述第二Segment中的起始地址、待读取数据大小;接收并合并各第二磁盘管理模块返回的子读请求的数据,作为所述读请求读取到的数据。

所述第二磁盘管理模块,用于确定是否存在所述第二Segment相关的映射关系,所述第二Segment相关的映射关系用于记录所述第二Segment中已写入数据的子逻辑区间与对应Block的标识的关系;如果不存在,将所述第二Segment对应数据填充为0;如果存在,根据所述待读取数据在所述第二Segment中的起始地址以及待读取数据大小,确定所述待读取数据在所述第二Segment中对应的至少一个第三子逻辑区间;针对每一个第三子逻辑区间,从已记录的子逻辑区间与对应Block的标识的映射关系中,查询是否存在与该第三子逻辑区间对应的Block的标识;如果存在,从该第三子逻辑区间对应Block中,读取该第三子逻辑区间对应数据;如果不存在,将该第三子逻辑区间对应数据填充为0;将各第三子逻辑区间对应数据合并,返回给第一集群节点。

由以上描述可以看出,本申请在写入数据的过程中,将元数据分为两部分,一部分存储于集群元数据服务器,一部分存储于磁盘中,可有效减轻集群元数据服务器的存储压力,同时,通过更小粒度的Block分配方式,可减少存储资源浪费。

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

相关技术
  • 数据处理方法及分布式存储集群
  • 应用于分布式存储集群的数据存储方法及分布式存储集群
技术分类

06120112167953