一种元数据缓存管理方法和装置与流程

文档序号:18667904发布日期:2019-09-13 20:26阅读:280来源:国知局
一种元数据缓存管理方法和装置与流程

本发明涉及分布式存储技术领域,具体涉及一种元数据缓存管理方法和装置。



背景技术:

cephfs(cephfilesystem,分布式文件系统)包括元数据服务器(metadataserver,mds)、和对象存储设备(object-basedstoragedevice,osd),其中,元数据服务器用于管理元数据(如缓存元数据),对象存储设备用于将数据和元数据作为对象存储,也就是说,分布式文件系统采用数据和元数据分离的管理方式。

用户可以通过客户端实现对文件的访问,首先通过文件的路径和文件名查找出文件的元数据,然后通过元数据对文件进行读写操作。所以,要对文件操作首先要查找到对应的元数据,故元数据访问的性能直接影响文件系统的读写性能。

在对现有技术的研究和实践过程中,本发明的发明人发现,现有技术中,cephfs的元数据缓存管理多是基于时间局部性原理,采用通用的单lru(leastrecentlyused,最近最少使用)机制管理元数据缓存,这种管理机制存在缓存命中率低的缺陷,导致cephfs的读写效率差。



技术实现要素:

本发明实施例提供一种元数据缓存管理方法和装置,旨在提高元数据的缓存命中率,进而提高分布式文件系统的读写效率。

本发明实施例提供一种元数据缓存管理方法,包括:

接收元数据访问请求,所述元数据访问请求携带有元数据标识;

根据所述元数据访问请求,从多个元数据缓存队列获取所述元数据标识对应的目标元数据,其中,所述多个元数据缓存队列具有不同的优先级;

确定所述目标元数据对应的数据类型;

基于所述数据类型、以及所述多个元数据缓存队列的优先级,从所述多个元数据缓存队列中确定目标元数据缓存队列,并将所述目标元数据存入所述目标元数据缓存队列的队头。

本发明实施例还提供一种元数据缓存管理装置,包括:

请求处理单元,用于接收元数据访问请求,所述元数据访问请求携带有元数据标识;

元数据查找单元,用于根据所述元数据访问请求,从多个元数据缓存队列获取所述元数据标识对应的目标元数据,其中,所述多个元数据缓存队列具有不同的优先级;

类型识别单元,用于确定所述目标元数据对应的数据类型;

队列管理单元,用于基于所述数据类型、以及所述多个元数据缓存队列的优先级,从所述多个元数据缓存队列中确定目标元数据缓存队列,并将所述目标元数据存入所述目标元数据缓存队列的队头。

本发明实施例还提供一种存储介质,所述存储介质存储有多条指令,所述指令适于处理器进行加载,以执行本发明实施例所提供的任一元数据缓存管理方法。

本发明实施例还提供一种元数据服务器,所述元数据服务器包括存储器、处理器及存储在所述存储器上,并可在所述处理器上运行的元数据缓存管理程序,所述元数据缓存管理程序被所述处理器执行时实现本发明实施例所提供的任一元数据缓存管理方法。

本发明实施例提供的元数据缓存管理方案,当接收到元数据访问请求时,获取元数据访问请求中携带的元数据标识,根据元数据访问请求,从多个元数据缓存队列获取元数据标识对应的目标元数据,其中,多个元数据缓存队列具有不同的优先级;确定该目标元数据的数据类型,根据数据类型和各元数据缓存队列的优先级从多个元数据缓存队列中确定出目标元数据缓存队列,并将目标元数据存入目标元数据缓存队列的队头,本发明根据对元数据的访问情况,动态调整元数据在元数据缓存队列中的位置,使得在缓存淘汰时,先淘汰优先级低的元数据缓存队列,尽可能地保留访问频繁的元数据,减少从对象存储设备中取回元数据的情况,相对于使用单一lru队列对多种类型的元数据进行管理的方案而言,本方案进行元数据访问时,访问频繁的元数据具有更高的缓存命中率,进而提高了对元数据访问请求的响应速度,使得分布式文件系统具有较高的读写效率。

附图说明

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

图1a是本发明实施例提供的元数据缓存管理方法中cephfs的架构示意图;

图1b是本发明实施例提供的元数据缓存管理方法的元数据请求流程示意图;

图1c是本发明实施例提供的元数据缓存管理方法的第一流程示意图;

图1d是本发明实施例提供的元数据缓存管理方法中一个目录中的元数据关系图;

图1e是本发明实施例提供的元数据缓存队列的第一种示意图;

图1f是本发明实施例提供的元数据缓存队列的第二种示意图;

图1g是本发明实施例提供的元数据缓存队列的第三种示意图;

图1h是本发明实施例提供的元数据缓存队列的第四种示意图;

图2a是本发明实施例提供的元数据缓存管理方法的第二流程示意图;

图2b是本发明实施例提供的元数据缓存队列的第五种示意图;

图2c是本发明实施例提供的元数据缓存管理方法中的元数据老化示意图;

图2d是本发明实施例提供的元数据缓存管理方法中脏元数据倒盘示意图;

图3是本发明实施例提供的元数据缓存管理装置的结构示意图;

图4是本发明实施例提供的元数据服务器的结构示意图。

具体实施方式

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

在本文中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本发明的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域技术人员显式地和隐式地理解的是,本文所描述的实施例可以与其它实施例相结合。

本发明实施例提供一种元数据缓存管理方法,该元数据缓存管理方法的执行主体可以是本发明实施例提供的元数据缓存管理装置,或者集成了该元数据缓存管理装置的元数据服务器,其中该元数据缓存管理装置可以采用硬件或者软件的方式实现。其中,元数据服务器可以是元数据服务器集群中的任一台元数据服务器。

本发明实施例提出的方法,可以应用于分布式文件系统,如cephfs。请参阅图1a,图1a是本发明实施例提供的元数据缓存管理方法中cephfs的架构示意图。cephfs包括集群监视器、元数据服务器集群和对象存储设备集群。对元数据和数据进行分离管理,其中元数据操作由元数据服务器集群管理,数据操作由对象存储设备集群管理,客户端可直接通过对象存储设备执行文件的读写操作。

请参阅图1b,图1b是本发明实施例提供的元数据缓存管理方法的元数据请求流程示意图。当客户端需要访问对象存储设备中的文件对象时,需要先从元数据服务器中获取该文件对象对应的元数据。例如,客户端向元数据服务器集群中的一元数据服务器发起元数据访问请求。每台元数据服务器中有服务处理模块(server)、元数据缓存模块(mdcache),日志模块(mdlog)以及用于与对象存储设备的交互模块(osdc)。客户端生成元数据请求后,封装成网络消息发送至元数据服务器,元数据服务器使用服务处理模块接收并处理该请求,然后在元数据的缓存模块中查找请求的目标元数据,如果获取到,则将获取到的元数据发送给客户端,以供客户端根据接收到的元数据访问对应的实体对象。如果在元数据服务器集群中没有获取到该元数据,则需要从对象设备中取出该元数据,并缓存到元数据服务器的元数据缓存模块中。此外,如果元数据发生了修改操作,则要生成相关的日志存储在日志模块,并根据日志将修改后的元数据更新写回到对象存储设备,才能对以后的元数据访问生效。基于这样的元数据请求流程,接下来对本发明实施例提供的元数据缓存管理方法进行说明。

请参阅图1c,图1c是本发明实施例提供的元数据缓存管理方法的第一流程示意图。该元数据缓存管理方法的具体流程可以如下:

101、接收元数据访问请求,元数据访问请求携带有元数据标识。

cephfs的整个目录树被动态地分割成几个目录子树,由对应的元数据服务器进行管理。被分配到划分后的目录子树的元数据服务器称之为属主元数服务器,该属主元数据服务器中存储有为其分配的目录子树中各目录项的元数据。此外,对于元数据服务器集群来说,访问量可能很大,当一些元数据服务器的负载较重时,为了解决这种元数据服务器访问负载不均衡的情况,会在相对于属主元数据服务器的其他元数据服务器上生成副本元数据,通过这些副本元数据来执行一些读操作,减轻属主元数据服务器的负载。

对于某元数据来说,缓存在为其分配的属主元数据服务器上的称为属主元数据,复制到其他服务器上用以分担读操作的称为副本元数据。对于某元数据服务器来说,可能存储有为其分配的目录子树对应的属主元数据和其他元数据服务器拷贝过来的副本元数据,也就是说,一台元数据服务器上存储的属主元数据和副本元数据是对应于不同实体对象的。

从上述元数据的缓存方式可以看出,属主元数据和副本元数据具有不同的操作特性,对于写元数据和修改元数据的操作,只能在属主元数据服务器上执行,也就是说,只能对属主元数据执行写和修改的操作。而副本元数据只能执行读操作。基于这种操作特性的不同,从整体来说,属主元数据相比于副本元数据具有更高的热度。在副本元数据和属主元数据访问频率相同的情况下,可以优先删除副本元数据。例如,当一台元数据服务器由于宕机进行重启时,需要重构目录树,此时,为了减少重构目录树的时间,一般可以将副本元数据清空。

