一种基于多级b+tree的元数据缓存淘汰方法
技术领域
本发明涉及数据缓存淘汰技术领域,尤其涉及一种基于多级b+tree的元数据缓存淘汰方法。
背景技术
在分布式存储系统中,常使用缓存作为数据读写访问的加速器,但由于内存的容量是远小于系统数据总量的,所以当缓存的数据量越来越多时,内存将会被写满,这时就需要进行缓存淘汰,即将一部分“不那么重要”的数据从内存中清除,为新的热点数据腾出缓存空间。
实际应用中,开源的分布式存储系统中元数据缓存的最小粒度仅基于obj树的叶子节点,相对应地,其缓存淘汰也仅基于单级的obj树,那么在obj树以下的层级,元数据就无法通过缓存命中,导致元数据访问的效率大大降低,从而会降低整个集群的性能。尤其是在多层级b+tree的元数据存储框架下,仅为obj树的叶子节点提供缓存是远远不够的,对应地,仅为obj树提供单级的缓存淘汰也是不合理且低效的。
因此,如何提供一种高效的多级缓存淘汰方法,成为亟待解决的技术问题。
发明内容
有鉴于此,为了克服现有技术的不足,本发明旨在提供一种基于多级b+tree的元数据缓存淘汰方法。
本发明提供一种基于多级b+tree的元数据缓存淘汰方法,包括:
步骤S1;通过设置缓存预设阈值,触发启动akey-lru上的缓存淘汰;
步骤S2:通过遍历和识别akey-lru上的akey node,对元数据缓存进行akey node级的正向淘汰;
步骤S3:通过反向指针对元数据缓存进行多级的反向淘汰。
进一步地,本发明基于多级b+tree的元数据缓存淘汰方法的步骤S1包括:设置元数据的缓存预设阈值,判断元数据缓存是否达到预设阈值,当元数据的缓存达到预设阈值,触发启动akey-lru上的缓存淘汰。
进一步地,本发明基于多级b+tree的元数据缓存淘汰方法的步骤S2包括:
从akey-lru的链尾开始对akey node进行遍历,识别akey node本身及其下层sv/ev树的sv/ev node是否存在脏节点;
当遍历的akey node本身及其下层sv/ev树的sv/ev node存在脏节点,跳过所述akey node继续从akey-lru的链尾向链头对下一个akey node进行识别;
当遍历的akey node本身及其下层sv/ev树的sv/ev node不存在脏节点,自上而下淘汰所述akey node下层sv/ev树的sv/ev node,并将所述akey node从akey-lru中淘汰。
进一步地,本发明基于多级b+tree的元数据缓存淘汰方法的步骤S3,包括:
通过反向指针找到步骤S2中被淘汰的akey node的父节点,判断所述akey node的父节点的子节点是否已全部被淘汰;
当所述akey node的父节点的子节点已全部被淘汰,通过所述子节点的反向指针淘汰akey node的父节点,所述akey node的父节点包括akey中间节点和akey根节点;
当所述akey node的父节点的子节点未全部被淘汰,重新判断元数据缓存是否达到预设阈值,当元数据的缓存到达预设阈值,触发启动akey-lru上的缓存淘汰。
进一步地,本发明基于多级b+tree的元数据缓存淘汰方法的步骤S3,包括:
通过反向指针找到被淘汰的akey根节点对应的dkey叶子节点,判断所述dkey叶子节点下所有的akey根节点是否已全部被淘汰;
当所述dkey叶子节点下所有的akey根节点已全部被淘汰,通过所述akey根节点的反向指针淘汰所述dkey叶子节点;
当所述dkey叶子节点下所有的akey根节点未全部被淘汰,重新判断元数据缓存是否达到预设阈值,当元数据的缓存到达预设阈值,触发启动akey-lru上的缓存淘汰。
进一步地,本发明基于多级b+tree的元数据缓存淘汰方法的步骤S3包括:
通过反向指针找到被淘汰的dkey叶子节点的父节点,判断所述dkey叶子节点的父节点的子节点是否已全部被淘汰;
当所述dkey叶子节点的父节点的子节点已全部被淘汰,通过所述子节点的反向指针淘汰所述dkey叶子节点的父节点,所述dkey叶子节点的父节点包括dkey中间节点和dkey根节点;
当所述dkey叶子节点的父节点的子节点未全部被淘汰,重新判断元数据的缓存是否达到预设阈值,当元数据缓存到达预设阈值,触发启动akey-lru上的缓存淘汰。
进一步地,本发明基于多级b+tree的元数据缓存淘汰方法的步骤S3,包括:
通过反向指针找到被淘汰的dkey根节点对应的obj叶子节点,判断所述obj叶子节点下所有的dkey根节点是否已全部被淘汰;
当所述obj叶子节点下所有的dkey根节点已全部被淘汰,通过所述dkey根节点的反向指针淘汰所述obj叶子节点;
当所述obj叶子节点下所有的dkey根节点未全部被淘汰,重新判断元数据缓存是否达到预设阈值,当元数据的缓存到达预设阈值,触发启动akey-lru上的缓存淘汰。
进一步地,本发明基于多级b+tree的元数据缓存淘汰方法的步骤S3包括:
通过反向指针找到被淘汰的obj叶子节点的父节点,判断所述obj叶子节点的父节点的子节点是否已全部被淘汰;
当所述obj叶子节点的父节点的子节点已全部被淘汰,将所述obj叶子节点的父节点淘汰,所述obj叶子节点的父节点包括obj中间节点和obj根节点;
当所述obj叶子节点的父节点的子节点未全部被淘汰,重新判断元数据的缓存是否达到预设阈值,当元数据缓存到达预设阈值,触发启动akey-lru上的缓存淘汰。
其次,本发明提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被执行时,执行上述的方法。
最后,本发明提供一种计算机设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述程序时实现上述方法的步骤。
本发明基于多级b+tree的元数据缓存淘汰方法,具有以下有益效果:
1.通过反向指针对元数据缓存进行多级的反向淘汰,提高数据缓存的淘汰效率。
2.通过一个LRU链表实现多级树的淘汰,实现复杂度低。
3.可以在有效提高热点元数据命中率的同时能及时通过缓存淘汰释放系统资源,从而提高集群的性能。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1为对象(obj)元数据以多层级b+树(即b+tree)的形式存储的示意图。
图2为本发明对元数据缓存进行akey node级的正向淘汰的示意图。
图3为本发明通过反向指针对元数据缓存进行多级的反向淘汰的示意图。
图4为本发明示例性第一实施例的一种基于多级b+tree的元数据缓存淘汰方法的流程图。
图5为本发明示例性第二实施例的一种基于多级b+tree的元数据缓存淘汰方法的流程图。
具体实施方式
下面结合附图对本发明实施例进行详细描述。
需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合;并且,基于本公开中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。
需要说明的是,下文描述在所附权利要求书的范围内的实施例的各种方面。应显而易见,本文中所描述的方面可体现于广泛多种形式中,且本文中所描述的任何特定结构及/或功能仅为说明性的。基于本公开,所属领域的技术人员应了解,本文中所描述的一个方面可与任何其它方面独立地实施,且可以各种方式组合这些方面中的两者或两者以上。举例来说,可使用本文中所阐述的任何数目个方面来实施设备及/或实践方法。另外,可使用除了本文中所阐述的方面中的一或多者之外的其它结构及/或功能性实施此设备及/或实践此方法。
本发明的技术原理如下:
如图1所示,对象(obj)元数据是以多层级b+树的形式存储的,从上层级树到下层级树依次为:obj tree、dkey tree、akey tree、sv/ev tree。将整个元数据层级树通过缓存来存储,可以有效提高元数据的访问效率,但另一方面系统缓存是有限的,系统缓存不能被无限占用。
如图2所示,本发明提出了一种以akey tree叶子节点为LRU淘汰管理单元的缓存淘汰方法。综合考虑方案实现复杂性以及LRU管理元数据的高效性,选择akey tree的叶子节点为多层级b+tree唯一的LRU淘汰管理单元。LRU是一种最近最少使用算法,其原则是如果元数据最近被访问过,那么将来被访问的几率也更高。因此,新访问的元数据会插入到akey-lru链表的头部;缓存命中(即akey-lru链表上的元数据被访问)时,元数据会重新移动到链表头部;而当元数据缓存达到阈值时,则会从akey-lru链表尾部启动淘汰。当识别到akey-lru上的某个akey node可以被淘汰时,先将该akey node下层级所有的sv/ev tree都从缓存树上淘汰,释放sv/ev tree元数据所占用的缓存空间,使元数据缓存空间能尽快的低于所设阈值,这里就是以akey-lru为核心自上而下正向的元数据缓存淘汰。
如图3所示,当完成以akey-lru为核心自上而下正向的元数据缓存淘汰后,我们开始进行以akey-lru为核心自下而上反向的元数据缓存淘汰识别,其思想是每个节点记录一个指向其父节点的反向指针,使多层级b+tree可以进行反向遍历,从而大大提高自下而上反向淘汰的效率。
在多级b+tree的框架下,以akey树的叶子节点作为缓存淘汰的核心结构,其本身使用LRU链表进行管理,并根据lru算法实现淘汰,同时围绕其进行向上层树结构的反向淘汰(akey→dkey→obj)以及向下层树结构的正向淘汰(akey→sv/ev)。本发明的缓存淘汰的效率高、实现复杂度低,能够在多级b+tree的缓存框架下有效的淘汰长时间未访问的元数据,而保留最近访问的热点元数据。
图4为根据本发明示例性第一实施例的一种基于多级b+tree的元数据缓存淘汰方法的流程图,如图4所示,本实施例的方法,包括:
步骤S1;通过设置缓存预设阈值,触发启动akey-lru上的缓存淘汰;
步骤S2:通过遍历和识别akey-lru上的akey node,对元数据缓存进行akey node级的正向淘汰;
步骤S3:通过反向指针对元数据缓存进行多级的反向淘汰。
图5为根据本发明示例性第二实施例的一种基于多级b+tree的元数据缓存淘汰方法的流程图。
本实施例是图4所示方法的优选实施例,如图5所示,本实施例方法按以下方式执行:
设置元数据的缓存预设阈值,判断元数据缓存是否达到预设阈值,当元数据的缓存达到预设阈值,触发启动akey-lru上的缓存淘汰;
从akey-lru的链尾开始对akey node进行遍历,识别akey node本身及其下层sv/ev树的sv/ev node是否存在脏节点;
当遍历的akey node本身及其下层sv/ev树的sv/ev node存在脏节点,跳过所述akey node继续从akey-lru的链尾向链头对下一个akey node进行识别;
当遍历的akey node本身及其下层sv/ev树的sv/ev node不存在脏节点,自上而下淘汰所述akey node下层sv/ev树的sv/ev node,并将所述akey node从akey-lru中淘汰。
通过反向指针找到步骤S2中被淘汰的akey node的父节点,判断所述akey node的父节点的子节点是否已全部被淘汰;
当所述akey node的父节点的子节点已全部被淘汰,通过所述子节点的反向指针淘汰akey node的父节点,所述akey node的父节点包括akey中间节点和akey根节点;
当所述akey node的父节点的子节点未全部被淘汰,重新判断元数据缓存是否达到预设阈值,当元数据的缓存到达预设阈值,触发启动akey-lru上的缓存淘汰。
通过反向指针找到被淘汰的akey根节点对应的dkey叶子节点,判断所述dkey叶子节点下所有的akey根节点是否已全部被淘汰;
当所述dkey叶子节点下所有的akey根节点已全部被淘汰,通过所述akey根节点的反向指针淘汰所述dkey叶子节点;
当所述dkey叶子节点下所有的akey根节点未全部被淘汰,重新判断元数据缓存是否达到预设阈值,当元数据的缓存到达预设阈值,触发启动akey-lru上的缓存淘汰。
通过反向指针找到被淘汰的dkey叶子节点的父节点,判断所述dkey叶子节点的父节点的子节点是否已全部被淘汰;
当所述dkey叶子节点的父节点的子节点已全部被淘汰,通过所述子节点的反向指针淘汰所述dkey叶子节点的父节点,所述dkey叶子节点的父节点包括dkey中间节点和dkey根节点;
当所述dkey叶子节点的父节点的子节点未全部被淘汰,重新判断元数据的缓存是否达到预设阈值,当元数据缓存到达预设阈值,触发启动akey-lru上的缓存淘汰。
通过反向指针找到被淘汰的dkey根节点对应的obj叶子节点,判断所述obj叶子节点下所有的dkey根节点是否已全部被淘汰;
当所述obj叶子节点下所有的dkey根节点已全部被淘汰,通过所述dkey根节点的反向指针淘汰所述obj叶子节点;
当所述obj叶子节点下所有的dkey根节点未全部被淘汰,重新判断元数据缓存是否达到预设阈值,当元数据的缓存到达预设阈值,触发启动akey-lru上的缓存淘汰。
通过反向指针找到被淘汰的obj叶子节点的父节点,判断所述obj叶子节点的父节点的子节点是否已全部被淘汰;
当所述obj叶子节点的父节点的子节点已全部被淘汰,将所述obj叶子节点的父节点淘汰,所述obj叶子节点的父节点包括obj中间节点和obj根节点;
当所述obj叶子节点的父节点的子节点未全部被淘汰,重新判断元数据的缓存是否达到预设阈值,当元数据缓存到达预设阈值,触发启动akey-lru上的缓存淘汰。
其次,本发明提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被执行时,执行上述的方法。
最后,本发明提供一种计算机设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述程序时实现上述方法的步骤。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。