一种B+树的存取方法、装置和计算机可读存储介质与流程

文档序号:21176354发布日期:2020-06-20 17:30阅读:276来源:国知局
一种B+树的存取方法、装置和计算机可读存储介质与流程

本发明涉及数据存储技术领域,特别是涉及一种b+树的存取方法、装置和计算机可读存储介质。



背景技术:

在全闪存阵列存储系统中,由于其结构的特殊性,大量采用b+树结构。例如,全闪存阵列普遍采用自动精简的容量分配方式(thinprovisioning),其卷的逻辑地址与卷在磁盘阵列(redundantarraysofindependentdisks,raid)上的物理地址不再是线性对应关系,而变成了近似随机映射的关系。为了管理这种映射关系,采用b+树来保存从卷逻辑地址到物理地址的映射,并且采用b+树来保存物理地址到逻辑地址的逆映射。全闪存阵列的重删功能,采用b+树来保存数据块hash值到物理地址的映射。

动态随机存取存储器(dynamicrandomaccessmemory,dram)是一种较为常见的系统内存。由于dram内存是较为昂贵的部件,因此存储系统中通常只配置较少数量的dram内存以降低成本。现有技术中,b+树的数据通常保存在固态硬盘(solidstatedrives,ssd)中。ssd盘中的数据必须读到内存中才能进行读写访问,而ssd读写的io路径比较长,速度慢。b+树结构的频繁的读入及换出内存,会带来很大的cpu开销。

可见,如何提升b+树的读写效率,是本领域技术人员需要解决的问题。



技术实现要素:

本发明实施例的目的是提供一种b+树的存取方法、装置和计算机可读存储介质,可以提升b+树的读写效率。

为解决上述技术问题,本发明实施例提供一种b+树的存取方法,包括:

获取到b+树创建指令时,判断是否存在映射到dram内存的空闲的底层树文件;

若是,则将所述b+树的底层数据存储至所述底层树文件;

若否,则新建一个目标底层数文件,并将所述目标底层树文件映射至dram内存,以便于将所述b+树的底层数据存储至所述目标底层树文件中;

当所述b+树的层数大于或等于预设阈值时,则将所述b+树中层数大于或等于所述预设阈值的数据存储至预先设定的存储区域。

可选地,所述b+树对应有第一层级、第二层级和第三层级;其中,第一层级的数据作为底层数据;

相应的,所述当所述b+树的层数大于或等于预设阈值时,则将所述b+树中大于或等于所述预设阈值的数据存储至预先设定的存储区域包括:

将所述b+树的第二层级的数据存储至dcpmm内存中;

将所述b+树的第三层级的数据存储至预设的硬盘中。

可选地,在所述获取到b+树创建指令时,判断是否存在映射到内存的底层树文件之前还包括:

将所述dcpmm内存的最小读写粒度作为所述b+树的节点容量。

可选地,所述将所述b+树的底层数据存储至所述底层树文件包括:

将所述b+树的底层数据按照所述节点容量向所述底层树文件中存储各节点数据;其中,每个节点数据的键值对中存储有下一层级节点的偏移地址。

可选地,还包括:

当获取到数据查询指令时,依据所述数据查询指令中携带的逻辑地址,确定出根节点;

根据所述根节点中包含的偏移地址,确定出叶子节点;并读取所述叶子节点对应的数据。

可选地,还包括:

当获取到数据修改指令时,判断所述dram内存中是否存在与所述数据修改指令中携带的节点标识相匹配的节点数据;

若是,则依据所述数据修改指令中携带待替换数据,对所述节点数据进行修改,并对修改后的节点数据设置脏标志;

若否,则判断所述dcpmm内存中是否存在与所述数据修改指令中携带的节点标识相匹配的节点数据;

当所述dcpmm内存中存在与所述数据修改指令中携带的节点标识相匹配的节点数据时,则依据所述数据修改指令中携带待替换数据,对所述节点数据进行修改;

当所述dcpmm内存中不存在与所述数据修改指令中携带的节点标识相匹配的节点数据时,则将所述硬盘中与所述数据修改指令中携带的节点标识相匹配的节点数据读取至所述dram内存中;依据所述数据修改指令中携带待替换数据,在所述dram内存中完成对所述节点数据的修改,并对修改后的节点数据设置脏标志。

可选地,在所述将所述b+树的底层数据存储至所述底层树文件之后还包括:

按照预设的周期时间将映射至dram内存中设置有脏标志的数据迁移至所述dcpmm内存中。