请参阅图1d,图1d是本发明实施例提供的元数据缓存管理方法中一个目录中的元数据关系图。其中,一个目录(dir)中可以包含有一个或者多个目录项(dentry),目录项可以是该目录的子目录,也可以是该目录中的文件。无论是文件还是子目录,都有与之对应的元数据(inode),元数据中包含有对应实体对象的创建时间、文件大小、最后修改时间、存储位置、所属者等信息。这些元数据的实体对象存储在对象存储设备上,客户端在对这些元数据进行访问时,会将其缓存到元数据服务器上,在内存中进行操作。对于目录树上的一个目录来说,向上有父目录、祖父目录等多级目录直至目录树的根目录,向下也可能有子目录等多级目录。

基于上述数据缓存方式,本发明实施例中根据目录子树的划分和所处元数据服务器位置,将元数据划分为属主元数据和副本元数据,对元数据的缓存进行分组管理。对于任意一台元数据服务器,其中存储有属主元数据和副本元数据两种数据类型的元数据。

元数据服务器集群中的任意一台元数据服务器,根据被分配的目录子树,存储该目录子树中各目录项的元数据。这些元数据的实体对象存储在对象存储设备上,客户端在对这些元数据进行访问时,会将其缓存到元数据服务器上,在内存中进行操作。对于客户端来说,也可能缓存有访问过的一些元数据,故客户端在访问文件时,会先在本地缓存中查找是否有与访问的文件对应的元数据,当查找不到时,才会到元数据服务器集群中去请求元数据。客户端根据要访问的文件对象生成元数据访问请求,在元数据访问请求中携带有对应的元数据标识,将该元数据访问请求封装成网络消息后,根据要访问的目录项所属的目录子树确定目标元数据服务器后,将网络消息发送至目标元数据服务器。

102、根据元数据访问请求,从多个元数据缓存队列获取元数据标识对应的目标元数据,其中,多个元数据缓存队列具有不同的优先级。

元数据服务器收到元数据访问请求时,根据该元数据访问请求中携带的元数据标识从多个元数据缓存队列中获取目标元数据。例如,元数据标识可以是元数据编号,元数据服务器内存中缓存的每一个元数据都有对应的元数据编号。或者,在其他实施例中,还可以根据元数据的结构选择能够唯一标识一个元数据的信息作为元数据标识。

由于元数据服务器的缓存总容量是有限的,需要根据缓存的使用情况按照一定的缓存淘汰算法对缓存进行淘汰。在缓存淘汰时,按照各个元数据缓存队列的优先级顺序,先淘汰优先级相对较低的元数据。而元数据的缓存管理方式决定了缓存淘汰的顺序。接下来,对元数据缓存队列进行说明。

103、确定目标元数据对应的数据类型。

元数据服务器在存储副本元数据时,会为元数据添加副本标识,因此,元数据服务器在获取到目标元数据后,可以根据是否携带有副本标识,判断获取到的元数据是属主元数据还是副本元数据。

104、基于数据类型、以及多个元数据缓存队列的优先级,从多个元数据缓存队列中确定目标元数据缓存队列,并将目标元数据存入目标元数据缓存队列的队头。

作为一种实施方式,“基于数据类型、以及多个元数据缓存队列的优先级,从多个元数据缓存队列中确定目标元数据缓存队列”可以包括:

当目标元数据为属主元数据时,根据多个元数据缓存队列的优先级,从存储有属主元数据的元数据缓存队列中确定目标元数据缓存队列;当目标元数据为副本元数据时,根据多个元数据缓存队列的优先级,从存储有副本元数据的元数据缓存队列中确定目标元数据缓存队列。

当存储有属主元数据的元数据缓存队列有多个时,将目标元数据当前所在队列的上一优先级的元数据缓存队列作为目标元数据缓存队列。其中,上一优先级是指比当前所在队列的优先级高一级的元数据缓存队列。存储有副本元数据的元数据缓存队列有多个时,可以按照同样的方式确定目标元数据缓存队列。

请参阅图1e,图1e是本发明实施例提供的元数据缓存队列的第一种示意图。针对两种不同数据类型(属主元数据和副本元数据)的元数据,分别维护两个优先级不同的缓存队列。以属主元数据为例,属主元数据维护了两个缓存队列q01和q02,队列的队头为mru(mostrecentlyused,最近最常使用)端,又称为前端,允许在队列的前端执行元数据存入操作。队列的队尾为lru(leastrecentlyused,最近最少使用)端,又称为后端,允许在队列的后端执行元数据删除操作。副本元数据维护了同样的两个缓存队列。其中,q02队列的优先级高于q01队列,在对缓存进行淘汰时,优先淘汰优先级低的元数据缓存队列中的元数据。在一些实施例中,可以为副本元数据的q01队列设置预设门限值,防止刚加入的副本元数据被频繁地替换出去,在缓存淘汰时,当该队列中剩余的副本元数据的数量不大于预设门限值时,停止对该队列的淘汰。

元数据服务器根据客户端对元数据的访问情况,动态调整元数据在元数据缓存队列中的位置,即根据缓存命中情况动态调整元数据在元数据缓存队列中的位置。以属主元数据的缓存队列为例,可以按照如下方式进行管理:当元数据服务器请求创建新的目录项元数据时,或者在缓存中没有获取到目标元数据而是从对象存储设备中取回目标元数据时,将创建或者取回的元数据(此时为属主元数据)存入q01队列的mru端。当q01队列或q02队列中的元数据再次被访问,则将该元数据移至q02队列的mru端。例如,当根据元数据标识,从属主元数据的q01队列或q02队列中获取到目标元数据时,将优先级高的q02队列作为目标元数据缓存队列,将目标元数据存入目标元数据缓存队列的队头。副本元数据的队列可以按照类似的方式管理。

一般情况下,如果元数据服务器没有属主元数据,则需要从对象存储设备的磁盘中获取,如果没有副本元数据,则可能从元数据服务器集群中的其他元数据服务器的内存中复制,因此,获取副本元数据的速度比获取属主元数据的速度更快,再加上,副本元数据只需要承担读操作。故,在缓存淘汰时,副本元数据的优先级总体比属主元数据的优先级低(优先被淘汰)。但是,某些情况下副本元数据分摊着重负载元数据服务器的读操作且会被频繁访问,而相对地,一些属主元数据可能访问频繁。由此,在进行缓存淘汰时可以淘汰属主元数据,所以,访问频率很高的副本元数据优先级可以比频率低的属主元数据高,也就是说,访问频率低的属主元数据可以先于访问频率高的副本元数据被淘汰。

基于此,可以对上述分组管理的四个队列进行进一步的改进,将副本元数据管理的q02队列和属主元数据管理的q01队列合并为一个混合元数据缓存队列,来缓存访问频率较低的属主元数据和访问频率高的副本元数据。对该队列进行淘汰时,其中的属主元数据可能会优先于副本元数据被淘汰,即在该混合元数据队列内部进行缓存淘汰时,不考虑元数据是属主元数据还是副本元数据,只考虑元数据的访问频率。

在一些实施例中,多个元数据缓存队列分别为属主元数据队列、混合元数据队列和副本元数据队列,属主元数据队列存储有属主元数据,混合元数据队列存储有属主元数据和副本元数据,副本元数据队列存储有副本元数据。

“根据多个元数据缓存队列的优先级从存储有属主元数据的元数据缓存队列中确定目标元数据缓存队列”包括:将属主元数据队列作为目标元数据缓存队列,其中,属主元数据队列的优先级高于混合元数据队列的优先级。

“根据多个元数据缓存队列的优先级从存储有副本元数据的元数据缓存队列中确定目标元数据缓存队列”包括:将混合元数据队列作为目标元数据缓存队列,其中,混合元数据队列的优先级高于副本元数据队列的优先级。

请参阅图1f,图1f是本发明实施例提供的元数据缓存队列的第二种示意图。设置三个元数据缓存队列:属主元数据属主元数据队列q3、混合元数据队列q2和副本元数据队列q1,按照优先级由低至高排列如下:副本元数据队列q1<混合元数据队列q2<属主元数据队列q3。在选择淘汰对象时,按照优先级由低至高的顺序进行淘汰,淘汰的顺序分别为副本元数据队列q1、混合元数据队列q2和属主元数据队列q3。先淘汰q1中的元数据,在副本元数据队列q1为空之后,淘汰混合元数据队列q2中的元数据,在混合元数据队列q2为空之后,淘汰属主元数据队列q3中的元数据。

