CN116821058A - 元数据访问方法、装置、设备及存储介质 - Google Patents

元数据访问方法、装置、设备及存储介质 Download PDF

Info

Publication number
CN116821058A
CN116821058A CN202311086103.XA CN202311086103A CN116821058A CN 116821058 A CN116821058 A CN 116821058A CN 202311086103 A CN202311086103 A CN 202311086103A CN 116821058 A CN116821058 A CN 116821058A
Authority
CN
China
Prior art keywords
target
metadata
cache
file
description array
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN202311086103.XA
Other languages
English (en)
Other versions
CN116821058B (zh
Inventor
冯晓艳
潘安群
雷海林
伍鑫
林子彦
赵阳
陈再妮
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN202311086103.XA priority Critical patent/CN116821058B/zh
Publication of CN116821058A publication Critical patent/CN116821058A/zh
Application granted granted Critical
Publication of CN116821058B publication Critical patent/CN116821058B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本申请公开了一种元数据访问方法、装置、设备及存储介质,涉及云技术领域,该方法采用了元数据全局缓存的方案,该缓存方案为全局缓存文件‑缓存描述数组‑内存块三层架构,且在共享内存中可以按照元数据的数据长度划分存储区域,则当目标进程需要获取目标元数据时,则可以按照上述的三层架构逐层往下查询,直至获得已缓存的目标元数据的目标地址信息,并将目标地址信息返回给目标进程,实现目标元数据的访问,这样一来,对于所有的工作进程而言,都可以按照该方法访问到自身所需的元数据,从而无需自行维护自己的元数据缓存,降低工作进程之间重复元数据缓存,降低了占用的内存资源,同时也减少了重复元数据的传输资源占用,提升了资源利用率。

Description

元数据访问方法、装置、设备及存储介质
技术领域
本申请涉及计算机技术领域,尤其涉及云技术(Cloud technology)领域,提供一种元数据访问方法、装置、设备及存储介质。
背景技术
随着云技术的发展,云计算已成为企业应用的新标准,云原生架构为在云中开发、部署和管理应用程序提供了高效的方式,经过不断的实践和探索,云原生模式已经逐渐被认可成为构建和部署云原生应用程序的最佳实践。云原生数据库是一种云原生数据基础设施,通过资源解耦和资源池化等技术,具备了高弹性、高可用性、可扩展性等特点,支撑了不同业务领域的应用对数据管理高性能、高并发和按需使用的需求。
在云原生模式下,计算集群上不存储元数据(Metadata),当需要使用元数据时,则需要从元数据服务器请求获取,因此,为了降低元数据请求的频次,则需要在计算集群中维护元数据缓存。
但是,目前采用的缓存方案是计算集群上的各个工作进程各自维护自身的一套本地缓存,导致各个工作进程都需要向元数据服务器请求获取元数据,存在相同的元数据被重复获取且重复缓存的情况,重复占用传输资源以及内存资源,降低了资源利用率。
发明内容
本申请实施例提供一种元数据访问方法、装置、设备及存储介质,用于降低元数据缓存占用的重复资源,提升资源利用率。
一方面,提供一种元数据访问方法,该方法包括:
响应于目标进程的元数据查询请求,基于所述元数据查询请求携带的目标元数据的目标索引信息,对全局缓存文件进行匹配操作;其中,所述全局缓存文件包括至少一条记录,每条记录包括:已缓存的元数据的索引信息,以及相应的元数据对应的缓存描述数组的槽位标识,每个缓存描述数组对应至少一个用于缓存元数据的内存块;
在匹配成功时,基于所述目标索引信息关联的目标槽位标识,访问所述目标元数据对应的目标缓存描述数组;
基于所述目标缓存描述数组,确定所述目标元数据当前为有效状态时,从所述目标缓存描述数组中,获得缓存所述目标元数据的目标内存块的目标地址信息;其中,所述目标地址信息用于指示所述目标内存块在共享内存中的位置信息,所述共享内存按照不同的数据长度划分元数据的存储区域;
将所述目标地址信息返回给所述目标进程。
一方面,提供一种元数据访问装置,所述装置包括:
全局匹配单元,用于响应于目标进程的元数据查询请求,基于所述元数据查询请求携带的目标元数据的目标索引信息,对全局缓存文件进行匹配操作;其中,所述全局缓存文件包括至少一条记录,每条记录包括:已缓存的元数据的索引信息,以及相应的元数据对应的缓存描述数组的槽位标识,每个缓存描述数组对应至少一个用于缓存元数据的内存块;
数组访问单元,用于在匹配成功时,基于所述目标索引信息关联的目标槽位标识,访问所述目标元数据对应的目标缓存描述数组;
地址获得单元,用于基于所述目标缓存描述数组,确定所述目标元数据当前为有效状态时,从所述目标缓存描述数组中,获得缓存所述目标元数据的目标内存块的目标地址信息;其中,所述目标地址信息用于指示所述目标内存块在共享内存中的位置信息,所述共享内存按照不同的数据长度划分元数据的存储区域;以及,将所述目标地址信息返回给所述目标进程。
一方面,提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述任一种方法的步骤。
一方面,提供一种计算机存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述任一种方法的步骤。
一方面,提供一种计算机程序产品,该计算机程序产品包括计算机程序,该计算机程序存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机程序,处理器执行该计算机程序,使得该计算机设备执行上述任一种方法的步骤。
本申请实施例中,采用了元数据全局缓存的方案,在该缓存方案中,采用了全局缓存文件-缓存描述数组-内存块三层架构,全局缓存文件用于存储已经缓存的元数据的索引信息以及相应缓存描述数组的槽位标识,以索引到下层的缓存描述数组,缓存描述数组用于存储元数据的缓存相关的描述信息,内存块用于实际缓存元数据。则当目标进程需要获取目标元数据时,则可以按照上述的三层架构逐层往下查询,直至获得已缓存的目标元数据的目标地址信息,并将目标地址信息返回给目标进程,实现目标元数据的访问,这样一来,对于所有的工作进程而言,都可以按照该方法访问到自身所需的元数据,从而无需自行维护自己的元数据缓存,降低工作进程之间重复元数据缓存,降低了占用的内存资源,同时也减少了重复元数据的传输资源占用,提升了资源利用率。
附图说明
为了更清楚地说明本申请实施例或相关技术中的技术方案,下面将对实施例或相关技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请实施例提供的应用场景示意图;
图2为本申请实施例提供的元数据访问相关的架构示意图;
图3为本申请实施例提供的元数据访问方法的流程示意图;
图4为本申请实施例提供的匹配过程示意图;
图5为本申请实施例提供的比较过程示意图;
图6为本申请实施例提供的文件描述数组集合示意图;
图7为本申请实施例提供的全局缓存文件的分区示意图;
图8为本申请实施例提供的元数据访问的一种示例流程示意图;
图9为本申请实施例提供的元数据访问方法的另一流程示意图;
图10为本申请实施例提供的空闲内存列表的示意图;
图11A和图11B为本申请实施例提供的元数据访问的另一种示例流程示意图;
图12为本申请实施例提供的元数据访问方法的又一流程示意图;
图13A和图13B为本申请实施例提供的元数据访问的又一种示例流程示意图;
图14为本申请实施例提供的元数据访问装置的一种结构示意图;
图15为本申请实施例提供的计算装置的组成结构示意图;
图16为应用本申请实施例的另一种计算装置的组成结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚明白,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
可以理解的是,在本申请的下述具体实施方式中,可能涉及到用户数据,例如用户语音数据,则当本申请的各实施例运用到具体产品或技术中时,需要获得相关许可或者同意,且相关数据的收集、使用和处理需要遵守相关国家和地区的相关法律法规和标准。
为便于理解本申请实施例提供的技术方案,这里先对本申请实施例使用的一些关键名词进行解释:
元数据:元数据是关于数据的组织、数据域及其关系的信息,简单来说,元数据就是被用来描述数据的数据,包含了对数据及信息资源的描述性信息。例如是指用于管理业务对象存储数据的元信息。任何文件***中的数据分为数据和元数据。数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的***数据,诸如访问权限、文件拥有者以及文件数据块的分布信息(inode...)等等。在集群文件***中,分布信息包括文件在磁盘上的位置以及磁盘在集群中的位置。业务对象需要操作一个文件必须首先得到它的元数据,才能定位到文件的位置并且得到文件的内容或相关属性。在本申请实施例中,元数据包含但不限于如:数据集合的名称、各类功能属性设置、数据副本Replica存放的地址等。
全局(global)缓存文件:global缓存是指计算集群上工作进程之间共享的元数据缓存,各个工作进程通过一定的机制共同维护同一套元数据缓存,能够有效的合并不同工作进程之间对于同一个元数据的请求,避免频繁去元数据服务器请求数据。
数据库定义语言(Data Definition Language,DDL):是结构化查询语言(Structured Query Language,SQL)集中负责数据结构定义与数据库对象定义的语言,通常由创建(CREATE)、修改(ALTER)与删除(DROP)三种操作语法所组成。
本申请实施例涉及到云技术,主要基于云技术中元数据缓存而设计。
云技术是指在广域网或局域网内将硬件、软件、网络等系列资源统一起来,实现数据的计算、储存、处理和共享的一种托管技术,云技术基于云计算商业模式应用的网络技术、信息技术、整合技术、管理平台技术、应用技术等的总称,可以组成资源池,按需所用,灵活便利。云计算技术将变成重要支撑。技术网络***的后台服务需要大量的计算、存储资源,如视频网站、图片类网站和更多的门户网站。伴随着互联网行业的高度发展和应用,将来每个物品都有可能存在自己的识别标志,都需要传输到后台***进行逻辑处理,不同程度级别的数据将会分开处理,各类行业数据皆需要强大的***后盾支撑,只能通过云计算来实现。
随着云技术的发展,云技术通常可以结合其他技术来实施,例如常应用于人工智能(Artificial Intelligence)技术领域中。人工智能是利用数字计算机或者数字计算机控制的机器模拟、延伸和扩展人的智能,感知环境、获取知识并使用知识获得最佳结果的理论、方法、技术及应用***。换句话说,人工智能是计算机科学的一个综合技术,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器。人工智能也就是研究各种智能机器的设计原理与实现方法,使机器具有感知、推理与决策的功能。
人工智能技术是一门综合学科,涉及领域广泛,既有硬件层面的技术也有软件层面的技术。人工智能基础技术一般包括如传感器、专用人工智能芯片、云计算(CloudComputing)、分布式存储、大数据处理技术、预训练模型技术、操作/交互***、机电一体化等。因此,在AI技术的实施往往伴随着云技术的应用,例如往往依赖于云计算、云存储(Cloud Storage)以及数据库(Database)等技术来实现。
云计算是一种计算模式,它将计算任务分布在大量计算机构成的资源池上,使各种应用***能够根据需要获取计算力、存储空间和信息服务。提供资源的网络被称为“云”。“云”中的资源在使用者看来是可以无限扩展的,并且可以随时获取,按需使用,随时扩展,按使用付费。
作为云计算的基础能力提供商,会建立云计算资源池(简称云平台,一般称为IaaS(Infrastructure as a Service,基础设施即服务)平台,在资源池中部署多种类型的虚拟资源,供外部客户选择使用。云计算资源池中主要包括:计算设备(为虚拟化机器,包含操作***)、存储设备、网络设备。
按照逻辑功能划分,在基础设施即服务(Infrastructure as a Service,IaaS)层上可以部署平台即服务(Platform as a Service,PaaS)层,PaaS层之上再部署软件即服务(Software as a Service,SaaS),也可以直接将SaaS部署在IaaS上。PaaS为软件运行的平台,如数据库、web容器等。SaaS为各式各样的业务软件,如web门户网站、***器等。一般来说,SaaS和PaaS相对于IaaS是上层。
云存储是在云计算概念上延伸和发展出来的一个新的概念,分布式云存储***(以下简称存储***)是指通过集群应用、网格技术以及分布存储文件***等功能,将网络中大量各种不同类型的存储设备(存储设备也称之为存储节点)通过应用软件或应用接口集合起来协同工作,共同对外提供数据存储和业务访问功能的一个存储***。
数据库,简而言之可视为电子化的文件柜,存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。所谓“数据库”是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。
本申请实施例涉及到云原生模式下元数据的缓存方案,元数据指用来描述一个文件的特征的***数据,诸如访问权限、文件拥有者以及文件数据块的分布信息等等。例如,在集群文件***中,分布信息包括文件在磁盘上的位置以及磁盘在集群中的位置。业务对象需要操作一个文件必须首先得到它的元数据,才能定位到文件的位置并且得到文件的内容或相关属性。通常而言,云原生数据库,在计算集群上不存储元数据信息,需要从元数据服务器请求需要的元数据,为了降低请求的频次,则需要在计算集群中维护元数据缓存。
相关技术中,通常采用的元数据缓存方案为Postgresql(PG)缓存方案,在该方案中,由执行查询(query)的工作进程自己维护一套本地元数据缓存,当元数据过期时,向元数据服务器请求新的元数据,这样一来,计算集群中各个工作进程都需要向元数据服务器请求获取元数据,相同的元数据存在需要重复获取的情况,不仅相同的元数据需要重复占用传输资源,且在计算集群中也会占用内存资源进行重复存储,显然大大降低了资源利用率。
此外,当执行DDL操作时,会将发生变更的元数据组织成一套失效消息,发送给其他工作进程。那么,按照PG缓存方案,则需要将所有工作进程的所有缓存都失效掉,则发生DDL操作时,则需要向这些工作进程均下发失效消息,显然也占用了更多的传输资源,且一个数据失效就失效所有的元数据缓存,显然会消耗更多的资源去进行新的元数据缓存,产生资源浪费。
基于此,本申请实施例提供了一种元数据访问方法,在该方法中,采用了一种全新的元数据全局缓存的方案,在该缓存方案中,采用了全局缓存文件-缓存描述数组-内存块三层架构,全局缓存文件用于存储已经缓存的元数据的索引信息以及相应缓存描述数组的槽位标识,以索引到下层的缓存描述数组,缓存描述数组用于存储元数据的缓存相关的描述信息,内存块用于实际缓存元数据。
那么,当目标进程需要获取目标元数据时,则基于其元数据查询请求携带的目标索引信息,在全局缓存文件中进行匹配,若是能够匹配成功,则表明已经缓存了目标元数据,则通过目标索引信息关联的目标槽位标识,访问目标缓存描述数组,确认目标元数据当前为有效状态时,从目标缓存描述数组中,获得缓存目标元数据的目标内存块的目标地址信息,并将目标地址信息返回给目标进程,实现目标元数据的访问。可见,按照上述的三层架构逐层往下查询,直至获得已缓存的目标元数据的目标地址信息,即可实现目标元数据的访问,这样一来,对于所有的工作进程而言,都可以按照该方法访问到自身所需的元数据,从而无需自行维护自己的元数据缓存,降低工作进程之间重复元数据缓存,降低了占用的内存资源,同时,降低计算集群对元数据服务器请求的次数,合并工作进程重复的数据请求,从而减少了重复元数据的传输资源占用,提升了资源利用率。
此外,本申请实施例中,通过对元数据进行分区,且分区对应着相应的分区版本信息,则当发生DDL操作时,则无需全部元数据缓存进行更新,而是更新部分元数据即可,并通过版本信息以及版本信息的验证来描述元数据的数据状态是否有效,避免了一个数据失效就失效所有的元数据缓存,降低了资源浪费程度。
本申请实施例中针对元数据缓存中涉及到的各种情况均进行了全套的访问流程设计,包括访问的元数据已缓存、未缓存以及需要数据置换等情况,满足了多种情况下各个工作进程的元数据全局访问需求,有效合并了不同工作进程之间对于同一个元数据信息的请求,之后将一些加锁可以保护的信息放入本地缓存,可以有效避免因为lease失效导致频繁去元数据服务器请求数据。
下面对本申请实施例的技术方案能够适用的应用场景做一些简单介绍,需要说明的是,以下介绍的应用场景仅用于说明本申请实施例而非限定。在具体实施过程中,可以根据实际需要灵活地应用本申请实施例提供的技术方案。
本申请实施例提供的方案可以适用于计算集群场景中,比如适用于采用云原生模式以及非云原生模式下的计算集群场景中。如图1所示,为本申请实施例提供的一种应用场景示意图该场景中可以包括元数据服务器101和计算设备集合102。
在一种可能的实施方式中,计算设备集合102可以为计算集群。
元数据服务器101用于元数据的存储,其可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式***,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、即内容分发网络(Content Delivery Network,CDN)、以及大数据和人工智能平台等基础云计算服务的云端服务器,但并不局限于此。
计算集群用于实际计算或者应用的部署,计算集群可以包括多个计算节点,每个计算节点可以用于基于用户的部署请求,部署用户的计算任务或者应用等。每个计算节点可以为物理服务器,也可以为手机、平板电脑(PAD)、笔记本电脑、台式电脑、智能电视、智能车载设备、智能可穿戴设备、智能电视以及飞行器等任意具备一定计算能力的计算机设备。
需要说明的是,本申请实施例中的元数据访问方法可以由计算集群中的计算节点来执行。其中,计算节点可以包括一个或多个处理器、存储器以及与交互I/O接口等,计算节点的存储器中可以存储本申请实施例提供的元数据访问方法中各自所需执行的程序指令,这些程序指令被处理器执行时能够用以实现本申请实施例提供的元数据访问过程。
示例性的,在计算节点上的目标进程需要访问目标元数据时,则可以基于其元数据查询请求携带的目标索引信息,在全局缓存文件中进行匹配,若是能够匹配成功,则表明已经缓存了目标元数据,则通过目标索引信息关联的目标槽位标识,访问目标缓存描述数组,确认目标元数据当前为有效状态时,从目标缓存描述数组中,获得缓存目标元数据的目标内存块的目标地址信息,并将目标地址信息返回给目标进程,实现目标元数据的访问。
在一种可能的实施方式中,计算设备集合102可以为终端设备集合。其中,终端设备集合可以包括多个终端设备,每个终端设备可以为一个租户的设备,在多租户架构下,所有租户都有自己的元数据,租户相关的所有操作都离不开通过元数据进行驱动。在元数据使用过程中,终端设备每一次使用时,都要从数据库中进行查询和计算。因此,为了减少元数据请求的频次,则终端设备中可以采用本申请实施例的方法维护一套全局元数据缓存,当需要元数据时,则可以从本地缓存中进行查询。
本申请实施例中,元数据服务器101和计算设备集合102之间可以通过一个或者多个网络103进行直接或间接的通信连接。该网络103可以是有线网络,也可以是无线网络,例如无线网络可以是移动蜂窝网络,或者可以是无线保真(Wireless-Fidelity,WIFI)网络,当然还可以是其他可能的网络,本申请实施例对此不做限制。
下面,结合上述描述的应用场景,参考附图来描述本申请示例性实施方式提供的方法,需要注意的是,上述应用场景仅是为了便于理解本申请的精神和原理而示出,本申请的实施方式在此方面不受任何限制。
参见图2所示,为本申请实施例提供的元数据访问相关的架构示意图,其中,以计算集群为例,其上可以部署有多个工作进程,即图2所示的工作进程1~N,多个工作进程共享一套元数据全局缓存,元数据全局缓存采用了如图2所示的全局缓存数据结构,该数据结构由如下几部分组成:
(1)全局缓存文件
全局缓存文件用于记录全局缓存信息,即表征缓存了哪些元数据。参见图2所示,全局缓存文件中可以包括多个记录位置,如图2所示的记录位置1~记录位置M,每个记录位置可以用于存储至少一条记录,每一条记录可以用于存储至少一个元数据相关的索引信息以及该元数据相关的缓存描述数组的槽位标识,因此,在需要查询目标元数据时,可以通过查询全局缓存文件中是否包含了相应的索引信息,如果匹配成功,则获得其关联的槽位标识,继续往下查询。
在一种可能的实施方式中,全局缓存文件可以采用哈希表(hash table)的方式实现,hash table中的每个表项(entry)可以用于存储一条记录。
(2)缓存描述数组(cache desc)
参见图2所示,数据结构的第二层为缓存描述数组集合,其包含了多个槽位,如图2所示的槽位1~槽位K,那每个槽位可以用于存储一个或者多个缓存描述数组,缓存描述数组包含了缓存元数据的控制信息,描述对应的内存块使用情况,以及元数据信息对应的内存偏移等信息。
其中,在全局缓存文件中的每一条记录都会唯一指向一个缓存描述数组的槽位标识,从而在全局缓存文件中匹配成功时,则可以找到相应的目标元数据的缓存描述信息的槽位标识,从而访问该槽位标识对应的缓存描述数组,如图2中所示,找到的槽位标识为“id=0”,其指向的是第一个槽位,则表明当前需要的目标元数据的缓存描述数组存储于该槽位,访问该槽位的缓存描述数组即可获得目标元数据的相关信息。
(3)连续内存
连续内存用于缓存从元数据服务器拿到的元数据,因为元数据的值(value)的数据长度不一,则可以将连续内存按照数据长度上限的不同进行内存块的划分,不同大小的内存块可以用于存储不同数据长度的元数据。例如,可以按照128、256、512、1024、2048、4096、8192字节来划分内存,在使用时按需使用,各个大小的内存的占比比例可以依据常用元数据长度比例进行设置。当需要缓存元数据时,则可以远程调用元数据服务器获取相应的元数据,并缓存至自身缓存中,以便于后续直接本地查询获取。
参见图2所示的全局缓存数据结构,在hash table中会根据匹配的元数据的索引信息找到对应desc的下标,根据下标就可以映射到内存中的地址信息,获取相应的元数据,内存中缓存的元数据来自元数据服务器。
基于上述全局缓存数据结构,本申请实施例提供了一种元数据访问方法,参见图3所示,为本申请实施例提供的元数据访问方法的流程示意图,该方法可以由计算机设备执行,该计算机设备可以是图1所提及的终端设备或计算节点。其中,该方法的具体实施流程如下:
步骤301:响应于目标进程的元数据查询请求,基于元数据查询请求携带的目标元数据的目标索引信息,对全局缓存文件进行匹配操作。
本申请实施例中,如图2所示,全局缓存文件中包括至少一条记录,每条记录包括:已缓存的元数据的索引信息,以及相应的元数据对应的缓存描述数组的槽位标识,每个缓存描述数组对应至少一个用于缓存元数据的内存块。
在一种可能的实施方式中,本申请实施例中的元数据访问的过程可以由各个工作进程自身来执行,即各个工作进程需要某个目标元数据时,则可以通过执行本申请实施例所提供的元数据访问方法来得到相应的目标元数据。
在一种可能的实施方式中,还可以在每个计算机设备中增加代理(proxy)进程,用于实现元数据访问过程,则各个工作进程可以通过调用proxy进程的方式实现元数据的访问。这样一来,各个工作进程维护本地的元数据缓存,都可以通过该proxy进程来实现,从而当存在重复的元数据请求时,proxy进程可以合并多个工作进程重复的元数据请求,减少资源浪费。
在一种可能的实施方式中,本申请实施例的过程也可以是各个工作进程和proxy进程合作进行的。例如,工作进程自身可以执行元数据访问的过程,proxy进程可以实现元数据缓存维护相关的工作。当然,在实际应用时,可以根据具体的需求进行设置,本申请实施例对此不做限制。
具体的,当目标进程需要使用目标元数据时,则目标进程可以发起元数据查询请求,该元数据查询请求携带了待查询的目标元数据的目标索引信息,由于全局缓存文件中存储了已经缓存的元数据的索引信息,则通过将目标索引信息与其进行匹配,则可以确定当前本地是否已经缓存了目标元数据。
其中,元数据通常是通过元数据文件进行存储的,例如对于常见的数据库而言,元数据可以采用元数据表的方式进行存储,因为元数据服务不同的表有不同的唯一索引,根据这些信息维护了一个元数据文件标识,可以称为cacheid,一个cacheid唯一对应一个元数据文件,每个元数据文件中可以包含多个数据列,不同的数据列通过不同的列的索引值进行标识,称之为key。
则目标进程在进行元数据查询时,传入的目标索引信息可以包括元数据文件标识cacheid和目标元数据在元数据文件中对应的数据列索引值key,则在进行匹配时,则需要基于cacheid和key的具体值进行匹配,当二者均匹配命中时,才能够认为匹配成功。
在一种可能的实施方式中,全局缓存文件可以采用hash table的方式来实现,hash table又可以称为散列表,是根据关键码值(Key value)而直接进行访问的数据结构,即通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数,存放记录的数组叫做散列表。
进而,本申请实施例中,对于hash table的维护过程,也就是缓存目标元数据时,是通过将传入的目标索引信息中的数据列索引值key通过一定的目标映射方法,计算得到相应的散列标识hash value,并将hash value+cacheid作为hash key,进而在hash key对应的entry中存入上述的目标索引信息以及散列标识,即存入cache id、hashvalue以及索引列key的具体值。
那么,在进行查询时,参见图4所示,为本申请实施例提供的匹配过程示意图,匹配的过程与上述存储记录的过程是类似的,即首先基于传入的目标索引信息中的数据列索引值key,按照目标映射方法,生成相应的散列标识hash value,并基于散列标识hash value与元数据文件标识cacheid,生成目标元数据对应的查询记录标识hash key,通过hash key则可以从hash table定位相应的记录位置,从而从全局缓存文件中确定出目标元数据所对应的目标记录,最后将各项信息逐一与该目标记录中的对应值进行匹配,这是考虑上述过程计算的hash key可能存在hash碰撞的情况,同一个hash value对应位置上可能存储多个记录,因而避免匹配错误,则需要进一步的核对各项信息是否有误。例如,如图4所示,根据hash key确定目标元数据的目标记录存储在记录位置3时,则并将元数据文件标识cacheid、数据列索引值key以及散列标识hashvalue,分别与目标记录包括的对应值进行匹配。
在一种可能的实施方式中,参见图5所示,为本申请实施例提供的比较过程示意图,其中,在进行目标记录与传入的目标索引信息的对比时,可以先对比元数据文件标识cacheid,即对传入的元数据文件标识1(cacheid 1)与目标记录中的元数据文件标识2(cacheid 2)(这里的1和2用于指代不同的名称,并不限定二者实际值的不同)进行比较,确定cacheid是否命中,若未命中,则匹配失败,若命中,则继续对比散列标识hashvalue,即对传入的数据列索引值key计算得到的散列标识1(hashvalue 1)与目标记录中的散列标识2(hashvalue 2)进行比较,确定hashvalue是否命中,若未命中,则匹配失败,若命中,则继续对比数据列索引值key的值,即对传入的数据列索引值1(key 1)与目标记录中的数据列索引值2(key 2)进行比较,确定key是否命中,若未命中,则匹配失败,若命中,则匹配成功。
本申请实施例中,不同的数据类型可以采用不同的映射方法,因此在进行散列标识hash value的映射时,需要基于数据列索引值key的类型,找到其对应的目标映射方法。
具体的,考虑到存在相同的key在不同的元数据文件中数据类型不同的情况,因而为了方便获取个元数据文件中各个key类型,本申请实施例中维护了一个文件描述数组集合,参见图6所示,文件描述数组集合以cacheid作为索引,每个文件描述数组定义了不同cacheid下key类型等信息,即指示了相应元数据文件中各数据列的数据类型。那么,以cacheid作为文件描述数组的标识进行索引,通过cacheid即可找到相应的文件描述数组,每个文件描述数那么通过传入元数据文件标识cacheid,则可以从文件描述数组集合的多个文件描述数组中,获得相应的目标文件描述数组,参见图6所示,通过元数据文件标识1(cacheid 1)即可获得相应的文件描述数组,其中包含了该cacheid 1的元数据文件中各个key的数据类型。当然,除了数据类型,还可以包含其他可能的信息,本申请实施例对此不做限制。
进而基于目标文件描述数组,获得数据列索引值key关联的目标数据类型,依此可以确定目标数据类型对应的目标映射方法,并调用目标数据类型对应的目标映射方法,对数据列索引值key进行散列值映射处理,获得散列标识hash value。如图6所示,当key为数据列索引值3(key 3)时,则可以获得其数据类型为数据类型3,其对应的目标映射方法为映射函数3,进而可以调用映射函数3计算得到hash value。
同样的,在进行key值的比对时,考虑到不同数据类型的对比方式有所不同,则同样需要key关联的目标数据类型,来确定对比时所采用的对比函数,进而调用确定的对比函数来进行key值的比对。
步骤302:在匹配成功时,基于目标索引信息关联的目标槽位标识,访问目标元数据对应的目标缓存描述数组。
本申请实施例中,当存在目标记录存储的索引信息与目标索引信息完全相同时,则认为匹配成功。
本申请实施例中,每条记录中除了索引信息之外,还会存储全局缓存数据结构中第二层,也就是缓存描述数组的槽位标识,那么在匹配成功之后,则可以从目标记录中获得目标索引信息关联的目标槽位标识,进而基于目标槽位标识访问目标元数据对应的目标缓存描述数组。
沿用上述hash table的例子,entry中还会存储一个下标,这个下标对应下一层的缓存描述数组。则在元数据文件标识cacheid、数据列索引值key以及散列标识hash value均匹配成功时,则认为目标索引信息匹配成功,则可以获得当前entry对应的下标,从而可以索引到相应的缓存描述数组。
本申请实施例中,由于是多个工作进程共享的全局缓存数据结构,则多个工作进程都可以访问,那么为了避免多个工作进程之间访问时出现冲突,则需要对访问的数据进行加锁操作。
具体的,当目标进程访问全局缓存文件时,则需要对其进行第一加锁操作,以为全局缓存文件添加共享(share)锁,存在share锁即表征当前存在工作进程正在访问全局缓存文件,当需要对全局缓存文件进行一些操作,例如对全局缓存文件进行修改或者删除操作时,则需要等待访问结束。当目标进程访问全局缓存文件结束时,例如在获得缓存描述数组的槽位标识之后,则需要进行相应的解锁操作,来释放全局缓存文件的共享锁。
考虑到单个工作进程对整个全局缓存文件进行加锁后可能带来锁冲突问题,例如,在其访问的这段时间内,其他的工作进程无法对全局缓存文件进行写入,等待时长过长,可能造成任务阻塞,为了改善锁冲突的情况,本申请实施例采用了分区的全局缓存文件,即全局缓存文件可以包括多个文件分区,每个文件分区用于存储至少一个记录。如图7所示,为本申请实施例提供的全局缓存文件的分区示意图,其中,图7中示出分区A和分区B两个分区,每个分区均可以包含多个记录位置,如分区A包含记录位置A1~An,分区B包含记录位置B1~Bn。
那么,在进行全局缓存文件的访问时,则根据上述计算得到的查询记录标识hashkey,确定目标记录所在的目标文件分区,进而对目标文件分区进行第一加锁操作,以为目标文件分区添加共享锁,即表征当前存在工作进程正在访问目标文件分区,而除目标文件分区之外的其他分区则不会加锁。同样的,在目标文件分区访问结束之后,也需要对目标文件分区进行解锁操作,以释放目标文件分区的共享锁。
例如,当计算得到的hash key位于分区A时,则对分区A进行加锁操作,而当分区B未被加锁时,则分区B可以由其他进程进行写操作,避免针对整个全局缓存文件加锁带来的锁冲突问题。
本申请实施例中,加锁操作是指将相应标志位置为表征相应锁的信息,例如针对目标文件分区可以包含其对应的共享锁标志位,则当对目标文件分区进行加锁时,则将该共享锁标志位置为被加锁的状态,或者在该标志位加入目标进程的信息,以表征目标进程对其进行加锁。或者,加锁操作还可以是指在访问目标文件分区时,需要申请目标文件分区的共享锁,则当向目标进程颁发共享锁时,则认为加锁成功。
需要说明的是,本申请实施例中所言的目标进程访问可以包括两种方式,即目标进程自身访问数据,也可以是指目标进程通过proxy进程访问数据,本申请实施例对此不做限制。
步骤303:基于目标缓存描述数组,确定目标元数据当前的数据状态。
本申请实施例中,缓存描述数组用于存储缓存的元数据的控制信息,描述对应的内存块使用情况,以及元数据信息对应的内存偏移等信息。其中,每一缓存描述数组可以包含如下信息中的一种或者多种:
(1)state字段,state字段为当前缓存描述数组的数据描述,可以包含desc锁状态、引用次数(refcount)参数,访问次数(usecount)参数、状态等信息。例如,可以通过32位来承载上述的信息,即上述信息可以依赖一个32位的数据描述。
其中,desc锁状态表征是否加锁,锁(lock)原子操作实现,在对缓存描述数组进行一些操作时,则需要更新state字段的锁状态,例如在修改refcount,usecount上的位状态时,需要持有lock。
refcount参数用于引用计数,即在访问该缓存描述数组时,refcount加1,访问完毕后,refcount减1;usecount描述加载到缓存后的访问次数,通常可以为其配置最大值,例如为5,主要用于内存置换时的检测。
状态,当为缓存进行状态时,采用process表征,表明数据已经读取到,正在拷贝到缓存中,等待其他工作进程完成后读取,valid状态表明当前的元数据有效,读取即可。
(2)元数据分区标识(part_num)字段,表征元数据分区信息,依据这个分区划分则每次只需要失效部分分区的信息,无需全部缓存均失效。
(3)分区版本信息(part_version)字段,表征当前元数据分区的版本号,通常part_num和part_version需要组合使用,不同的part_num对应不同的版本号,需要和全局存储的版本信息进行对比,来确定当前元数据是否有效。
(4)元数据有效截止时间(lease)字段,lease是一个定期时间,用于表征元数据的失效时间,在此截止时间之前元数据是有效的,到期数据不可信,则需要从元数据服务器重新获取进行缓存。
(5)内存地址(offset)字段,表征元数据缓存的地址信息,可以采用内存偏移地址来进行表征。
(6)数据锁(content_lock)字段,当从元数据服务器拿到的元数据进行写入时需要加排他锁,读取元数据时需要加share锁。
(7)next字段,当元数据过长单个内存块无法缓存,例如8k的空间存放不下,或者传入的不是唯一索引信息,返回的结果是list时,则可以利用这个字段存储下一个value的下标。
进而,在访问缓存描述数组时,则可以从中获得目标元数据对应的目标元数据分区标识,进而可以判断该分区标识的版本信息是否与全局存储的一致。其中,全局存储可以是指当前设备中可以另行维护一套版本信息,用于保存各个元数据分区最新的版本信息;或者,全局存储也可以从元数据服务器中获取最新的版本信息;或者,可以对元数据服务器的DDL操作进行订阅,当执行DDL操作时,则可以获知到该操作针对的元数据分区,进而可以修改相应元数据分区的版本信息。
而在缓存描述数组中,也会存储目标元数据分区标识对应的分区版本信息,那么二者进行比较,则可以确定版本是否一致,来确定目标元数据是否有效。
具体的,可以基于目标元数据对应的目标元数据分区标识,获得目标元数据分区的最新分区版本信息,进而将最新分区版本信息,与目标缓存描述数组中的存储分区版本信息进行比较,若二者一致,则表明当前缓存的目标元数据已经失效,需要重新获取了;若二者一致,且基于缓存描述数组中的lease确定目标元数据当前未过期时,则确定目标元数据当前为有效状态;若二者一致,且基于缓存描述数组中的lease确定目标元数据当前已过期时,则同样确定目标元数据当前已失效。
本申请实施例中,为了辅助进行版本信息的确定,还可以增加辅助进程,用于定期从全局事务服务(Global Transaction Service,GTS)服务器获取GTS服务,按照特定转换方式转换成时间戳,backend进程用这个和缓存的lease比较,判断当前缓存是否失效。同时,辅助进程检测etcd中间件,获取元数据信息各个part对应的版本号,用于上述对比时的使用。
步骤304:在数据状态为有效状态时,从目标缓存描述数组中,获得缓存目标元数据的目标内存块的目标地址信息,并将目标地址信息返回给目标进程。
其中,目标地址信息用于指示目标内存块在共享内存中的位置信息,共享内存也就是上述的连续内存,用于元数据共享缓存,为了方便元数据的存储和管理,可以按照不同的数据长度来划分元数据的存储区域,进而在缓存元数据时可以将不同的元数据存储至相应大小的内存块中。
具体的,当目标元数据当前为有效状态时,则可以从目标缓存描述数组中,将offset字段的具体值提供给目标进程,使得目标进程可以基于内存地址访问到目标元数据。
本申请实施例中,针对每个缓存描述数组,在访问该缓存描述数组时,需要更新相应缓存描述数组中的引用次数参数refcount和访问次数参数usecount,而当访问结束时,则同样需要更新相应缓存描述数组中的引用次数参数refcount。例如,在访问ID为0的缓存描述数组时,需要对其进行desc加锁操作,为其加上desc锁,然后进行refcount++操作和usecount++操作,即对refcount和usecount均加一,而当访问结束,例如已经获得了目标地址信息返回给目标进程后,则对进行refcount--操作,即对refcount减一,退出访问。
下面以一个具体的元数据访问的例子来对本申请实施例的技术方案进行介绍,参见图8所示,为本申请实施例提供的访问一个已缓存的元数据的流程示意图,其包含如下步骤:
步骤(1):后台进程(backend process)传入待查询的目标元数据的cacheid以及key,根据传入的cacheid,找到hash value计算函数,并基于key的值计算hashvalue,根据算出的hashvalue拿对应文件分区的share锁,即对对应文件分区加share锁,即对记录位置1~3所在的分区加share锁。
步骤(2):根据传入的key找到对应的desc下标。
具体的,在进行search时,先对比cacheid,再对比hashvalue,最后根据传入的key的值进行比较,均匹配命中时,则确定当前查询的目标元数据已经缓存,且对应该hashtable中的该记录,进而从中获取desc下标,也就是缓存描述数组的槽位标识。
由于可能存在hash碰撞的情况,同一个hash value对应位置上可能存储多个记录,参见图8中所示,记录位置2上同时存储了两个元数据对应的记录,即图8所示的“id=0”和“id=3”,因此,在进行匹配时,通过hash value或者hash key找到相应的记录位置之后,还需要进一步对该记录位置上各条记录,匹配传入的key的值,进而确定是否匹配命中,则如图8所示,最终命中了记录位置2上“id=3”的这一条记录,“id=3”表征的缓存描述数组的槽位标识,其指向槽位3。
步骤(3):根据下标“id=3”,访问槽位3上的cache desc,判断其对应的目标元数据的数据状态,cache desc中存储了内存偏移,在元数据有效时,则可以从中获得目标元数据的内存偏移地址。
具体的,当前缓存描述数组中缓存的part_num对应的part_version和全局存储的一致,且lease未过期则数据状态为有效状态,则对该缓存描述数组加对应的desc锁,进行refcount++和usecount++操作。
其中,part_version在对应的元数据发生更改时,会变化,需要校验是否为最新,lease是一个定期时间,到期数据不可信,需要重新获取数据,因而需要这两项均满足条件时,才确定目标元数据为有效状态。
步骤(4):释放hash table中的对应文件分区的share锁。
步骤(5):将目标元数据的内存偏移地址返回给backend进程。
本申请实施例中,在查询目标元数据时,也可能存在该目标元数据并未进行本地缓存的情况,则这种情况下,则需要获取该目标元数据缓存到本地后,再返回对应的内存地址。参见图9所示,为本申请实施例提供的元数据访问方法的另一流程示意图,其包括如下步骤:
步骤901:响应于目标进程的元数据查询请求,基于元数据查询请求携带的目标元数据的目标索引信息,对全局缓存文件进行匹配操作。
步骤901的过程与前述图3所示的步骤301的过程是类似的,因此可以参见前述部分的介绍,在此不再进行赘述。
步骤902:在未匹配成功时,向元数据服务器发送元数据获取请求。
具体的,在基于传入的目标索引信息进行匹配时,若其包含的任一信息未匹配命中,则表示未匹配成功。
例如,目标索引信息包含cacheid和key时,则根据传入的cacheid,找到hashvalue计算函数,并基于key的值采用该计算函数计算hashvalue,hashvalue和cacheid组合得到hashkey,进而确定相应的目标记录位置,添加该目标记录位置所在的目标文件分区的share锁,再来依次对比cacheid、hashvalue以及key的值,任一未匹配命中,则确定未匹配成功。
在未匹配成功时,表明目标元数据尚未缓存,则释放上述目标文件分区的share锁,并对目标记录所在的目标文件分区进行第二加锁操作,以为目标文件分区添加排他锁。其中,排他锁的意义在于除目标进程之外的其他进程禁止访问目标文件分区,避免在对该目标记录位置进行写入时与其他进程的操作产生冲突。
进而,添加排他锁之后,则可以基于目标索引信息,对目标记录进行更新,并将目标记录的状态标记为缓存进行状态。例如,cacheid、hashvalue以及key的值先存入该目标记录位置,并将状态标记为process,而缓存描述数字的槽位标识先不设置。
完成上述信息的写入之后,则对目标文件分区进行解锁操作,以释放目标文件分区的排他锁,并向元数据服务器发送数据获取请求,以获得目标元数据。
步骤903:接收元数据服务器响应于元数据获取请求返回的目标元数据,并将目标元数据缓存至空闲内存块中。
本申请实施例中,在存在空闲内存块的情况下,则可以将获得的目标元数据直接存储至空闲内存块中。
在实际应用时,可以维护一个空闲列表(free list),则当需要确定是否存在空闲内存块时,则可以查询空闲列表。
在一种可能的实施方式中,空闲列表可以为空闲内存列表,用于存储空闲内存块的信息,则可以查询空闲内存列表中是否为空,来确定是否存在空闲内存块。
具体的,由于内存块按照不同的大小进行划分,则空闲内存列表也可以按照内存块大小分区进行存储。如图10所示,按照存储数据的上限进行划分,内存块可以划分出128、256、512、1024和2048等,则每种大小的空闲内存块可以分别进行维护,通过各自对应的子列表进行存储,则在确定是否存在空闲内存块时,则可以根据目标元数据的数据长度,从其适合的内存块大小开始进行遍历,依次遍历确定是否存在空闲内存块,例如目标元数据的数据长度为489k,则可以从512大小的内存块开始,先遍历是否存在512大小的空闲内存块,若没有,则继续遍历是否存在1024大小的空闲内存块,直至遍历结束或者找到空闲内存块。
在一种可能的实施方式中,空闲列表可以为空闲槽位列表,每个槽位与内存块是一一对应的,因此也可以通过确定是否存在空闲槽位,来确定是否存在空闲内存块。与图10的结构类似的,则确定空闲槽位的过程也可以与上述确定空闲内存块的过程类似,因此不再进行赘述。
本申请实施例中,可以通过新增辅助进程来对空闲列表进行维护,其可以定期整理cache desc,维护多个free list,不同内存大小的放在不同的free list中,最开始初始化时,都放在对应的free list中。
具体的,辅助进程可以每间隔预设周期,遍历缓存描述数组集合,确定当前遍历的缓存描述数组的槽位标识是否处于空闲槽位列表,在当前遍历的缓存描述数组的槽位标识未处于空闲槽位列表中时,则获得缓存描述数组的refcount参数和usecount参数,根据如下情况进行整理:
(1)若获得的refcount参数和usecount参数均为零,表明较长时间未有进程访问该缓存描述数组,则将该缓存描述数组的槽位标识添加到空闲槽位列表中。
(2)若获得的引用次数参数为零,且访问次数参数不为零,表明近期有进程访问该缓存描述数组,但当前未有进程访问,则对访问次数参数进行减一操作。
在实际应用时,辅助进程可以定期扫描cache desc数组,例如按照free list长度最短的优先扫描,扫描时遇到refcount为0且usecount为0的情况下,则将其放入freelist,遇到refcount为0,但usecount不为0的情况,usecount减1。在这个过程可以不提前将这个槽位对应的hash entry移除,在真正使用的时候再判断。
相应的,当工作进程需要获取空闲内存块时,则优先从对应长度的free list中获取槽位,如果free list为空,需要唤醒辅助进程进行整理。选取槽位时,条件依然是refcount为0,usecount为0的条件,如果该长度的槽位遍历两遍后依然没有refcount为0的,可以选择下一个长度的槽位进行遍历。遍历过程中有refcount为0,usecount不为0的,需要继续遍历,将usecount持续减少,找到满足条件的槽位。
步骤904:更新空闲内存块对应的缓存描述数组,并基于缓存描述数组的槽位标识更新目标记录。
相应的,在将目标元数据存储至空闲内存块中后,则需要相应的更新缓存描述数组。
具体的,在对缓存描述数组进行更新写入时,需要对缓存描述数组加desc锁,然后进行refcount++和usecount++操作,将其状态从process状态置为valid状态,表征已经缓存换成,是可以读取的了,并填充part_num,part_version等信息为当前最新的信息。
需要说明的是,在空闲内存块上没有存储元数据时,其对应的缓存描述数组是未存储数据,或者存储的是之前存储的元数据相关的缓存描述信息尚未进行重置的,因此,在将目标元数据存储至空闲内存块后,需要将目标元数据相关的信息填入进去。
同样的,对缓存描述数组进行了更新,还需要对相应的目标记录进行更新,即将缓存描述数组的槽位标识存储到目标记录中去,以使得后续查询目标元数据时能够正确的基于目标记录来找到缓存描述数组。
具体的,在对目标记录进行写入时,为了避免与其他工作进程的操作出现冲突,则需要对目标记录所在的目标文件分区进行第二加锁操作后,即添加排他锁之后,将缓存描述数组的槽位标识更新至目标记录中。
步骤905:将空闲内存块的目标地址信息返回给目标进程。
具体的,完成了目标元数据的缓存之后,则可以将空闲内存块的目标地址信息返回给目标进程,以使得目标进程基于目标地址信息,从该空闲内存块(这里用于指代存储目标元数据的内存块,并不限定为真实的空闲内存块)中获得目标元数据。
下面以一个具体的元数据访问的例子来对本申请实施例的技术方案进行介绍,参见图11A和图11B所示,为本申请实施例提供的访问一个未缓存的元数据,且当前有空闲内存存放元数据的流程示意图,其包含如下步骤:
步骤(1)(图中未示出):backend进程传入待查询的目标元数据的cacheid以及key,根据传入的cacheid,找到hash value计算函数,并基于key的值计算hashvalue,根据算出的hashvalue拿对应文件分区的share锁,即对对应文件分区加share锁,如图11A中计算得到的hashvalue或者hashkey对应的记录位置为记录位置5,则对记录位置4~6所在的hash分区加share锁。
步骤(2)(图中未示出):在记录位置5中进行匹配,没有匹配成功,即未找到目标元数据,表明该目标元数据尚未缓存,释放该hash分区的share锁。
步骤(3):添加该hash分区的排他锁,准备写入数据。
步骤(4):将cacheid、hash value以及key等值存入hash table的entry中,具体为上述hashvalue或者hashkey对应的记录位置,即记录位置5,并将记录位置5中目标记录中的状态标记为process,而缓存描述数组尚未确定,因此cache desc的槽位标识先不设置,对应图11A中“id=?”表明槽位标识还未知。
步骤(5):释放hash分区的排他锁。
步骤(6):从元数据服务器请求目标元数据,根据目标元数据的数据长度,获取一个空闲内存块来存放目标元数据,并对该空闲内存块对应的缓存描述数组添加desc锁,执行refcount++和usecount++操作,将缓存描述数组中的状态置为valid,填充part_num,part_version等信息。
参见图11A所示,根据数据长度,将槽位7对应的内存块确定为存储目标元数据的空闲内存块,并远程调用元数据服务,也就是从元数据服务器获得目标元数据,并将目标元数据存入后,则更新槽位7上的缓存描述数组中的信息。
步骤(7):为了将缓存描述数组的槽位标识添加到目标记录中,则需要加hash分区的排他锁,表明需要写入数据。即对记录位置5所在的hash分区加排他锁。
步骤(8):缓存描述数组的槽位标识填入目标记录中。参见图11B所示,即将desc下标,也就是槽位7填入entry中,如图11B所示填入后“id=7”,则后续如需查询则可以根据记录位置5上的目标记录可以索引到槽位7。
步骤(9):释放hash table中相应hash分区的排他锁。
步骤(10):将目标元数据的内存偏移地址返回给backend进程。
本申请实施例中,在查询目标元数据时,也可能存在该目标元数据并未进行本地缓存的情况,则这种情况下,则需要获取该目标元数据缓存到本地后,再返回对应的内存地址,但可能存在存入时发现目前并不存空闲的内存块直接存放元数据的情况,则需要进行置换,也就是覆盖原来存储的元数据来存储当前需要存储的元数据。参见图12所示,为本申请实施例提供的元数据访问方法的又一流程示意图,其包括如下步骤:
步骤1201:响应于目标进程的元数据查询请求,基于元数据查询请求携带的目标元数据的目标索引信息,对全局缓存文件进行匹配操作。
步骤1201的过程与前述图3所示的步骤301的过程是类似的,因此可以参见前述部分的介绍,在此不再进行赘述。
步骤1202:在未匹配成功时,向元数据服务器发送元数据获取请求。
步骤1203:若不存在空闲内存块,则基于目标元数据的数据长度,从缓存描述数组集合中,确定出满足预设置换条件的目标缓存描述数组。
当所有内存块均以缓存满时,则不存在空闲内存块,此时需要进行置换,置换的含义即在于将原本存储其他元数据的内存块置换用于存储当前查询的目标元数据。
具体的,由于内存块与缓存描述数组是相对应的,则可以根据缓存描述数组来确定是否满足置换条件。通常而言,能够置换的内存块应当是长时间未有人访问的,这些元数据的热度不高,可以进行置换,而每个缓存描述数组而言,在被目标进程访问时,会更新其中的refcount参数和usecount参数,因此可以通过缓存描述数组中的refcount参数和usecount参数来进行表征元数据的热度以及是否有进程正在访问,因此,预设置换条件可以为refcount参数和usecount参数的值均为0。
因此,在找可置换的内存块时,则可以从缓存描述数组集合中,确定出引用次数参数和访问次数参数均为零的目标缓存描述数组。
在一种可能的实施方式中,由于内存块可以划分为不同的分区,则与之相对应的,缓存描述数组也可以按照对应的方式进行分组,从而可以将缓存描述数组集合划分为多个数组分区,每个数组分区包括:相应类型的内存块的缓存描述数组,不同类型的内存块的缓存数据长度上限不同。
那么,在确定出满足预设置换条件的目标缓存描述数组时,则可以基于目标元数据的数据长度,确定相对应的目标数组分区,并从目标数组分区中,确定出满足预设置换条件的目标缓存描述数组。若是该目标数组分区中不存在满足条件的目标缓存描述数组,则可以等待,并在等待超时之后,从其他类型分区中确定满足条件的目标缓存描述数组。
例如,优先从对应长度的free list中获取槽位,如果free list为空,需要唤醒辅助进程进行整理。选取槽位时,条件依然是refcount为0,usecount为0的条件,如果该长度的槽位遍历两遍后依然没有refcount为0的,可以选择下一个长度的槽位进行遍历。遍历过程中有refcount为0,usecount不为0的,需要继续遍历,将usecount持续减少,找到满足条件的槽位。
需要说明的是,在实际应用时,可以先从元数据服务器请求目标元数据之后,再来确定是否存在空闲内存块;或者,也可以是在确定是否存在空闲内存块,若无则确定可以置换的目标内存块之后,再从元数据服务器请求目标元数据,本申请实施例对此不做限制。
步骤1204:基于目标缓存描述数组中的原始索引信息,生成目标缓存描述数组对应的原始记录标识。
在实际应用时,虽然目标缓存描述数组当前无进程访问,但无法确定其对应的记录是否正有进程,若是该记录存在其他进程访问,则不能置换当前的目标缓存描述数组。由于所找到的目标缓存描述数组中存储了原有元数据的原始描述信息,可以基于其中存储的原始索引信息,生成目标缓存描述数组对应的原始记录标识,从而找到原始元数据所对应的原始记录标识。
步骤1205:在原始记录标识对应的原始记录满足清除条件时,清除原始记录中存储的信息。
其中,清除条件与上面类似的,需要确定当前没有其他进程正在访问,因此清除条件可以是指无其他进程正在访问,当原始记录满足清除条件时,由于该条记录对应的原始元数据已经被置换为存储其他元数据,则可以清除原始记录中存储的信息,避免后续产生错误访问。其中,确认是否有其他进程访问可以通过缓存描述数组中的refcount参数来确认,由于当前目标进程正在访问,因此,refcount参数应当为1,则refcount参数大于1时,则表明有其他进程正在访问。
步骤1206:将目标元数据缓存至目标缓存描述数组对应的目标内存块中,并基于目标缓存描述数组的槽位标识,更新基于目标索引信息确定的目标记录。
在确定可以进行置换时,则可以将获得的目标元数据缓存至刚刚确定出的目标缓存描述数组对应的目标内存块中,并基于目标缓存描述数组的槽位标识,更新基于目标索引信息确定的目标记录,以便于后续查询时可以根据该目标记录查询到相应的目标元数据。
步骤1207:将目标内存块的目标地址信息返回给目标进程。
具体的,完成了目标元数据的缓存之后,则可以将目标内存块的目标地址信息返回给目标进程,以使得目标进程基于目标地址信息,从该目标内存块中获得目标元数据。
下面以一个具体的元数据访问的例子来对本申请实施例的技术方案进行介绍,参见图13A和图13B所示,为本申请实施例提供的访问一个未缓存的元数据,且当前未有空闲内存存放元数据的流程示意图,其包含如下步骤:
步骤(1)(图中未示出):根backend进程传入待查询的目标元数据的cacheid以及key,根据传入的cacheid,找到hash value计算函数,并基于key的值计算hashvalue,根据算出的hashvalue拿对应文件分区的share锁,即对对应文件分区加share锁,如图11A中计算得到的hashvalue或者hashkey对应的记录位置为记录位置5,则对记录位置4~6所在的hash分区加share锁。若未能找到目标元数据且当前未有空闲内存,则释放该hash分区的share锁。
步骤(2):通过远程调用协议(Remote Procedure Call Protocol,RPC)请求数据,根据数据长度,选择对应长度区域的cache desc数组,从中找到一个refcount=0,usecount=0的槽位,对其加desc锁执行refcount++操作,参见图13A中找到了第7个内存块对应的槽位7。
步骤(3):根据槽位7对应的元数据存入的key计算old hash value,以及,根据传入的待查询的目标元数据的key计算new hash value。
步骤(4):由于需要清除槽位7中原始数据对应的记录,以及填充当前目标元数据的记录,需要加old hash table分区的排他锁和new hash table分区的排他锁。参见图13A所示,old hash value指向记录位置5,则需要对其所在分区4~6进行加锁,new hash value指向记录位置9,则需要对其所在分区8~10进行加锁。
步骤(5):在当前目标元数据计算得到的new hash value对应的entry填充,cachedesc id先不填充,标记状态为process,即在记录位置9中填入当前目标元数据除cachedesc id之外的相关信息。
步骤(6):检查desc的refcount是否是1,表明这段时间除了本工作进程,没有其他进程访问,是的话,移除old hash value指向的old entry。否的话,就需要重新寻找可用的槽位。
步骤(7):释放old entry对应的分区锁,即分区4~6对应的分区锁。
步骤(8):将从元数据服务器读取的目标元数据填充到对应内存处。
步骤(9):将new hash value指向的new entry的cache desc id更新,参见图13B中,更新后则记录位置9上存储的记录指向槽位7,用于存储当前查询的目标元数据相关信息。
步骤(10):释放hash table分区锁,即分区8~10对应的分区锁。
本申请实施例中,工作进程在读取元数据时,所有读取元数据的工作进程都会加对应的读锁,DDL操作需要加对应的写锁,这个时候等待读锁释放,正常情况下还需要等待lease时间后(其他进程lease时间后缓存到期自动失效)才可以进行更新,而本申请实施中引入了优化,增加了一个版本号,将元数据分区管理,DDL涉及的元数据分区,版本号+1,计算集群的缓存中会存储分区号,和分区版本号,当版本号不一致时,就需要重新从元数据服务器获取数据。这样,元数据服务器就不需要等待lease的时间后再做DDL,只需要看到各个计算集群节点更新版本号完成即可。且在本申请实施例中,工作进程维护本地的cache,还可以通过加proxy进程来合并多个进程重复的元数据请求。
综上所述,本申请实施例中提供了一种新的元数据缓存方案,通过维护一个global缓存,有效合并了不同工作进程之间对于同一个元数据信息的请求,之后将一些加锁可以保护的信息放入本地cache,可以有效避免因为lease失效导致频繁去元数据服务器请求数据,在云原生模式或者非云原生模式下都可以使用,多进程模式的PG使用全局缓存时,能够有效降低内存使用,避免工作进程多次从磁盘读取同一份元数据,失效消息也不需要发送给所有进程,执行DDL的工作进程对当前全局缓存失效对应的数据即可。
请参见图14,基于同一发明构思,本申请实施例还提供了一种元数据访问装置140,该装置包括:
全局匹配单元1401,用于响应于目标进程的元数据查询请求,基于元数据查询请求携带的目标元数据的目标索引信息,对全局缓存文件进行匹配操作;其中,全局缓存文件包括至少一条记录,每条记录包括:已缓存的元数据的索引信息,以及相应的元数据对应的缓存描述数组的槽位标识,每个缓存描述数组对应至少一个用于缓存元数据的内存块;
数组访问单元1402,用于在匹配成功时,基于目标索引信息关联的目标槽位标识,访问目标元数据对应的目标缓存描述数组;
地址获得单元1403,用于基于目标缓存描述数组,确定目标元数据当前为有效状态时,从目标缓存描述数组中,获得缓存目标元数据的目标内存块的目标地址信息;其中,目标地址信息用于指示目标内存块在共享内存中的位置信息,共享内存按照不同的数据长度划分元数据的存储区域;以及,将目标地址信息返回给目标进程。
在一种可能的实施方式中,目标索引信息包括元数据文件标识和目标元数据在元数据文件中对应的数据列索引值;则全局匹配单元1401,具体用于:
基于数据列索引值,按照目标映射方法,生成相应的散列标识,并基于散列标识与元数据文件标识,生成目标元数据对应的查询记录标识;
基于查询记录标识,从全局缓存文件中确定目标记录,并将元数据文件标识、数据列索引值以及散列标识,分别与目标记录包括的对应值进行匹配;
则数组访问单元1402,具体用于:
在元数据文件标识、数据列索引值以及散列标识均匹配成功时,基于目标索引信息关联的目标槽位标识,访问目标元数据对应的目标缓存描述数组。
在一种可能的实施方式中,全局匹配单元1401,具体用于:
基于元数据文件标识,从多个文件描述数组中,获得相应的目标文件描述数组,其中,每个文件描述数组指示:相应元数据文件中各数据列的数据类型;
基于目标文件描述数组,获得数据列索引值关联的目标数据类型;
调用目标数据类型对应的目标映射方法,对数据列索引值进行散列值映射处理,获得散列标识。
在一种可能的实施方式中,全局缓存文件包括多个文件分区,每个文件分区包括至少一个记录;则全局匹配单元1401,还用于:
基于查询记录标识,确定目标记录所在的目标文件分区;
对目标文件分区进行第一加锁操作,以为目标文件分区添加共享锁;其中,共享锁表征:存在工作进程正在访问目标文件分区;
在匹配成功时,基于目标索引信息关联的目标槽位标识,访问目标元数据对应的目标缓存描述数组之后,对目标文件分区进行解锁操作,以释放目标文件分区的共享锁。
在一种可能的实施方式中,该装置还包括数据缓存单元1404,用于:
在未匹配成功时,向元数据服务器发送元数据获取请求;
接收元数据服务器响应于元数据获取请求返回的目标元数据,并将目标元数据缓存至空闲内存块中;
更新空闲内存块对应的缓存描述数组,并基于缓存描述数组的槽位标识更新目标记录;
将空闲内存块的目标地址信息返回给目标进程。
在一种可能的实施方式中,数据缓存单元1404,具体用于:
在未匹配成功时,对目标记录所在的目标文件分区进行第二加锁操作,以为目标文件分区添加排他锁;其中,排他锁表征:除目标进程之外的其他进程禁止访问目标文件分区;
基于目标索引信息,对目标记录进行更新,并将目标记录的状态标记为缓存进行状态;
对目标文件分区进行解锁操作,以释放目标文件分区的排他锁,并向元数据服务器发送数据获取请求;
对目标文件分区进行第二加锁操作后,将缓存描述数组的槽位标识更新至目标记录中。
在一种可能的实施方式中,数据缓存单元1404,还用于:
若不存在空闲内存块,则基于目标元数据的数据长度,从缓存描述数组集合中,确定出满足预设置换条件的目标缓存描述数组;
基于目标缓存描述数组中的原始索引信息,生成目标缓存描述数组对应的原始记录标识;
在原始记录标识对应的原始记录满足清除条件时,清除原始记录中存储的信息;
将目标元数据缓存至目标缓存描述数组对应的目标内存块中,并基于目标缓存描述数组的槽位标识,更新基于目标索引信息确定的目标记录;
将目标内存块的目标地址信息返回给目标进程。
在一种可能的实施方式中,缓存描述数组集合包括多个数组分区,每个数组分区包括:相应类型的内存块的缓存描述数组,不同类型的内存块的缓存数据长度上限不同;
则数据缓存单元1404,具体用于:
基于目标元数据的数据长度,确定相对应的目标数组分区;
从目标数组分区中,确定出满足预设置换条件的目标缓存描述数组。
在一种可能的实施方式中,缓存描述数组包括引用次数参数和访问次数参数;则该装置包括定时扫描单元1405,用于:
针对每个缓存描述数组,在访问缓存描述数组时,更新相应缓存描述数组中的引用次数参数和访问次数参数;
则数据缓存单元1404,具体用于:
从缓存描述数组集合中,确定出引用次数参数和访问次数参数均为零的目标缓存描述数组。
在一种可能的实施方式中,目标缓存描述数组包括元数据分区标识、分区版本信息以及元数据有效截止时间;
则地址获得单元1403,具体用于:
基于目标元数据对应的目标元数据分区标识,获得目标元数据分区的最新分区版本信息;
在最新分区版本信息,与目标缓存描述数组中的存储分区版本信息一致,且基于元数据有效截止时间确定目标元数据当前未过期时,确定目标元数据当前为有效状态。
在一种可能的实施方式中,定时扫描单元1405,用于:
每间隔预设周期,遍历缓存描述数组集合,分别执行如下操作:
在当前遍历的缓存描述数组的槽位标识未处于空闲槽位列表中,则获得缓存描述数组的引用次数参数和访问次数参数;
若获得的引用次数参数和访问次数参数均为零,则将缓存描述数组的槽位标识添加到空闲槽位列表中;
若获得的引用次数参数为零,且访问次数参数不为零,则对访问次数参数进行减一操作。
通过上述装置,采用了元数据全局缓存的方案,对于所有的工作进程而言,都可以按照该方法访问到自身所需的元数据,从而无需自行维护自己的元数据缓存,降低工作进程之间重复元数据缓存,降低了占用的内存资源,同时也减少了重复元数据的传输资源占用,提升了资源利用率。
该装置可以用于执行本申请各实施例中所示的方法,因此,对于该装置的各功能模块所能够实现的功能等可参考前述实施例的描述,不多赘述。
请参见图15,基于同一技术构思,本申请实施例还提供了一种计算装置。在一种实施例中,该计算装置可以为图1所示的计算节点或者终端设备,该计算装置如图15所示,包括存储器1501,通讯模块1503以及一个或多个处理器1502。
存储器1501,用于存储处理器1502执行的计算机程序。存储器1501可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作***,以及运行本申请实施例的功能所需的程序等;存储数据区可存储各种即时通讯信息和操作指令集等。
存储器1501可以是易失性存储器(volatile memory),例如随机存取存储器(random-access memory,RAM);存储器1501也可以是非易失性存储器(non-volatilememory),例如只读存储器,快闪存储器(flash memory),硬盘(hard disk drive,HDD)或固态硬盘(solid-state drive,SSD);或者存储器1501是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。存储器1501可以是上述存储器的组合。
处理器1502,可以包括一个或多个中央处理单元(central processing unit,CPU)或者为数字处理单元等等。处理器1502,用于调用存储器1501中存储的计算机程序时实现上述元数据访问方法。
通讯模块1503用于与计算节点、元数据服务器和终端设备等进行通信。
本申请实施例中不限定上述存储器1501、通讯模块1503和处理器1502之间的具体连接介质。本申请实施例在图15中以存储器1501和处理器1502之间通过总线1504连接,总线1504在图15中以粗线描述,其它部件之间的连接方式,仅是进行示意性说明,并不引以为限。总线1504可以分为地址总线、数据总线、控制总线等。为便于描述,图15中仅用一条粗线描述,但并不描述仅有一根总线或一种类型的总线。
存储器1501中存储有计算机存储介质,计算机存储介质中存储有计算机可执行指令,计算机可执行指令用于实现本申请实施例的元数据访问方法,处理器1502用于执行上述各实施例的元数据访问方法,参见图3、图9或者图12所示。
下面参照图16来描述根据本申请的这种实施方式的计算装置160。图16的计算装置160仅仅是一个示例,不应对本申请实施例的功能和使用范围带来任何限制。
如图16,计算装置160以通用计算装置的形式表现。计算装置160的组件可以包括但不限于:上述至少一个处理单元161、上述至少一个存储单元162、连接不同***组件(包括存储单元162和处理单元161)的总线163。
总线163表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器、***总线、处理器或者使用多种总线结构中的任意总线结构的局域总线。
存储单元162可以包括易失性存储器形式的可读介质,例如随机存取存储器(RAM)1621和/或高速缓存存储单元1622,还可以进一步包括只读存储器(ROM)1623。
存储单元162还可以包括具有一组(至少一个)程序模块1624的程序/实用工具1625,这样的程序模块1624包括但不限于:操作***、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
计算装置160也可以与一个或多个外部设备164(例如键盘、指向设备等)通信,还可与一个或者多个使得用户能与计算装置160交互的设备通信,和/或与使得该计算装置160能与一个或多个其它计算装置进行通信的任何设备(例如路由器、调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口165进行。并且,计算装置160还可以通过网络适配器166与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器166通过总线163与用于计算装置160的其它模块通信。应当理解,尽管图中未示出,可以结合计算装置160使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理器、外部磁盘驱动阵列、RAID***、磁带驱动器以及数据备份存储***等。
基于同一发明构思,本申请实施例还提供一种存储介质,该存储介质存储有计算机程序,当该计算机程序在计算机上运行时,使得计算机执行本说明书上述描述的根据本申请各种示例性实施方式的元数据访问方法中的步骤。
在一些可能的实施方式中,本申请提供的元数据访问方法的各个方面还可以实现为一种计算机程序产品的形式,其包括计算机程序,当程序产品在计算机设备上运行时,计算机程序用于使计算机设备执行本说明书上述描述的根据本申请各种示例性实施方式的元数据访问方法中的步骤,例如,计算机设备可以执行各实施例的步骤。
程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以是但不限于电、磁、光、电磁、红外线、或半导体的***、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
本申请的实施方式的程序产品可以采用便携式紧凑盘只读存储器(CD-ROM)并包括计算机程序,并可以在计算机设备上运行。然而,本申请的程序产品不限于此,在本申请件中,可读存储介质可以是任何包含或存储程序的有形介质,其包括的计算机程序可以被命令执行***、装置或者器件使用或者与其结合使用。
可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读计算机程序。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由命令执行***、装置或者器件使用或者与其结合使用的程序。
可读介质上包含的计算机程序可以用任何适当的介质传输,包括但不限于无线、有线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言的任意组合来编写用于执行本申请操作的计算机程序,程序设计语言包括面向对象的程序设计语言,诸如Java、C++等,还包括常规的过程式程序设计语言,诸如“C”语言或类似的程序设计语言。
应当注意,尽管在上文详细描述中提及了装置的若干单元或子单元,但是这种划分仅仅是示例性的并非强制性的。实际上,根据本申请的实施方式,上文描述的两个或更多单元的特征和功能可以在一个单元中具体化。反之,上文描述的一个单元的特征和功能可以进一步划分为由多个单元来具体化。
此外,尽管在附图中以特定顺序描述了本申请方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
本领域内的技术人员应明白,本申请的实施例可提供为方法、***、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

Claims (14)

1.一种元数据访问方法,其特征在于,所述方法包括:
响应于目标进程的元数据查询请求,基于所述元数据查询请求携带的目标元数据的目标索引信息,对全局缓存文件进行匹配操作;其中,所述全局缓存文件包括至少一条记录,每条记录包括:已缓存的元数据的索引信息,以及相应的元数据对应的缓存描述数组的槽位标识,每个缓存描述数组对应至少一个用于缓存元数据的内存块;
在匹配成功时,基于所述目标索引信息关联的目标槽位标识,访问所述目标元数据对应的目标缓存描述数组;
基于所述目标缓存描述数组,确定所述目标元数据当前为有效状态时,从所述目标缓存描述数组中,获得缓存所述目标元数据的目标内存块的目标地址信息;其中,所述目标地址信息用于指示所述目标内存块在共享内存中的位置信息,所述共享内存按照不同的数据长度划分元数据的存储区域;
将所述目标地址信息返回给所述目标进程。
2.如权利要求1所述的方法,其特征在于,所述目标索引信息包括元数据文件标识和所述目标元数据在元数据文件中对应的数据列索引值;则所述响应于目标进程的元数据查询请求,基于所述元数据查询请求携带的目标元数据的目标索引信息,对全局缓存文件进行匹配操作,包括:
基于所述数据列索引值,按照目标映射方法,生成相应的散列标识,并基于所述散列标识与所述元数据文件标识,生成所述目标元数据对应的查询记录标识;
基于所述查询记录标识,从所述全局缓存文件中确定目标记录,并将所述元数据文件标识、所述数据列索引值以及所述散列标识,分别与所述目标记录包括的对应值进行匹配;
则所述在匹配成功时,基于所述目标索引信息关联的目标槽位标识,访问所述目标元数据对应的目标缓存描述数组,包括:
在所述元数据文件标识、所述数据列索引值以及所述散列标识均匹配成功时,基于所述目标索引信息关联的目标槽位标识,访问所述目标元数据对应的目标缓存描述数组。
3.如权利要求2所述的方法,其特征在于,所述基于所述数据列索引值,按照目标映射方法,生成相应的散列标识,包括:
基于所述元数据文件标识,从多个文件描述数组中,获得相应的目标文件描述数组,其中,每个文件描述数组指示:相应元数据文件中各数据列的数据类型;
基于所述目标文件描述数组,获得所述数据列索引值关联的目标数据类型;
调用所述目标数据类型对应的所述目标映射方法,对所述数据列索引值进行散列值映射处理,获得所述散列标识。
4.如权利要求2所述的方法,其特征在于,所述全局缓存文件包括多个文件分区,每个文件分区包括至少一个记录;则在所述基于所述散列标识与所述元数据文件标识,生成所述目标元数据对应的查询记录标识之后,所述方法还包括:
基于所述查询记录标识,确定所述目标记录所在的目标文件分区;
对所述目标文件分区进行第一加锁操作,以为所述目标文件分区添加共享锁;其中,所述共享锁表征:存在工作进程正在访问所述目标文件分区;
则在匹配成功时,基于所述目标索引信息关联的目标槽位标识,访问所述目标元数据对应的目标缓存描述数组之后,所述方法还包括:
对所述目标文件分区进行解锁操作,以释放所述目标文件分区的所述共享锁。
5.如权利要求2~4任一所述的方法,其特征在于,在基于所述查询记录标识,从所述全局缓存文件中确定目标记录之后,所述方法还包括:
在未匹配成功时,向元数据服务器发送元数据获取请求;
接收所述元数据服务器响应于所述元数据获取请求返回的所述目标元数据,并将所述目标元数据缓存至空闲内存块中;
更新所述空闲内存块对应的缓存描述数组,并基于所述缓存描述数组的槽位标识更新所述目标记录;
将所述空闲内存块的目标地址信息返回给所述目标进程。
6.如权利要求5所述的方法,其特征在于,在未匹配成功时,向元数据服务器发送元数据获取请求,包括:
在未匹配成功时,对所述目标记录所在的目标文件分区进行第二加锁操作,以为所述目标文件分区添加排他锁;其中,所述排他锁表征:除所述目标进程之外的其他进程禁止访问所述目标文件分区;
基于所述目标索引信息,对所述目标记录进行更新,并将所述目标记录的状态标记为缓存进行状态;
对所述目标文件分区进行解锁操作,以释放所述目标文件分区的所述排他锁,并向元数据服务器发送数据获取请求;
则所述基于所述缓存描述数组的槽位标识更新所述目标记录,包括:
对所述目标文件分区进行所述第二加锁操作后,将所述缓存描述数组的槽位标识更新至所述目标记录中。
7.如权利要求5所述的方法,其特征在于,在接收所述元数据服务器响应于所述元数据获取请求返回的所述目标元数据之后,所述方法还包括:
若不存在空闲内存块,则基于所述目标元数据的数据长度,从缓存描述数组集合中,确定出满足预设置换条件的目标缓存描述数组;
基于所述目标缓存描述数组中的原始索引信息,生成所述目标缓存描述数组对应的原始记录标识;
在所述原始记录标识对应的原始记录满足清除条件时,清除所述原始记录中存储的信息;
将所述目标元数据缓存至所述目标缓存描述数组对应的目标内存块中,并基于所述目标缓存描述数组的槽位标识,更新基于所述目标索引信息确定的所述目标记录;
将所述目标内存块的目标地址信息返回给所述目标进程。
8.如权利要求7所述的方法,其特征在于,所述缓存描述数组集合包括多个数组分区,每个数组分区包括:相应类型的内存块的缓存描述数组,不同类型的内存块的缓存数据长度上限不同;
则基于所述目标元数据的数据长度,从缓存描述数组集合中,确定出满足预设置换条件的目标缓存描述数组,包括:
基于所述目标元数据的数据长度,确定相对应的目标数组分区;
从所述目标数组分区中,确定出满足预设置换条件的目标缓存描述数组。
9.如权利要求7所述的方法,其特征在于,所述缓存描述数组包括引用次数参数和访问次数参数;则所述方法还包括:
针对每个缓存描述数组,在访问所述缓存描述数组时,更新相应缓存描述数组中的引用次数参数和访问次数参数;
则所述从缓存描述数组集合中,确定出满足预设置换条件的目标缓存描述数组,包括:
从缓存描述数组集合中,确定出引用次数参数和访问次数参数均为零的所述目标缓存描述数组。
10.如权利要求1~4任一所述的方法,其特征在于,所述目标缓存描述数组包括元数据分区标识、分区版本信息以及元数据有效截止时间;
则基于所述目标缓存描述数组,确定所述目标元数据当前为有效状态,包括:
基于所述目标元数据对应的目标元数据分区标识,获得所述目标元数据分区的最新分区版本信息;
在所述最新分区版本信息,与所述目标缓存描述数组中的存储分区版本信息一致,且基于所述元数据有效截止时间确定所述目标元数据当前未过期时,确定所述目标元数据当前为有效状态。
11.如权利要求1~4任一所述的方法,其特征在于,所述方法还包括:
每间隔预设周期,遍历缓存描述数组集合,分别执行如下操作:
在当前遍历的缓存描述数组的槽位标识未处于空闲槽位列表中,则获得所述缓存描述数组的引用次数参数和访问次数参数;
若获得的引用次数参数和访问次数参数均为零,则将所述缓存描述数组的槽位标识添加到空闲槽位列表中;
若获得的引用次数参数为零,且访问次数参数不为零,则对访问次数参数进行减一操作。
12.一种元数据访问装置,其特征在于,所述装置包括:
全局匹配单元,用于响应于目标进程的元数据查询请求,基于所述元数据查询请求携带的目标元数据的目标索引信息,对全局缓存文件进行匹配操作;其中,所述全局缓存文件包括至少一条记录,每条记录包括:已缓存的元数据的索引信息,以及相应的元数据对应的缓存描述数组的槽位标识,每个缓存描述数组对应至少一个用于缓存元数据的内存块;
数组访问单元,用于在匹配成功时,基于所述目标索引信息关联的目标槽位标识,访问所述目标元数据对应的目标缓存描述数组;
地址获得单元,用于基于所述目标缓存描述数组,确定所述目标元数据当前为有效状态时,从所述目标缓存描述数组中,获得缓存所述目标元数据的目标内存块的目标地址信息;其中,所述目标地址信息用于指示所述目标内存块在共享内存中的位置信息,所述共享内存按照不同的数据长度划分元数据的存储区域;以及,将所述目标地址信息返回给所述目标进程。
13.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,
所述处理器执行所述计算机程序时实现权利要求1至11任一项所述方法的步骤。
14.一种计算机存储介质,其上存储有计算机程序,其特征在于,
该计算机程序被处理器执行时实现权利要求1至11任一项所述方法的步骤。
CN202311086103.XA 2023-08-28 2023-08-28 元数据访问方法、装置、设备及存储介质 Active CN116821058B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311086103.XA CN116821058B (zh) 2023-08-28 2023-08-28 元数据访问方法、装置、设备及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311086103.XA CN116821058B (zh) 2023-08-28 2023-08-28 元数据访问方法、装置、设备及存储介质

Publications (2)

Publication Number Publication Date
CN116821058A true CN116821058A (zh) 2023-09-29
CN116821058B CN116821058B (zh) 2023-11-14

Family

ID=88118805

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311086103.XA Active CN116821058B (zh) 2023-08-28 2023-08-28 元数据访问方法、装置、设备及存储介质

Country Status (1)

Country Link
CN (1) CN116821058B (zh)

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110018983A (zh) * 2017-09-27 2019-07-16 华为技术有限公司 一种元数据查询方法及装置
CN111625198A (zh) * 2020-05-28 2020-09-04 深圳佰维存储科技股份有限公司 一种元数据缓存方法和元数据缓存装置
CN115964001A (zh) * 2023-02-01 2023-04-14 支付宝(杭州)信息技术有限公司 一种数据缓存方法、***及装置
CN116225693A (zh) * 2022-12-26 2023-06-06 阿里云计算有限公司 元数据管理方法、装置、计算机设备及存储介质

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110018983A (zh) * 2017-09-27 2019-07-16 华为技术有限公司 一种元数据查询方法及装置
CN111625198A (zh) * 2020-05-28 2020-09-04 深圳佰维存储科技股份有限公司 一种元数据缓存方法和元数据缓存装置
CN116225693A (zh) * 2022-12-26 2023-06-06 阿里云计算有限公司 元数据管理方法、装置、计算机设备及存储介质
CN115964001A (zh) * 2023-02-01 2023-04-14 支付宝(杭州)信息技术有限公司 一种数据缓存方法、***及装置

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
阿里云数据库开源: "PstgreSQL内存管理机制", HTTPS://ZHUANLAN.ZHIHU.COM/P/412689132, pages 1 - 7 *

Also Published As

Publication number Publication date
CN116821058B (zh) 2023-11-14

Similar Documents

Publication Publication Date Title
US10958752B2 (en) Providing access to managed content
US11126605B2 (en) System and method for clustering distributed hash table entries
US20210056074A1 (en) File System Data Access Method and File System
US10528537B2 (en) System and method for fetching the latest versions of stored data objects
US9558194B1 (en) Scalable object store
US7797275B2 (en) System and method of time-based cache coherency maintenance in user file manager of object-based storage system
US11245774B2 (en) Cache storage for streaming data
CN110750507B (zh) 面向dfs的全局命名空间下的持久客户端缓存方法及***
US9075722B2 (en) Clustered and highly-available wide-area write-through file system cache
US10503693B1 (en) Method and system for parallel file operation in distributed data storage system with mixed types of storage media
CN109766318B (zh) 文件读取方法及装置
CN109753360B (zh) 面向电力***中边缘节点的轻量级数据管理***及方法
CN113377868A (zh) 一种基于分布式kv数据库的离线存储***
US10055139B1 (en) Optimized layout in a two tier storage
CN108256019A (zh) 数据库主键生成方法、装置、设备及其存储介质
CN111930684A (zh) 基于hdfs的小文件处理方法、装置、设备及存储介质
CN116821058B (zh) 元数据访问方法、装置、设备及存储介质
CN115878625A (zh) 数据处理方法和装置及电子设备
US10628391B1 (en) Method and system for reducing metadata overhead in a two-tier storage architecture
US11516290B2 (en) Sharing tuples across independent coordination namespace systems
KR102280443B1 (ko) 셀렉트 쿼리 처리 시 네트워크 비용 절감을 위해 멀티 캐시를 구비한 클라우드 데이터베이스 시스템
CN111078643B (zh) 一种批量删除文件的方法、装置及电子设备
CN113282563A (zh) 基于对象存储的文件网关高可用实现方法及电子设备
CN116431590A (zh) 一种数据处理的方法及相关设备
CN114281765A (zh) 分布式文件***中的元数据处理方法及设备

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant
REG Reference to a national code

Ref country code: HK

Ref legal event code: DE

Ref document number: 40092312

Country of ref document: HK