本发明实施例还提供了一种b+树的存取装置,包括第一判断单元、第一存储单元、创建单元和第二存储单元;

所述第一判断单元,用于获取到b+树创建指令时,判断是否存在映射到dram内存的空闲的底层树文件;若是,则触发所述第一存储单元;若否,则触发所述创建单元;

所述第一存储单元,用于将所述b+树的底层数据存储至所述底层树文件;

所述创建单元,用于新建一个目标底层数文件,并将所述目标底层树文件映射至dram内存,以便于将所述b+树的底层数据存储至所述目标底层树文件中;

所述第二存储单元,用于当所述b+树的层数大于或等于预设阈值时,则将所述b+树中层数大于或等于所述预设阈值的数据存储至预先设定的存储区域。

可选地,所述b+树对应有第一层级、第二层级和第三层级;其中,第一层级的数据作为底层数据;

相应的,所述第二存储单元具体用于将所述b+树的第二层级的数据存储至dcpmm内存中;将所述b+树的第三层级的数据存储至预设的硬盘中。

可选地,还包括作为单元;

所述作为单元,用于将所述dcpmm内存的最小读写粒度作为所述b+树的节点容量。

可选地,所述第一存储单元具体用于将所述b+树的底层数据按照所述节点容量向所述底层树文件中存储各节点数据;其中,每个节点数据的键值对中存储有下一层级节点的偏移地址。

可选地,还包括查询单元、确定单元和读取单元;

所述查询单元,用于当获取到数据查询指令时,依据所述数据查询指令中携带的逻辑地址,确定出根节点;

所述确定单元,用于根据所述根节点中包含的偏移地址,确定出叶子节点;

所述读取单元,用于读取所述叶子节点对应的数据。

可选地,还包括第二判断单元、修改单元、设置单元、第三判断单元和读取单元;

所述第二判断单元,用于当获取到数据修改指令时,判断所述dram内存中是否存在与所述数据修改指令中携带的节点标识相匹配的节点数据;若是,则触发所述修改单元;若否,则触发所述第三判断单元;

所述修改单元,用于依据所述数据修改指令中携带待替换数据,对所述节点数据进行修改,

所述设置单元,用于对修改后的节点数据设置脏标志;

所述第三判断单元判断所述dcpmm内存中是否存在与所述数据修改指令中携带的节点标识相匹配的节点数据;

所述修改单元还用于当所述dcpmm内存中存在与所述数据修改指令中携带的节点标识相匹配的节点数据时,则依据所述数据修改指令中携带待替换数据,对所述节点数据进行修改;

所述读取单元,用于当所述dcpmm内存中不存在与所述数据修改指令中携带的节点标识相匹配的节点数据时,则将所述硬盘中与所述数据修改指令中携带的节点标识相匹配的节点数据读取至所述dram内存中;

所述修改单元还用于依据所述数据修改指令中携带待替换数据,在所述dram内存中完成对所述节点数据的修改,并触发所述设置单元对修改后的节点数据设置脏标志。

可选地,还包括迁移单元;

所述迁移单元,用于按照预设的周期时间将映射至dram内存中设置有脏标志的数据转移至所述dcpmm内存中。

本发明实施例还提供了一种b+树的存取装置,包括:

存储器,用于存储计算机程序;

处理器,用于执行所述计算机程序以实现如上述任意一项所述b+树的存取方法的步骤。

本发明实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如上述任意一项所述b+树的存取方法的步骤。

由上述技术方案可以看出,获取到b+树创建指令时,判断是否存在映射到dram内存的空闲的底层树文件;当存在映射到dram内存的空闲的底层树文件时,则可以直接将b+树的底层数据存储至底层树文件。当不存在映射到dram内存的空闲的底层树文件时,则需要新建一个目标底层数文件,并将目标底层树文件映射至dram内存,以便于将b+树的底层数据存储至目标底层树文件中。当b+树的层数大于或等于预设阈值时,则将b+树中层数大于或等于预设阈值的数据存储至预先设定的存储区域。基于b+树的数据结构,每次数据的读取都需要从底层数据访问,因此底层数据被访问的次数较多,通过将底层文件存储在映射到dram内存的空闲的底层树文件,有效的提升了底层数据的访问效率。而b+树中除底层数据外的其它数据被访问的次数相对较少,为了降低对dram内存的占用,可以将其它数据存储在除dram内存外的存储空间中,既提升了dram内存资源的利用率,又可以保证b+树的读写效率。

附图说明

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