在一些实施例中,为副本元数据队列q1设置预设门限值,防止刚加入的副本元数据被频繁地淘汰出去。在选择淘汰对象时,在副本元数据队列q1的长度大于预设门限值时,淘汰副本元数据队列q1中的元数据,直到副本元数据队列q1长度不大于预设门限值时,淘汰混合元数据队列q2中的元数据,在混合元数据队列q2为空之后,就淘汰属主元数据队列q3中的元数据。其中,在每个元数据缓存队列内部,按照由队尾(访问频率相对较低)至队头(访问频率相对较高)的顺序依次淘汰。

请参阅图1g,图1g是本发明实施例提供的元数据缓存队列的第三种示意图。如果从属主元数据队列q3或混合元数据队列q2获取到属主元数据,将优先级更高的属主元数据队列q3作为目标元数据缓存队列,将该属主元数据从当前所在的队列移至属主元数据队列q3的队头,将该属主元数据的优先级升高。如果从混合元数据队列q2或副本元数据队列q1获取到副本元数据,将优先级更高的混合元数据队列q2作为目标元数据缓存队列,将该副本元数据从当前所在的队列移至混合元数据队列q2的队头,将该副本元数据的优先级升高。基于此,对于属主元数据和副本元数据来说,如果某元数据频繁被访问,其优先级会被升高,会被从当前位置移动到属主元数据队列q3或混合元数据队列q2的队头,即将该元数据存入到属主元数据队列q3或混合元数据队列q2的队头,在位置移动后的一段时间内,该元数据被淘汰的可能性降低。

此外,在元数据服务器中,元数据的倒盘是以目录分片为单位的。即元数据倒盘时,不能以单独的目录项更新写回到对象存储设备中。基于这个原理,在淘汰缓存的元数据时,不能淘汰变脏的元数据,必须等脏的属主元数据所在的父目录分片整体更新到对象存储设备,变为干净的属主元数据后,才可以进行淘汰。

作为另外一种实施方式,数据类型包括属主元数据、副本元数据、干净元数据和脏元数据,多个元数据缓存队列分别为属主元数据队列、混合元数据队列、副本元数据队列、和脏元数据队列。属主元数据队列存储有属主元数据、混合元数据队列存储有属主元数据和副本元数据、副本元数据队列存储有副本元数据,脏元数据队列存储有脏元数据。“基于数据类型、以及多个元数据缓存队列的优先级,从多个元数据缓存队列中确定目标元数据缓存队列”可以包括:

当目标元数据为属主元数据、且为干净元数据时,将属主元数据队列作为目标元数据缓存队列,其中,属主元数据队列的优先级高于混合元数据队列的优先级;当目标元数据为属主元数据、且为脏元数据时,将脏元数据队列作为目标元数据缓存队列;当目标元数据为副本元数据时,将混合元数据队列作为目标元数据缓存队列,其中,混合元数据队列的优先级高于副本元数据队列的优先级。

在一些实施例中,为了减少缓存淘汰时的查询时间,将干净元数据与脏元数据分开管理。将元数据缓存队列分为干净元数据队列和脏元数据队列。例如,元数据缓存队列包括干净元数据队列和脏元数据队列,干净元数据队列包括属主元数据队列q3、混合元数据队列q2和副本元数据队列q1。脏元数据不需要进行淘汰,对命中率的要求也不高,故可以使用一个单独的队列对脏元数据进行管理。请参阅图1h,图1h是本发明实施例提供的元数据缓存队列的第四种示意图。元数据缓存队列还包括脏元数据队列q4。可以理解的是,副本元数据只用于应对不会改变元数据的读操作,因此,脏元数据队列中只有属主元数据。

在变脏的属主元数据更新到对象存储设备之前,客户端可能会再次访问该属主元数据,则元数据服务器会在脏元数据队列获取到该属主元数据。故,当目标元数据为属主元数据、且为脏元数据(从脏元数据队列获取到目标元数据)时,将脏元数据队列作为目标元数据缓存队列,将属主元数据移至脏元数据队列的队头。请参阅图1h,对于脏元数据队列来说,如果其中的属主元数据被再次访问,则将被访问的属主元数据移至脏元数据队列q4的队头。

在一些实施例中,元数据缓存管理方法还包括:若检测到干净元数据队列中有属主元数据变脏,则将变脏的属主元数据由干净元数据队列移至脏元数据队列;在变脏的属主元数据更新到对象存储设备后,将更新后的属主元数据存入混合元数据队列。

当客户端根据元数据服务器返回的元数据访问了对应的实体对象后,如果对实体对象进行了修改,那么该元数据(如文件大小、最新修改时间等)也会发生变化。在客户端关闭该实体对象时,客户端会根据修改后的情况向元数据服务器发送修改请求,元数据服务器会根据该修改请求在内存中对属主元数据进行对应的修改操作,那么属主元数据就会变脏。这里的元数据变脏是指,内存中的属主元数据发生了修改,但是还没有更新写回到对象存储设备中,此时就会被称为脏元数据。元数据服务器把变脏的属主元数据从干净元数据队列(如属主元数据队列q3或混合元数据队列q2)移至脏元数据队列q4的队头。在变脏的属主元数据更新写回到对象存储设备后,该脏的属主元数据又变为干净属主元数据,则再将该干净属主元数据从脏元数据队列移至干净元数据队列。例如,请参阅图1h,若脏的属主元数据变干净,将其从脏元数据队列移至混合元数据队列的队尾。

在一些实施例中,“根据元数据访问请求,从多个元数据缓存队列获取元数据标识对应的目标元数据”之后,元数据缓存管理方法还可以包括:

a1、当从元数据缓存队列中获取不到元数据访问请求对应的目标元数据时,则从元数据服务器集群中的其它元数据服务器查找目标元数据;

a2、当获取到目标元数据时,创建目标元数据的副本元数据并存入副本元数据队列;

a3、当获取不到目标元数据时,从对象存储设备中获取目标元数据,并将获取的目标元数据作为属主元数据,存入混合元数据队列。

该实施例中,当元数据服务器从本地的元数据缓存队列中查找不到元数据访问请求对应的目标元数据时,首先从元数据服务器集群中的其他元数据服务器上查找目标元数据,如果能够找到,则创建目标元数据的副本元数据,即从其他元数据服务器上复制一份到本地缓存中,即将创建的副本元数据存入副本元数据队列q1的队头。如果从元数据服务器集群中的其他元数据服务器上查找不到该目标元数据,即元数据服务器集群中当前并未缓存该目标元数据,例如,之前缓存的目标元数据均被淘汰。此时,需要从对象存储设备中获取目标元数据缓存到本地,将获取的目标元数据为属主元数据,存入混合元数据队列q2的队头。

通过上述方式,随着用户对元数据的访问,动态地调整缓存中的属主元数据和副本元数据在缓存队列中的位置,热度高的属主元数据会被存储在优先级相对较高的属主元数据队列中,热度高的副本元数据会被存储在优先级相对较低的混合元数据队列中更靠近队头的位置,而热度低的属主元数据会被存储在优先级相对较低的混合元数据队列中更靠近队尾的位置,热度低的副本元数据会被存储在优先级最低的副本元数据队列中。在缓存淘汰时,按照热度低的副本元数据、热度低的属主元数据、热度高的副本元数据、热度高的属主元数据的顺序进行缓存的淘汰,尽可能地保留了访问频繁的属主元数据或副本元数据不被淘汰,以使在元数据被访问时,可以直接从缓存中访问频繁的元数据,从而提高缓存命中率。

具体实施时,本发明不受所描述的各个步骤的执行顺序的限制,在不产生冲突的情况下,某些步骤还可以采用其它顺序进行或者同时进行。

此外,需要说明的是,本发明实施例提出的元数据缓存管理方法,并不局限于cephfs,还可以应用于其他使用元数据服务器集群对元数据进行分布式管理的分布式文件系统。

由上所述,本发明实施例提出的元数据缓存管理方法,当接收到元数据访问请求时,获取元数据访问请求中携带的元数据标识,根据元数据访问请求,从多个元数据缓存队列获取元数据标识对应的目标元数据,其中,多个元数据缓存队列具有不同的优先级;确定该目标元数据的数据类型,根据数据类型和各元数据缓存队列的优先级从多个元数据缓存队列中确定出目标元数据缓存队列,并将目标元数据存入目标元数据缓存队列的队头,本发明根据对元数据的访问情况,动态调整元数据在元数据缓存队列中的位置,使得访问相对频繁的元数据位于元数据缓存队列的队头,使得在缓存淘汰时,优先淘汰优先级低的元数据缓存队列,尽可能地保留访问频繁的元数据,减少从对象存储设备中取回元数据的情况,相对于使用单一lru队列对多种类型的元数据进行管理的方案而言,本方案进行元数据访问时,访问频繁的元数据具有更高的缓存命中率,进而提高了对元数据访问请求的响应速度,使得分布式文件系统具有较高的读写效率。

根据前面实施例所描述的方法,以下将举例作进一步详细说明。

请参阅图2a,图2a是本发明实施例提供的元数据缓存管理方法的第二流程示意图。方法包括:

201、接收元数据访问请求,元数据访问请求携带有元数据标识。