图1为本发明实施例提供的一种b+树的存取方法的流程图;

图2为本发明实施例提供的一种b+树的数据修改方法的流程图;

图3为本发明实施例提供的一种b+树的存取装置的结构示意图;

图4为本发明实施例提供的一种b+树的存取装置的硬件结构示意图。

具体实施方式

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

为了使本技术领域的人员更好地理解本发明方案,下面结合附图和具体实施方式对本发明作进一步的详细说明。

接下来,详细介绍本发明实施例所提供的一种b+树的存取方法。图1为本发明实施例提供的一种b+树的存取方法的流程图,该方法包括:

s101:获取到b+树创建指令时,判断是否存在映射到dram内存的空闲的底层树文件。

当存在映射到dram内存的空闲的底层树文件时,则说明dram内存中存在可以用于存储b+树的文件,此时可以执行s102。

当不存在映射到dram内存的空闲的底层树文件时,则说明当前的dram内存中不存在用于存储b+树的文件,此时可以执行s103。

s102:将b+树的底层数据存储至底层树文件。

s103:新建一个目标底层数文件,并将目标底层树文件映射至dram内存,以便于将b+树的底层数据存储至目标底层树文件中。

基于b+树的数据结构,每次数据的读取都需要从底层数据访问,因此底层数据被访问的次数较频繁,通过将底层文件存储在映射到dram内存的空闲的底层树文件,有效的提升了底层数据的访问效率。

需要说明的是,为了便于区分,在本发明实施例中,将新建的底层树文件称作目标底层树文件,对于存储系统而言,新建的目标底层树文件与底层树文件均是用于存储底层数据的文件,两者并不存在实质性区别。

s104:当b+树的层数大于或等于预设阈值时,则将b+树中层数大于或等于预设阈值的数据存储至预先设定的存储区域。

b+树包含有多层数据,在本发明实施例中,可以将b+树的数据进行不同层级的划分,不同层级的数据被访问的频率和次数有所差异,因此,可以将不同层级的数据存储在不同的位置。

在具体实现中,可以将b+树划分为第一层级、第二层级和第三层级;其中,第一层级的数据作为底层数据。

在b+树创建初期,底层数据被访问的频率较高,因此,在本发明实施例中,将底层数据存储在映射到dram内存的空闲的底层树文件中。

考虑到数据中心级持久性内存模块(dcpersistentmemorymodule,dcpmm)在devicedax模式下可以实现数据的直接存取,无需依赖于dram内存,devicedax模式下的dcpmm器件可以看作是dcpmm内存。在本发明实施例中,可以将b+树的第二层级的数据存储至dcpmm内存中。

为了精确的控制dcpmm的使用,避免dcpmm资源的浪费,可以将b+树的第三层级的数据存储至预设的硬盘中。

在实际应用中,可以将b+树的第一层文件至第三层文件作为第一层级,将第四层文件和第五层文件作为第二层级,将大于第五层文件的数据作为第三层级。

由上述技术方案可以看出,获取到b+树创建指令时,判断是否存在映射到dram内存的空闲的底层树文件;当存在映射到dram内存的空闲的底层树文件时,则可以直接将b+树的底层数据存储至底层树文件。当不存在映射到dram内存的空闲的底层树文件时,则需要新建一个目标底层数文件,并将目标底层树文件映射至dram内存,以便于将b+树的底层数据存储至目标底层树文件中。当b+树的层数大于或等于预设阈值时,则将b+树中层数大于或等于预设阈值的数据存储至预先设定的存储区域。基于b+树的数据结构,每次数据的读取都需要从底层数据访问,因此底层数据被访问的次数较多,通过将底层文件存储在映射到dram内存的空闲的底层树文件,有效的提升了底层数据的访问效率。而b+树中除底层数据外的其它数据被访问的次数相对较少,为了降低对dram内存的占用,可以将其它数据存储在除dram内存外的存储空间中,既提升了dram内存资源的利用率,又可以保证b+树的读写效率。

在b+树的创建初期,底层数据被访问的次数较为频繁,因此可以将底层数据存储在dram内存中,随着存储时间的增长,b+树的底层数据被访问的频率有所下降,为了提升dram内存的利用率,因此,在具体实现中,可以对存储于dram内存中的底层数据设置脏标识,以便于可以将存储在dram内存中的底层数据周期性迁移至dcpmm内存中。

为了提升数据的读取效率,在具体实现中,可以将dcpmm内存的最小读写粒度作为b+树的节点容量。dcpmm内存的内部最小读写粒度为256字节,因此,可以将一个b+树节点的容量设置为256字节,也即每256字节数据产生一组校验保护数据。