客户端在访问文件时,会先在本地缓存中查找是否有与访问的文件对应的元数据,若查找不到,则根据要访问的文件对象生成元数据访问请求,将该元数据访问请求封装成网络消息后发送至元数据服务器。元数据服务器收到元数据访问请求时,确定该元数据访问请求对应的元数据标识。

202、根据元数据访问请求,从多个元数据缓存队列获取元数据标识对应的目标元数据,数据类型包括属主元数据、副本元数据、脏元数据,多个元数据缓存队列分别为属主元数据队列、混合元数据队列、副本元数据队列和脏元数据队列,属主元数据队列存储有属主元数据,混合元数据队列存储有属主元数据和副本元数据,副本元数据队列存储有副本元数据,脏元数据队列存储有脏元数据。

从元数据缓存队列查找该元数据标识对应的目标元数据,元数据缓存队列包括干净元数据队列和脏元数据队列,干净元数据队列包括优先级由高至低的属主元数据队列、副本元数据队列和混合元数据队列,其中,在缓存淘汰时,优先级低的元数据缓存队列先于优先级高的元数据缓存队列被淘汰。

对于元数据服务器集群中的任意一台元数据服务器,首先,将其中存储的元数据分为干净元数据和脏元数据管理,即分别创建干净元数据队列和脏元数据队列进行维护。其中,对于干净元数据,又根据对属主元数据和副本元数据的分组维护有三个队列,包括只存储有属主元数据的属主元数据队列q3,只存储有副本元数据的副本元数据队列q1,以及存储有属主元数据和副本元数据的混合元数据队列q2。

203、确定目标元数据对应的数据类型。

204、当目标元数据为属主元数据、且为干净元数据时,将属主元数据队列作为目标元数据缓存队列。

205、当目标元数据为属主元数据、且为脏元数据时,将脏元数据队列作为目标元数据缓存队列。

206、当目标元数据为副本元数据时,将混合元数据队列作为目标元数据缓存队列。

207、将目标元数据移至目标元数据缓存队列的队头。

如果从属主元数据队列q3或混合元数据队列q2获取到属主元数据,则将该属主元数据从当前的队列移至属主元数据队列q3的队头,将该属主元数据的优先级升高。如果从混合元数据队列q2或副本元数据队列ql获取到副本元数据,即将该副本元数据的优先级升高。

在变脏的属主元数据更新到对象存储设备之前,客户端可能会再次访问该属主元数据,因此,如果在缓存中查找目标元数据时,可能会从脏元数据队列获取到目标元数据的属主元数据,即获取到的元数据为属主元数据、且为脏元数据,此时,将获取到的属主元数据移至脏元数据队列的队头。

当元数据服务器从本地的元数据缓存队列中查找不到元数据访问请求对应的目标元数据时,首先从元数据服务器集群中的其他元数据服务器上查找目标元数据。如果能够找到,则创建目标元数据的副本元数据并存入副本元数据队列的队头,即从其他元数据服务器上复制一份到本地缓存中,将创建的副本元数据加入副本元数据队列q1的队头。

在一些实施例中,“创建目标元数据的副本元数据并存入副本元数据队列的队头”可以包括:

b1、检测元数据缓存队列中有否有处于闲置状态的属主元数据;

b2、若有,则判断处于闲置状态的属主元数据对应的目录项中是否有待删除的文件;

b3、若没有待删除的文件,则将处于闲置状态的属主元数据转换为目标元数据的副本元数据,并将转换得到的副本元数据移至副本元数据队列的队头;

b4、若有待删除的文件,则创建空状态的属主元数据,并将空状态的属主元数据存入混合元数据队列的队头;

b5、将状态的属主元数据转换为目标元数据的副本元数据,并将转换得到的副本元数据移至副本元数据队列的队头。

由于元数据本身是一种结构体,该结构体可以包含多个字段,例如,元数据编号字段、文件大小字段、文件位置字段、文件创建时间字段、文件所属者字段等等。当创建一个空状态的元数据时,这些字段中的值均为0,不对应任何实体对象。当分布式文件系统不支持直接创建副本元数据时,可以创建一个空状态的属主元数据,将要复制的目标元数据的各字段的值填入该空状态的属主元数据,即可将该空状态的属主元数据转换为副本元数据。

或者,在一些实施例中,还可以利用用于暂存待删除文件的stray目录的属主元数据,该属主元数据在元数据缓存队列中被标记为stray(闲置)状态。当该stray目录中没有文件时,为了节约缓存空间,可以将该目录的属主元数据(即闲置状态的属主元数据)取出使用,变更其中各字段的值,将其转换为目标元数据的属主元数据。因此,该实施例中的副本元数据的来源,本质上都是从属主元数据转换而来。

请参阅图2b,图2b是本发明实施例提供的元数据缓存队列的第五种示意图。闲置状态的属主元数据,最初位于混合元数据队列q2,如果被再次访问则会移至属主元数据队列q3。被转换为副本元数据时,若位于混合元数据队列q2,则将其移至副本元数据队列q1的队头,若位于属主元数据队列q3,则将其移至混合元数据队列q2的队头。此外,根据上述两种方式得到的副本元数据,本质上都是从属主元数据转换而来,也就是说,最初创建的元数据均是先加入到混合元数据队列q2的队头。例如,创建的空状态的属主元数据先加入到混合元数据队列q2的队头,当其被转换为目标元数据的副本元数据之后,再将其移至副本元数据队列q1的队头。而对于闲置状态的属主元数据来说,被转换之前可能在混合元数据队列q2中,也可能在属主元数据队列q3中。若在混合元数据队列q2中,被转换为目标元数据的副本元数据之后,则移至副本元数据队列q1的队头,若在属主元数据队列q3中,被转换为目标元数据的副本元数据之后,则移至混合元数据队列q2的队头。

如果从元数据服务器集群中的其他元数据服务器上查找不到该目标元数据,即元数据服务器集群中当前并未缓存该目标元数据。需要从对象存储设备中获取目标元数据缓存到本地,此时,获取的目标元数据为属主元数据,可以存入混合元数据队列q2。

在一些实施例中,元数据缓存管理方法还包括:

c1、当检测到负载程度大于第一预设阈值时,根据元数据的访问统计数据确定热点属主元数据。

c2、根据服务器节点拓扑图,从元数据服务器集群中选择负载程度小于第二预设阈值的元数据服务器,作为目标元数据服务器,其中,第二预设阈值小于第一预设阈值。

c3、将热点属主元数据复制到目标元数据服务器。

该实施例中,各元数据服务器会对负载情况,例如内存使用率实时检测。同时,还会对本地缓存的元数据的访问情况进行统计。当检测到负载较重时,例如,当检测到内存使用率大于第一预设阈值时,根据统计的本地缓存的元数据的访问情况,例如预设时长内被访问的次数等,根据这些数据以及对应的目录子树确定出热点属主元数据,例如,将预设时长内被访问的次数大于预设次数的属主元数据,作为热点属主元数据。

此外,各元数据服务器中还维护有服务器节点拓扑图,该服务器节点拓扑图张包含各台元数据服务器的负载情况,例如,负载程度等。其中,元数据服务器会互相广播自身的负载情况,以使各元数据服务器能够同步更新服务器节点拓扑图。元数据服务器根据服务器节点拓扑图,从元数据服务器集群中选择负载程度小于第二预设阈值的元数据服务器,作为目标元数据服务器将这些高热度的属主元数据复制到目标元数据服务器,复制过去之后生成的就是副本元数据,这些副本元数据会存入到目标元数据服务器中副本元数据队列的队头。

在一些实施例中,元数据缓存管理方法还包括:当接收到元数据服务器集群中其他元数据服务器发送的数据复制请求时,根据数据复制请求确定待复制的热点元数据;创建待复制的热点元数据的副本元数据,并存入副本元数据队列的队头。

由上所述,本发明实施例提出的元数据缓存管理方法,创建干净元数据队列和脏元数据队列进行维护,通过把干净元数据和脏元数据分开管理以减少缓存淘汰时的查询时间,提高缓存淘汰效率。并且,干净元数据队列又会基于对属主元数据和副本元数据的分组管理,维护有三个缓存队列,分别为优先级由高至低的属主元数据队列、副本元数据队列和混合元数据队列。随着用户对元数据的访问,动态地调整缓存中的属主元数据和副本元数据在缓存队列中的位置,使得访问频率高的属主元数据位于不易被淘汰的队列的队头,访问频率低的副本元数据位于优先被淘汰的队列的队尾,并且使得访问频率低的属主元数据先于访问频率高的副本元数据被淘汰,尽可能地保留了访问频繁的属主元数据或副本元数据,提高元数据访问的缓存命中率,进而提高分布式文件系统的读写效率。

在一些实施例中,元数据缓存管理方法还包括:获取内存使用率;根据内存使用率和预设容量阈值,调整缓存总容量,其中,缓存总容量与内存使用率成反比。

在该实施例中,可以预先预设容量阈值cmax,在元数据服务器的运行过程中,根据负载情况,例如,内存使用率,动态地调整缓存总容量。例如,当元数据服务器的负载较重,系统资源(如内存)比较紧张,此时,可以适当地降低元数据的缓存总容量。反之,当元数据服务器的负载较轻时,可以适当增大元数据的缓存总容量,其中,缓存总容量是指允许缓存占用的最大内存量。

在一些实施例中,将内存使用率u作为调整系数,可以按照如下公式计算缓存总容量ctotal,其中,内存使用率越大,则缓存总容量越小:

ctotal=(1-u)*cmax

假设当前脏元数据队列占用的内存空间为cdirty,则干净元数据队列的缓存容量cclear=[(1-u)*cmax-cdirty]。

假设ki表示队列qi在干净元数据队列的缓存容量cclear中的预设容量比例。

则可以计算得到队列qi的缓存容量ci为:

ci=ki[(1-u)*cmax-cdirty],其中,i=1,2,3。

在一些实施例中,元数据缓存管理方法还包括:获取当前的缓存总容量;根据缓存总容量和各元数据缓存队列的预设容量比例,计算各元数据缓存队列的容量上限,其中,元数据缓存队列的预设容量比例与对应的优先级成正比;按照优先级由高至低的顺序,将各元数据缓存队列中超出容量上限的元数据,存入比当前所在的元数据缓存队列优先级低的元数据缓存队列。

由于元数据访问的突发性和随机性,可能导致一些元数据长期处于优先级高的队列中不被淘汰。例如,属主元数据队列q3在缓存淘汰时的顺序靠后,即被淘汰的概率较小,一些很少被访问的属主元数据在被存入属主元数据队列q3之后,长期处于属主元数据队列q3中不被淘汰,而且访问频率很低,甚至存在存入属主元数据队列q3之后再也未被访问过的可能,导致存在缓存污染。该实施例中,为了解决这种缓存污染问题,可以对干净元数据队列进行老化处理,老化处理的本质在于降低元数据的优先级。

例如,设置一个定时器,定时地启动老化机制,对各干净元数据队列进行调整。或者在对缓存总容量调整之后,对各干净元数据队列进行老化处理。

由于缓存总容量是会动态变化的,在老化处理时,先获取当前的缓存总容量,以及各元数据缓存队列当前的缓存空间占用量。各元数据缓存队列设置有固定的预设容量比例。根据缓存总容量和各元数据缓存队列的预设容量比例,可以计算得到各元数据缓存队列的容量上限,根据容量上限和当前的缓存空间占用量对各干净元数据队列进行老化处理。

请参阅图2c,图2c是本发明实施例提供的元数据缓存管理方法中的元数据老化示意图。假设缓存总容量调整后,三个干净元数据队列的缓存容量cclear为18个元数据,q1队列、q2队列和q3队列当前的缓存空间占用量分别是3、6、9,q1队列、q2队列和q3队列的预设容量比例依次为2/9、3/9和4/9,其中,因为访问频繁,优先级高的干净元数据队列的预设容量比例可以更大一些。根据上述数据可以计算出q1队列、q2队列和q3队列当前的容量上限分别为4、6、8。接下来,按照q3队列、q2队列、q1队列的顺序依次对三个元数据缓存队列进行老化,q3队尾超出其容量上限的元数据有一个,将该元数据存入q2队列的队头。并且,将q2队列的队尾超出其容量上限的一个元数据移至q1队列的队头。老化后各队列的缓存空间变为4、6、8。在其他实施例中,若优先级最低的元数据缓存队列中的元数据超出其容量上限,则将该队列的队尾超出容量上限的元数据删除。

另外,该实施例中,由于脏元数据会更新写回到对象存储设备中,一般不存在缓存污染的问题,可以不对其使用老化机制,根据经验值设置脏元数据队列的容量,使其能够满足脏元数据的缓存即可。

在一些实施例中,元数据缓存管理方法还包括:获取多个元数据缓存队列的空间占用量,以及当前的缓存总容量;若空间占用量大于缓存总容量,则对多个元数据缓存队列进行淘汰,直至空间占用量不大于缓存总容量。

该实施例中,可以对缓存进行主动淘汰,例如定时地对元数据缓存队列的空间占用量进行检测,当检测到空间占用量大于当前的缓存总容量,则对元数据缓存队列进行淘汰,直至空间占用量不大于缓存总容量。

或者,在另外一些实施例中,也可以对缓存进行被动淘汰。例如,从对象存储设备中获取目标元数据之前,该方法还包括:获取缓存的闲置空间量,以及当前的缓存总容量;判断闲置空间量与当前的缓存总容量之间的比例是否大于第一预设比例;若是,则执行从对象存储设备中获取目标元数据的步骤;若否,则对多个元数据缓存队列进行淘汰,直至闲置空间量与当前的缓存总容量之间的比例不小于第二预设比例,其中,第二预设比例不小于第一预设比例;然后,执行从对象存储设备中获取目标元数据的步骤。

其中,被动淘汰是在元数据服务器从本地缓存中没有获取到目标元数据,需要到对象存储设备中取元数据之前进行的。原因在于,元数据服务器从对象存储设备中取数据是以目录分片为单位的,而目录分片包括多个目录项,进而需要取多个元数据。因此,在取元数据之前,先检测闲置空间量与当前的缓存总容量之间的比例是否大于第一预设比例,如果是,则可以取元数据。如果闲置空间量与当前的缓存总容量之间的比例不大于第一预设比例,则对多个元数据缓存队列进行淘汰直至闲置空间量与当前的缓存总容量之间的比例不小于第二预设比例。第一预设比例和第二预设比例均为经验值,可以根据实际需要设置。

其中,“对元数据缓存队列进行淘汰”可以包括:按照优先级由低到高的顺序,淘汰干净元数据队列中缓存的元数据。其中,在各元数据缓存队列内部,按照从队列的队尾至队头的顺序淘汰元数据,其中,当副本元数据队列中剩余的副本元数据的数量小于预设门限值时,停止对副本元数据队列的淘汰。

在一些实施例中,元数据缓存管理方法还包括:

当检测到有属主元数据发生修改操作,则根据修改操作生成日志;将日志存储至日志片段;当检测到日志片段写满后,将日志片段上日志对应的元数据以父目录分片为单位更新至对象存储设备,以实现脏元数据倒盘。

请参阅图2d,图2d是本发明实施例提供的元数据缓存管理方法中脏元数据倒盘示意图。日志以日志片段为逻辑组织单位,当一个日志片段上的日志都写到对象存储设备之后,这一日志片段上的日志相关的脏元数据就可以更新到对象存储设备上去。

由于日志写到对象存储设备上的速度是不确定的,故可以设置一个定时器(比如5s),定时检测是否有日志片段写完,当检测到有日志片段写完,则将该日志片段上的日志对应的脏元数据更新至对象存储设备,即进行脏元数据倒盘。其中,在对脏元数据进行倒盘时,以父目录分片为单位进行,基于此,一个日志片段上的日志对应的脏元数据可能对应于多个父目录分片,此时,就需要将这多个父目录分片更新至对象存储设备。其中,一个日志片段的容量是有限的,例如,一个日志片段的容量为4m,则当该日志片段中存储的日志达到4m,可以判定该日志片段写满,可以将该日志片段写入到对象存储设备。

在一些实施例中,为了能对元数据进行快速的查找,给缓存中的元数据建立索引信息,例如,通过以下两种索引来分别适应目录的读取和目录下元数据的查找两种情景。以目录为单位建立元数据索引信息,对属于一个目录下的所有元数据进行索引。

(1)基于红黑树的索引:在处理读操作、预读操作等读取一个目录下元数据操作时,需要让元数据按字典排序顺序输出,此时可以使用红黑树对元数据进行排序,建立索引。

(2)基于哈希的索引:在元数据服务器中进行文件路径查找时,对一个目录下的元数据通过哈希映射建立索引,可以在o(1)的时间复杂度内找到目标元数据。

为了实施以上方法,本发明实施例还提供一种元数据缓存管理装置,该元数据缓存管理装置具体可以集成在元数据服务器中。

例如,请参阅图3,图3是本发明实施例提供的元数据缓存管理装置的结构示意图。该元数据缓存管理装置可以包括请求处理单元301、元数据查找单元302、类型识别单元303和队列管理单元304,如下:

请求处理单元301,用于接收元数据访问请求,元数据访问请求携带有元数据标识。

cephfs的整个目录树被动态地分割成几个目录子树,由对应的元数据服务器进行管理。被分配到划分后的目录子树的元数据服务器称之为属主元数服务器,该属主元数据服务器中存储有为其分配的目录子树中各目录项的元数据。此外,对于元数据服务器集群来说,访问量可能很大,当一些元数据服务器的负载较重时,为了解决这种元数据服务器访问负载不均衡的情况,会在相对于属主元数据服务器的其他元数据服务器上生成副本元数据,通过这些副本元数据来执行一些读操作,减轻属主元数据服务器的负载。