在本发明实施例中,可以将b+树的底层数据按照节点容量向底层树文件中存储各节点数据;其中,每个节点数据的键值对中存储有下一层级节点的偏移地址。

在实际应用中,每个节点可以包含一个16字节的节点头和最多15个键值对。节点头包含节点类型等信息。其中,节点类型包括叶子节点和非叶子节点。对于叶子节点,其键值对中的值为raid物理地址,依据该raid物理地址,可以读取到叶子节点所对应的具体数据;对于非叶子节点,其键值对中可以存储下一层级节点的偏移地址。

当获取到数据查询指令时,可以依据数据查询指令中携带的逻辑地址,确定出根节点;根据根节点中包含的偏移地址,确定出叶子节点;并读取叶子节点对应的数据。

举例说明,当需要查询b+树的数据时,可以在数据查询指令中携带数据卷的逻辑地址。根据该逻辑地址,可以找到这个数据卷的元数据,如果元数据中保护根节点内存地址,则该树的底层树文件在内存中,依据底层树文件中相应节点中存储的偏移地址,可以查找叶子节点,如果走到第3层节点仍然不是叶子节点,则从元数据读取第3层文件中相应节点的偏移地址,从而得到第4层文件的存储地址。如果该节点仍然为非叶子节点,则继续进行第5层节点的访问。如果5层节点仍然不是叶子节点,则读入第三层级的文件到内存,继续查找,直到到达叶子节点为止,根据叶子节点的键值对存储的raid物理地址,便可以读取到叶子节点所对应的具体数据。

b+树的数据按照划分的层级存储在不同的位置,当需要修改b+树的数据时,可以按照存储位置查询所需修改的数据所在的存储位置,以实现对b+树中数据的修改,如图2所示为本发明实施例提供的一种b+树的数据修改方法的流程图,包括:

s201:当获取到数据修改指令时,判断dram内存中是否存在与数据修改指令中携带的节点标识相匹配的节点数据。

当dram内存中存在与数据修改指令中携带的节点标识相匹配的节点数据,则执行s202。

当dram内存中不存在与数据修改指令中携带的节点标识相匹配的节点数据,则需要进一步确定所需修改的节点数据所在的位置,此时可以执行s203。

s202:依据数据修改指令中携带待替换数据,对节点数据进行修改,并对修改后的节点数据设置脏标志。

节点数据存储在dram内存中,会占用dram内存的资源,为了提升dram资源的利用率,可以对修改后的节点数据设置脏标志,以便于后续可以按照预设的周期时间将映射至dram内存中设置有脏标志的数据迁移至dcpmm内存中。

s203:判断dcpmm内存中是否存在与数据修改指令中携带的节点标识相匹配的节点数据。

当dcpmm内存中存在与数据修改指令中携带的节点标识相匹配的节点数据,则执行s204。

在本发明实施例中,b+树的数据按照不同的层级会分别存储在dram内存、dcpmm内存以及预设的硬盘中,当dram内存中不存在与数据修改指令中携带的节点标识相匹配的节点数据,并且dcpmm内存中也不存在与数据修改指令中携带的节点标识相匹配的节点数据,则说明所需修改的节点数据存储在预设的硬盘中,此时可以执行s205。

s204:依据数据修改指令中携带待替换数据,对节点数据进行修改。

s205:将硬盘中与数据修改指令中携带的节点标识相匹配的节点数据读取至dram内存中。

由于硬盘中的数据无法直接进行修改,因此,当所需修改的节点数据存储在预设的硬盘中时,需要将硬盘中与数据修改指令中携带的节点标识相匹配的节点数据读取至dram内存中。

s206:依据数据修改指令中携带待替换数据,在dram内存中完成对节点数据的修改,并对修改后的节点数据设置脏标志。

当所需修改的节点数据存储在dram内存中或者硬盘中时,修改后的节点数据会存储在dram内存中,由于dram内存资源有限,为了避免修改后的节点数据长时间占用dram内存的资源,因此在本发明实施例中,可以将存储在dram内存中的修改后的节点数据设置脏标识,以便于后续可以按照预设的周期时间将映射至dram内存中设置有脏标志的数据迁移至dcpmm内存中。

通过定期对存储在dram内存中数据迁移,避免了b+树的数据长时间占用dram内存的资源,有效的提升了存储系统的处理性能。