元数据服务器集群中的任意一台元数据服务器,根据被分配的目录子树,存储该目录子树中各目录项的元数据。这些元数据的实体对象存储在对象存储设备上,客户端在对这些元数据进行访问时,会将其缓存到元数据服务器上,在内存中进行操作。

对于客户端来说,也可能缓存有访问过的一些元数据,故客户端在访问文件时,会先在本地缓存中查找是否有与访问的文件对应的元数据,当查找不到时,才会到元数据服务器集群中去请求元数据。客户端根据要访问的文件对象生成元数据访问请求,在元数据访问请求中携带有对应的元数据标识,将该元数据访问请求封装成网络消息后,根据要访问的目录项所属的目录子树确定目标元数据服务器后,将网络消息发送至目标元数据服务器。

元数据查找单元302,用于根据元数据访问请求,从多个元数据缓存队列获取元数据标识对应的目标元数据,其中,多个元数据缓存队列具有不同的优先级。

元数据服务器接收到元数据访问请求时,元数据查找单元302根据该元数据访问请求中携带的元数据标识,从多个元数据缓存队列中获取目标元数据。例如,元数据标识可以是元数据编号,元数据服务器内存中缓存的每一个元数据都有对应的元数据编号。或者,在其他实施例中,还可以根据元数据的结构选择能够唯一标识一个元数据的信息作为元数据标识。

由于元数据服务器的缓存总容量是有限的,需要根据缓存的使用情况按照一定的缓存淘汰算法对缓存进行淘汰。在缓存淘汰时,按照各个元数据缓存队列的优先级顺序,先淘汰优先级相对较低的元数据。而元数据的缓存管理方式决定了缓存淘汰的顺序。接下来,对元数据缓存队列进行说明。

类型识别单元303,用于确定目标元数据对应的数据类型。

元数据服务器在存储副本元数据时,会为元数据添加副本标识,因此,元数据服务器在获取到目标元数据后,类型识别单元303可以根据是否携带有副本标识,判断获取到的元数据是属主元数据还是副本元数据。

队列管理单元304,用于基于数据类型、以及多个元数据缓存队列的优先级,从多个元数据缓存队列中确定目标元数据缓存队列,并将目标元数据存入目标元数据缓存队列的队头。

作为一种实施方式,队列管理单元304还用于:当目标元数据为属主元数据时,根据多个元数据缓存队列的优先级从存储有属主元数据的元数据缓存队列中确定目标元数据缓存队列;当目标元数据为副本元数据时,根据多个元数据缓存队列的优先级从存储有副本元数据的元数据缓存队列中确定目标元数据缓存队列。

当存储有属主元数据的元数据缓存队列有多个时,队列管理单元304将目标元数据当前所在队列的上一优先级的元数据缓存队列作为目标元数据缓存队列。其中,上一优先级是指比当前所在队列的优先级高一级的元数据缓存队列。存储有副本元数据的元数据缓存队列有多个时,可以按照同样的方式确定目标元数据缓存队列。

在一些实施例中,数据类型包括属主元数据和副本元数据,多个元数据缓存队列分别为属主元数据队列、混合元数据队列和副本元数据队列,属主元数据队列存储有属主元数据,混合元数据队列存储有属主元数据和副本元数据,副本元数据队列存储有副本元数据;队列管理单元304还用于:

将属主元数据队列作为目标元数据缓存队列,其中,属主元数据队列的优先级高于混合元数据队列的优先级。

将混合元数据队列作为目标元数据缓存队列,其中,混合元数据队列的优先级高于副本元数据队列的优先级。

在一些实施例中,数据类型包括属主元数据、副本元数据、干净元数据和脏元数据,多个元数据缓存队列分别为属主元数据队列、混合元数据队列、副本元数据队列、和脏元数据队列;队列管理单元304还用于:

当目标元数据为属主元数据、且为干净元数据时,将属主元数据队列作为目标元数据缓存队列,其中,属主元数据队列的优先级高于混合元数据队列的优先级;当目标元数据为属主元数据、且为脏元数据时,将脏元数据队列作为目标元数据缓存队列;当目标元数据为副本元数据时,将混合元数据队列作为目标元数据缓存队列,其中,混合元数据队列的优先级高于副本元数据队列的优先级。

请参阅图1e,图1e是本发明实施例提供的元数据缓存队列的第一种示意图。属主元数据维护了两个缓存队列q01和q02,队列的队头为mru(mostrecentlyused,最近最常使用)端,队列的队尾为lru(leastrecentlyused,最近最少使用)端。副本元数据维护了同样的两个缓存队列。其中,q02队列的优先级高于q01队列,在对缓存进行淘汰时,优先淘汰优先级低的元数据缓存队列中的元数据。在一些实施例中,可以为副本元数据的q01队列设置预设门限值,防止刚加入的副本元数据被频繁地替换出去,在缓存淘汰时,当该队列中剩余的副本元数据的数量不大于预设门限值时,停止对该队列的淘汰。

元数据服务器根据客户端对元数据的访问情况动态调整元数据在元数据缓存队列中的位置,即根据缓存命中情况动态调整元数据在元数据缓存队列中的位置。以属主元数据的队列为例,可以按照如下方式进行管理,当元数据服务器请求创建新的目录项元数据时,或者在缓存中没有获取到从对象存储设备中取回目录项元数据时,将创建或者取回的属主元数据存入q01队列的mru端。当q01队列或q02队列中的元数据再次被访问,则将该元数据移至q02队列的mru端。例如,当根据元数据标识,从属主元数据的q01队列或q02队列中获取到目标元数据时,将优先级高的q02队列作为目标元数据缓存队列,将目标元数据移至目标元数据缓存队列的队头。副本元数据的队列可以按照类似的方式管理。

在一些实施例中,多个元数据缓存队列分别为属主元数据队列、混合元数据队列和副本元数据队列,属主元数据队列存储有属主元数据,混合元数据队列存储有属主元数据和副本元数据,副本元数据队列存储有副本元数据。队列管理单元304还用于:

将属主元数据队列作为目标元数据缓存队列,其中,属主元数据队列的优先级高于混合元数据队列的优先级。以及,将混合元数据队列作为目标元数据缓存队列,其中,混合元数据队列的优先级高于副本元数据队列的优先级。

请参阅图1f,设置三个元数据缓存队列:属主元数据属主元数据队列q3、混合元数据队列q2和副本元数据队列q1,优先级顺序如下:副本元数据队列q1<混合元数据队列q2<属主元数据队列q3,在缓存淘汰时,按照优先级由低至高的顺序进行淘汰。在选择淘汰对象时,淘汰的顺序分别为副本元数据队列q1、混合元数据队列q2和属主元数据队列q3。先淘汰副本元数据队列q1中的元数据,在副本元数据队列q1为空之后,淘汰混合元数据队列q2中的元数据,在混合元数据队列q2为空之后,淘汰属主元数据队列q3中的元数据。其中,在每个元数据缓存队列内部,按照由队列的队尾至队头的顺序依次淘汰。

请参阅图1g,如果从属主元数据队列q3或混合元数据队列q2获取到属主元数据,队列管理单元304将优先级更高的属主元数据队列q3作为目标元数据缓存队列,将该属主元数据从当前所在的队列移至属主元数据队列q3的队头,将该属主元数据的优先级升高。如果从混合元数据队列q2或副本元数据队列q1获取到副本元数据,队列管理单元304将优先级更高的混合元数据队列q2作为目标元数据缓存队列,将该副本元数据从当前所在的队列移至混合元数据队列q2的队头,将该副本元数据的优先级升高。基于此,对于属主元数据和副本元数据来说,如果某元数据频繁被访问,其优先级会被升高,会被从当前位置移动到属主元数据队列q3或混合元数据队列q2的队头,在位置移动后的一段时间内,被淘汰的可能性降低。

在一些实施例中,队列管理单元304还用于:若检测到干净元数据队列中有属主元数据变脏,则将变脏的属主元数据由干净元数据队列移至脏元数据队列;以及,在变脏的属主元数据更新到对象存储设备后,将更新后的属主元数据存入混合元数据队列。

在一些实施例中,队列管理单元304还用于:当从元数据缓存队列中获取不到目标元数据时,从元数据服务器集群中的其它元数据服务器获取目标元数据;当获取到目标元数据时,创建目标元数据的副本元数据并存入副本元数据队列;当获取不到目标元数据时,从对象存储设备中获取目标元数据,并将获取的目标元数据作为属主元数据,存入混合元数据队列。

通过上述方式,随着用户对元数据的访问,动态地调整缓存中的属主元数据和副本元数据在缓存队列中的位置,热度高的属主元数据会被存储在优先级相对较高的属主元数据队列中靠近队头的位置,热度高的副本元数据会被存储在优先级相对较低的混合元数据队列中更靠近队头的位置,而热度低的属主元数据会被存储在优先级相对较低的混合元数据队列中更靠近队尾的位置,热度低的副本元数据会被存储在优先级最低的副本元数据队列中。在缓存淘汰时,按照热度低的副本元数据、热度低的属主元数据、热度高的副本元数据、热度高的属主元数据的顺序进行缓存的淘汰,尽可能地保留了访问频繁的属主元数据或副本元数据不被淘汰。

由上所述,本发明实施例提出的元数据缓存管理装置,请求处理单元301接收元数据访问请求时,元数据查找单元302获取元数据访问请求中携带的元数据标识,根据元数据访问请求,从多个元数据缓存队列获取元数据标识对应的目标元数据,其中,多个元数据缓存队列具有不同的优先级;类型识别单元303确定该目标元数据的数据类型,队列管理单元304根据数据类型和各元数据缓存队列的优先级从多个元数据缓存队列中确定出目标元数据缓存队列,将目标元数据存入目标元数据缓存队列的队头,本发明根据对元数据的访问情况,动态调整元数据在元数据缓存队列中的位置,使得访问相对频繁的元数据位于元数据缓存队列的队头,使得在缓存淘汰时,优先淘汰优先级低的元数据缓存队列,尽可能地保留访问频繁的元数据,减少从对象存储设备中取回元数据的情况,相对于使用单一lru队列对多种类型的元数据进行管理的方案而言,本方案进行元数据访问时,访问频繁的元数据具有更高的缓存命中率,进而提高了对元数据访问请求的响应速度,使得分布式文件系统具有较高的读写效率。

在一些实施例中,队列管理单元304还用于:

检测元数据缓存队列中有否有处于闲置状态的属主元数据;若有,则判断处于闲置状态的属主元数据对应的目录项中是否有待删除的文件;若没有待删除的文件,则将处于闲置状态的属主元数据转换为目标元数据的副本元数据,并将转换得到的副本元数据移至当前所在元数据缓存队列的上一级元数据缓存队列的队头;若有待删除的文件,则创建空状态的属主元数据,并将空状态的属主元数据存入混合元数据队列的队头;以及,将空状态的属主元数据转换为目标元数据的副本元数据,并将转换得到的副本元数据移至副本元数据队列的队头。

在一些实施例中,元数据缓存管理装置还包括:

缓存淘汰单元,用于获取多个元数据缓存队列的空间占用量,以及当前的缓存总容量;以及,若空间占用量大于缓存总容量,则对多个元数据缓存队列进行淘汰,直至空间占用量不大于缓存总容量。

例如,定时地对元数据缓存队列的空间占用量进行检测,当检测到空间占用量大于当前的缓存总容量,则对元数据缓存队列进行淘汰,直至空间占用量不大于缓存总容量。

其中,缓存淘汰单元可以按照优先级由高到低的顺序,淘汰干净元数据队列中缓存的元数据。例如,按照从队列的队尾至队头的顺序淘汰干净元数据队列中缓存的元数据,其中,当副本元数据队列中剩余的副本元数据的数量小于预设门限值时,停止对副本元数据队列的淘汰。

在一些实施例中,缓存淘汰单元还可以用于:获取缓存的闲置空间量,以及当前的缓存总容量;判断闲置空间量与当前的缓存总容量之间的比例是否大于第一预设比例;若否,则对多个元数据缓存队列进行淘汰,直至闲置空间量与当前的缓存总容量之间的比例不小于第二预设比例,其中,第二预设比例不小于第一预设比例。

在一些实施例中,元数据缓存管理装置还包括:

容量调整单元,用于获取内存使用率;以及,根据内存使用率和预设容量阈值,调整缓存总容量,其中,缓存总容量与内存使用率成反比。

在该实施例中,可以预先配置预设容量阈值cmax,在元数据服务器的运行过程中,容量调整单元306根据负载情况,例如,内存使用率,动态地调整缓存总容量。例如,当元数据服务器的负载较重,系统资源(如内存)比较紧张,此时,容量调整单元306可以适当的降低元数据的缓存总容量。反之,当元数据服务器的负载较轻时,容量调整单元306可以适当增大元数据的缓存总容量,其中,缓存总容量是指允许缓存所占用的最大内存量。

在一些实施例中,将内存使用率u作为调整系数,可以按照如下公式计算缓存总容量ctotal,其中,内存使用率越大,则缓存总容量越小:

ctotal=(1-u)*cmax

假设脏元数据队列当前的空间占用量为cdirty,则干净元数据队列的缓存容量cclear=[(1-u)*cmax-cdirty]。

假设ki表示队列qi在干净元数据队列的缓存容量cclear中的预设容量比例。

则可以计算得到队列qi的缓存容量ci为:

ci=ki[(1-u)*cmax-cdirty],其中,i=1,2,3。

在一些实施例中,元数据缓存管理装置还可以包括:

数据复制单元,用于当检测到负载程度大于第一预设阈值时,根据元数据的访问统计数据确定热点属主元数据;

根据服务器节点拓扑图,从元数据服务器集群中选择负载程度小于第二预设阈值的元数据服务器,作为目标元数据服务器,其中,第二预设阈值小于第一预设阈值;

以及,将热点属主元数据复制到目标元数据服务器。

在一些实施例中,该数据复制单元还可以用于:

当接收到元数据服务器集群中其他元数据服务器发送的数据复制请求时,根据数据复制请求确定待复制的热点元数据;创建待复制的热点元数据的副本元数据,并存入副本元数据队列。

在一些实施例中,元数据缓存管理装置还包括:

缓存老化单元,用于获取当前的缓存总容量;根据缓存总容量和各元数据缓存队列的预设容量比例,计算各元数据缓存队列的容量上限,其中,元数据缓存队列的预设容量比例与对应的优先级成正比;按照优先级由高至低的顺序,将各元数据缓存队列中超出容量上限的元数据,存入比当前所在的元数据缓存队列优先级低的元数据缓存队列。

由于元数据访问的突发性和随机性,可能导致一些元数据长期处于优先级高的队列中不被淘汰。例如,属主元数据队列q3在缓存淘汰时的顺序靠后,即被淘汰的概率较小,一些很少被访问的属主元数据在被存入属主元数据队列q3之后,长期处于属主元数据队列q3中不被淘汰,而且访问频率很低,甚至存在存入属主元数据队列q3之后再也未被访问过的可能,导致存在缓存污染。该实施例中,为了解决这种缓存污染问题,可以对干净元数据队列进行老化处理,老化处理的本质在于降低元数据的优先级。

在一些实施例中,缓存淘汰单元还用于:获取多个元数据缓存队列的空间占用量,以及当前的缓存总容量;若空间占用量大于缓存总容量,则对多个元数据缓存队列进行淘汰,直至空间占用量不大于缓存总容量。

在一些实施例中,元数据缓存管理装置还包括:

数据倒盘单元,用于当检测到有属主元数据发生修改操作,则根据修改操作生成日志;将日志存储至日志片段;当检测到日志片段写满后,将日志片段上日志对应的元数据以父目录分片为单位更新至对象存储设备,以实现脏元数据倒盘。

具体实施时,以上各个单元可以作为独立的实体来实现,也可以进行任意组合,作为同一或若干个实体来实现,以上各个单元的具体实施可参见前面的方法实施例,在此不再赘述。

应当说明的是,本发明实施例提供的元数据缓存管理装置与上文实施例中的元数据缓存管理方法属于同一构思,在元数据缓存管理装置上可以运行元数据缓存管理方法实施例中提供的任一方法,其具体实现过程详见元数据缓存管理方法实施例。

本发明实施例还提供一种元数据服务器,请参阅图4,图4是本发明实施例提供的元数据服务器的结构示意图。具体来讲:

该元数据服务器可以包括一个或者一个以上处理核心的处理器401、一个或一个以上计算机可读存储介质的存储器402、电源403和输入单元404等部件。本领域技术人员可以理解,图4中示出的元数据服务器结构并不构成对元数据服务器的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中:

处理器401是该元数据服务器的控制中心,利用各种接口和线路连接整个元数据服务器的各个部分,通过运行或执行存储在存储器402内的软件程序和/或模块,以及调用存储在存储器402内的数据,执行元数据服务器的各种功能和处理数据,从而对元数据服务器进行整体监控。可选的,处理器401可包括一个或多个处理核心;优选的,处理器401可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器401中。

存储器402可用于存储软件程序以及模块,处理器401通过运行存储在存储器402的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器402可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据元数据服务器的使用所创建的数据等。此外,存储器402可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器402还可以包括存储器控制器,以提供处理器401对存储器402的访问。

元数据服务器还包括给各个部件供电的电源403,优选的,电源403可以通过电源管理系统与处理器401逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗管理等功能。电源403还可以包括一个或一个以上的直流或交流电源、再充电系统、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。

该元数据服务器还可包括输入单元404,该输入单元404可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。