图3为本发明实施例提供的一种b+树的存取装置的结构示意图,包括第一判断单元31、第一存储单元32、创建单元33和第二存储单元34;

第一判断单元31,用于获取到b+树创建指令时,判断是否存在映射到dram内存的空闲的底层树文件;若是,则触发第一存储单元32;若否,则触发创建单元33;

第一存储单元32,用于将b+树的底层数据存储至底层树文件;

创建单元33,用于新建一个目标底层数文件,并将目标底层树文件映射至dram内存,以便于将b+树的底层数据存储至目标底层树文件中;

第二存储单元34,用于当b+树的层数大于或等于预设阈值时,则将b+树中层数大于或等于预设阈值的数据存储至预先设定的存储区域。

可选地,b+树对应有第一层级、第二层级和第三层级;其中,第一层级的数据作为底层数据;

相应的,第二存储单元具体用于将b+树的第二层级的数据存储至dcpmm内存中;将b+树的第三层级的数据存储至预设的硬盘中。

可选地,还包括作为单元;

作为单元,用于将dcpmm内存的最小读写粒度作为b+树的节点容量。

可选地,第一存储单元具体用于将b+树的底层数据按照节点容量向底层树文件中存储各节点数据;其中,每个节点数据的键值对中存储有下一层级节点的偏移地址。

可选地,还包括查询单元、确定单元和读取单元;

查询单元,用于当获取到数据查询指令时,依据数据查询指令中携带的逻辑地址,确定出根节点;

确定单元,用于根据根节点中包含的偏移地址,确定出叶子节点;

读取单元,用于读取叶子节点对应的数据。

可选地,还包括第二判断单元、修改单元、设置单元、第三判断单元和读取单元;

第二判断单元,用于当获取到数据修改指令时,判断dram内存中是否存在与数据修改指令中携带的节点标识相匹配的节点数据;若是,则触发修改单元;若否,则触发第三判断单元;

修改单元,用于依据数据修改指令中携带待替换数据,对节点数据进行修改,

设置单元,用于对修改后的节点数据设置脏标志;

第三判断单元判断dcpmm内存中是否存在与数据修改指令中携带的节点标识相匹配的节点数据;

修改单元还用于当dcpmm内存中存在与数据修改指令中携带的节点标识相匹配的节点数据时,则依据数据修改指令中携带待替换数据,对节点数据进行修改;

读取单元,用于当dcpmm内存中不存在与数据修改指令中携带的节点标识相匹配的节点数据时,则将硬盘中与数据修改指令中携带的节点标识相匹配的节点数据读取至dram内存中;

修改单元还用于依据数据修改指令中携带待替换数据,在dram内存中完成对节点数据的修改,并触发设置单元对修改后的节点数据设置脏标志。

可选地,还包括迁移单元;

迁移单元,用于按照预设的周期时间将映射至dram内存中设置有脏标志的数据转移至dcpmm内存中。

图3所对应实施例中特征的说明可以参见图1和图2所对应实施例的相关说明,这里不再一一赘述。

由上述技术方案可以看出,获取到b+树创建指令时,判断是否存在映射到dram内存的空闲的底层树文件;当存在映射到dram内存的空闲的底层树文件时,则可以直接将b+树的底层数据存储至底层树文件。当不存在映射到dram内存的空闲的底层树文件时,则需要新建一个目标底层数文件,并将目标底层树文件映射至dram内存,以便于将b+树的底层数据存储至目标底层树文件中。当b+树的层数大于或等于预设阈值时,则将b+树中层数大于或等于预设阈值的数据存储至预先设定的存储区域。基于b+树的数据结构,每次数据的读取都需要从底层数据访问,因此底层数据被访问的次数较多,通过将底层文件存储在映射到dram内存的空闲的底层树文件,有效的提升了底层数据的访问效率。而b+树中除底层数据外的其它数据被访问的次数相对较少,为了降低对dram内存的占用,可以将其它数据存储在除dram内存外的存储空间中,既提升了dram内存资源的利用率,又可以保证b+树的读写效率。

图4为本发明实施例提供的一种b+树的存取装置40的硬件结构示意图,包括:

存储器41,用于存储计算机程序;

处理器42,用于执行所述计算机程序以实现如上述任意实施例所述的b+树的存取方法的步骤。

本发明实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如上述任意实施例所述的b+树的存取方法的步骤。

以上对本发明实施例所提供的一种b+树的存取方法、装置和计算机可读存储介质进行了详细介绍。说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。

专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或技术领域内所公知的任意其它形式的存储介质中。

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