尽管未示出,元数据服务器还可以包括显示单元等,在此不再赘述。具体在本实施例中,元数据服务器中的处理器401会按照如下的指令,将一个或一个以上的应用程序的进程对应的可执行文件加载到存储器402中,并由处理器401来运行存储在存储器402中的应用程序,从而实现各种功能,如下:

接收元数据访问请求,元数据访问请求携带有元数据标识;

根据元数据访问请求,从多个元数据缓存队列获取元数据标识对应的目标元数据,其中,多个元数据缓存队列具有不同的优先级;

确定目标元数据对应的数据类型;

基于数据类型、以及多个元数据缓存队列的优先级,从多个元数据缓存队列中确定目标元数据缓存队列,并将目标元数据存入目标元数据缓存队列的队头。

在一些实施例中,数据类型包括属主元数据和副本元数据;处理器401运行存储在存储器402中的应用程序,还可以实现如下功能:

当目标元数据为属主元数据时,根据多个元数据缓存队列的优先级从存储有属主元数据的元数据缓存队列中确定目标元数据缓存队列;

当目标元数据为副本元数据时,根据多个元数据缓存队列的优先级从存储有副本元数据的元数据缓存队列中确定目标元数据缓存队列。

在一些实施例中,多个元数据缓存队列分别为属主元数据队列、混合元数据队列和副本元数据队列,属主元数据队列存储有属主元数据,混合元数据队列存储有属主元数据和副本元数据,副本元数据队列存储有副本元数据;处理器401运行存储在存储器402中的应用程序,还可以实现如下功能:

将属主元数据队列作为目标元数据缓存队列,其中,属主元数据队列的优先级高于混合元数据队列的优先级;

将混合元数据队列作为目标元数据缓存队列,其中,混合元数据队列的优先级高于副本元数据队列的优先级。

在一些实施例中,处理器401运行存储在存储器402中的应用程序,还可以实现如下功能:

当从元数据缓存队列中获取不到目标元数据时,从元数据服务器集群中的其它元数据服务器获取目标元数据;

当获取到目标元数据时,创建目标元数据的副本元数据并存入副本元数据队列;

当获取不到目标元数据时,从对象存储设备中获取目标元数据,并将获取的目标元数据作为属主元数据,存入混合元数据队列。

在一些实施例中,数据类型包括属主元数据、副本元数据、干净元数据和脏元数据,多个元数据缓存队列分别为属主元数据队列、混合元数据队列、副本元数据队列、和脏元数据队列;处理器401运行存储在存储器402中的应用程序,还可以实现如下功能:

基于数据类型、以及多个元数据缓存队列的优先级,从多个元数据缓存队列中确定目标元数据缓存队列的步骤,包括:

当目标元数据为属主元数据、且为干净元数据时,将属主元数据队列作为目标元数据缓存队列,其中,属主元数据队列的优先级高于混合元数据队列的优先级;

当目标元数据为属主元数据、且为脏元数据时,将脏元数据队列作为目标元数据缓存队列;

当目标元数据为副本元数据时,将混合元数据队列作为目标元数据缓存队列,其中,混合元数据队列的优先级高于副本元数据队列的优先级。

在一些实施例中,处理器401运行存储在存储器402中的应用程序,还可以实现如下功能:

若检测到干净元数据队列中有属主元数据变脏,则将变脏的属主元数据由干净元数据队列移至脏元数据队列;

在变脏的属主元数据更新到对象存储设备后,将更新后的属主元数据存入混合元数据队列。

在一些实施例中,处理器401运行存储在存储器402中的应用程序,还可以实现如下功能:

检测元数据缓存队列中有否有处于闲置状态的属主元数据;

若有,则判断处于闲置状态的属主元数据对应的目录项中是否有待删除的文件;

若没有待删除的文件,则将处于闲置状态的属主元数据转换为目标元数据的副本元数据,并将转换得到的副本元数据移至当前所在元数据缓存队列的上一级元数据缓存队列的队头;

若有待删除的文件,则创建空状态的属主元数据,并将空状态的属主元数据存入混合元数据队列的队头;

将状态的属主元数据转换为目标元数据的副本元数据,并将转换得到的副本元数据移至副本元数据队列的队头。

在一些实施例中,处理器401运行存储在存储器402中的应用程序,还可以实现如下功能:

当接收到元数据服务器集群中其他元数据服务器发送的数据复制请求时,根据数据复制请求确定待复制的热点元数据;

创建待复制的热点元数据的副本元数据,并存入副本元数据队列的队头。

在一些实施例中,处理器401运行存储在存储器402中的应用程序,还可以实现如下功能:

获取多个元数据缓存队列的空间占用量,以及当前的缓存总容量;

若空间占用量大于缓存总容量,则对多个元数据缓存队列进行淘汰,直至空间占用量不大于缓存总容量。

在一些实施例中,处理器401运行存储在存储器402中的应用程序,还可以实现如下功能:

获取缓存的闲置空间量,以及当前的缓存总容量;

判断闲置空间量与当前的缓存总容量之间的比例是否大于第一预设比例;

若是,则执行从对象存储设备中获取目标元数据的步骤;

若否,则对多个元数据缓存队列进行淘汰,直至闲置空间量与当前的缓存总容量之间的比例不小于第二预设比例,其中,第二预设比例不小于第一预设比例。

在一些实施例中,处理器401运行存储在存储器402中的应用程序,还可以实现如下功能:

按照优先级由低到高的顺序,淘汰干净元数据队列中缓存的元数据。

在一些实施例中,处理器401运行存储在存储器402中的应用程序,还可以实现如下功能:

按照从队列的队尾至队头的顺序淘汰干净元数据队列中缓存的元数据,其中,当副本元数据队列中剩余的副本元数据的数量小于预设门限值时,停止对副本元数据队列的淘汰。

在一些实施例中,处理器401运行存储在存储器402中的应用程序,还可以实现如下功能:

获取内存使用率;

根据内存使用率和预设容量阈值,调整缓存总容量,其中,缓存总容量与内存使用率成反比。

在一些实施例中,处理器401运行存储在存储器402中的应用程序,还可以实现如下功能:

获取当前的缓存总容量;

根据缓存总容量和各元数据缓存队列的预设容量比例,计算各元数据缓存队列的容量上限,其中,元数据缓存队列的预设容量比例与对应的优先级成正比;

按照优先级由高至低的顺序,将各元数据缓存队列中超出容量上限的元数据,存入比当前所在的元数据缓存队列优先级低的元数据缓存队列。

本领域普通技术人员可以理解,上述实施例的各种方法中的全部或部分步骤可以通过指令来完成,或通过指令控制相关的硬件来完成,该指令可以存储于一计算机可读存储介质中,并由处理器进行加载和执行。

由上,本发明实施例提出的元数据服务器,当接收到元数据访问请求时,获取元数据访问请求中携带的元数据标识,根据元数据访问请求,从多个元数据缓存队列获取元数据标识对应的目标元数据,其中,多个元数据缓存队列具有不同的优先级;确定该目标元数据的数据类型,根据数据类型和各元数据缓存队列的优先级从多个元数据缓存队列中确定出目标元数据缓存队列,并将目标元数据存入目标元数据缓存队列的队头,本发明根据对元数据的访问情况,动态调整元数据在元数据缓存队列中的位置,使得访问相对频繁的元数据位于元数据缓存队列的队头,使得在缓存淘汰时,优先淘汰优先级低的元数据缓存队列,尽可能地保留访问频繁的元数据,减少从对象存储设备中取回元数据的情况,相对于使用单一lru队列对多种类型的元数据进行管理的方案而言,本方案进行元数据访问时,访问频繁的元数据具有更高的缓存命中率,进而提高了对元数据访问请求的响应速度,使得分布式文件系统具有较高的读写效率。

为此,本发明实施例提供一种存储介质,其中存储有多条指令,该指令能够被处理器进行加载,以执行本发明实施例所提供的任一种元数据缓存管理方法中。例如,该指令可以执行:

接收元数据访问请求,元数据访问请求携带有元数据标识;

根据元数据访问请求,从多个元数据缓存队列获取元数据标识对应的目标元数据,其中,多个元数据缓存队列具有不同的优先级;

确定目标元数据对应的数据类型;

基于数据类型、以及多个元数据缓存队列的优先级,从多个元数据缓存队列中确定目标元数据缓存队列,并将所述目标元数据存入所述目标元数据缓存队列的队头。

以上操作的具体实施可参见前面的实施例,在此不再赘述。

其中,该存储介质可以包括:只读存储器(rom,readonlymemory)、随机存取记忆体(ram,randomaccessmemory)、磁盘或光盘等。

由于该存储介质中所存储的指令,可以执行本发明实施例所提供的任一种元数据缓存管理方法,因此,可以实现本发明实施例所提供的任一种元数据缓存管理方法所能实现的有益效果,详见前面的实施例,在此不再赘述。以上对本发明实施例所提供的一种元数据缓存管理方法、装置及存储介质进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上,本说明书内容不应理解为对本发明的限制。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1