一种键值分离的键值存储引擎索引优化方法及装置转让专利

申请号 : CN202210545019.9

文献号 : CN114896250B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 孙大为吴旗

申请人 : 中国地质大学(北京)

摘要 :

本发明涉及计算机存储技术领域,特别是指一种键值分离的键值存储引擎索引优化方法及装置,方法包括:当接收到写命令时,获取待写入的键值对,基于预设阈值进行条件键值分离处理,记录键值分离处理的次数;将键值分离处理的次数与预设次数阈值进行比较,得到第一参数;获取SSTable的生命周期,将生命周期与预设生命周期阈值进行比较,得到第二参数;根据第一参数以及第二参数,判断是否对SSTable构建学习索引模型;当确定对SSTable构建学习索引模型时,基于SSTable构建学习索引模型;当接收到读命令时,基于学习索引模型进行读操作。采用本发明,可以减少查询步骤产生的延迟,提高数据查询效率。

权利要求 :

1.一种键值分离的键值存储引擎索引优化方法,其特征在于,所述方法包括:当接收到写命令时,获取待写入的键值对,基于预设阈值进行条件键值分离处理,记录键值分离处理的次数;

将所述键值分离处理的次数与预设次数阈值进行比较,得到第一参数;

获取SSTable的生命周期,将所述生命周期与预设生命周期阈值进行比较,得到第二参数;

根据所述第一参数以及所述第二参数,判断是否对所述SSTable构建学习索引模型;

当确定对所述SSTable构建学习索引模型时,基于所述SSTable构建学习索引模型;

当接收到读命令时,基于所述学习索引模型进行读操作;

其中,所述基于预设阈值进行条件键值分离处理,包括:获取预设阈值,将键值对中的值与预设阈值进行比较,如果所述值大于预设阈值,则将键值对中的键与值分离,将键与指向值日志的指针重新组成键值对;

如果所述值小于或等于预设阈值,则判断值的长度是否等于值预设长度,如果不是,则对所述值进行补0,使得所述值的长度等于值预设长度;

其中,所述将所述键值分离处理的次数与预设次数阈值进行比较,得到第一参数,包括:将所述键值分离处理的次数与预设次数阈值进行比较,如果所述键值分离处理的次数大于预设次数阈值,则确定第一参数为0,如果所述键值分离处理的次数小于或等于预设次数阈值,则确定第一参数为1;

其中,所述将所述生命周期与预设生命周期阈值进行比较,得到第二参数,包括:将所述生命周期与预设生命周期阈值进行比较,如果所述生命周期大于预设生命周期阈值,则确定第二参数为1,如果所述生命周期小于或等于预设生命周期阈值,则确定第二参数为0;

其中,所述根据所述第一参数以及所述第二参数,判断是否对所述SSTable构建学习索引模型,包括:当所述第一参数为0、且所述第二参数为0时,确定对所述SSTable不构建学习索引模型;

当所述第一参数为1、且所述第二参数为0时,确定对所述SSTable构建学习索引模型;

当所述第一参数为0、且所述第二参数为1时,确定对所述SSTable构建学习索引模型;

当所述第一参数为1、且所述第二参数为1时,确定对所述SSTable构建学习索引模型;

其中,所述当接收到读命令时,基于所述学习索引模型进行读操作,包括:基于所述学习索引模型读取索引路径,根据所述索引路径确定读命令对应的目标键存在的字节范围;

根据所述字节范围提取对应的数据块,使用布隆过滤器对目标键进行计算,得到读命令对应的目标值是否存储在所述数据块的结果;

当确定目标值存储在所述数据块时,基于所述学习索引模型确定读命令对应的目标键值对,根据所述目标键值对读取目标值。

2.根据权利要求1所述的方法,其特征在于,所述基于所述学习索引模型确定读命令对应的目标键值对,包括:获取键预设长度以及值预设长度;

获取所述学习索引模型输出的偏移量;

确定所述键预设长度与所述值预设长度的和值,确定所述和值与所述偏移量的乘积;

根据所述乘积定位读命令对应的目标键值对。

3.一种键值分离的键值存储引擎索引优化装置,其特征在于,所述键值分离的键值存储引擎索引优化装置用于实现键值分离的键值存储引擎索引优化方法,所述装置包括:分离模块,用于当接收到写命令时,获取待写入的键值对,基于预设阈值进行条件键值分离处理,记录键值分离处理的次数;

第一比较模块,用于将所述键值分离处理的次数与预设次数阈值进行比较,得到第一参数;

第二比较模块,用于获取SSTable的生命周期,将所述生命周期与预设生命周期阈值进行比较,得到第二参数;

判断模块,用于根据所述第一参数以及所述第二参数,判断是否对所述SSTable构建学习索引模型;

构建模块,用于当确定对所述SSTable构建学习索引模型时,基于所述SSTable构建学习索引模型;

读操作模块,用于当接收到读命令时,基于所述学习索引模型进行读操作;

其中,所述分离模块,用于:

获取预设阈值,将键值对中的值与预设阈值进行比较,如果所述值大于预设阈值,则将键值对中的键与值分离,将键与指向值日志的指针重新组成键值对;

如果所述值小于或等于预设阈值,则判断值的长度是否等于值预设长度,如果不是,则对所述值进行补0,使得所述值的长度等于值预设长度;

其中,所述第一比较模块,用于:

将所述键值分离处理的次数与预设次数阈值进行比较,如果所述键值分离处理的次数大于预设次数阈值,则确定第一参数为0,如果所述键值分离处理的次数小于或等于预设次数阈值,则确定第一参数为1;

其中,所述第二比较模块,用于:

将所述生命周期与预设生命周期阈值进行比较,如果所述生命周期大于预设生命周期阈值,则确定第二参数为1,如果所述生命周期小于或等于预设生命周期阈值,则确定第二参数为0;

其中,所述判断模块,用于:

当所述第一参数为0、且所述第二参数为0时,确定对所述SSTable不构建学习索引模型;

当所述第一参数为1、且所述第二参数为0时,确定对所述SSTable构建学习索引模型;

当所述第一参数为0、且所述第二参数为1时,确定对所述SSTable构建学习索引模型;

当所述第一参数为1、且所述第二参数为1时,确定对所述SSTable构建学习索引模型;

其中,所述读操作模块,用于:

基于所述学习索引模型读取索引路径,根据所述索引路径确定读命令对应的目标键存在的字节范围;

根据所述字节范围提取对应的数据块,使用布隆过滤器对目标键进行计算,得到读命令对应的目标值是否存储在所述数据块的结果;

当确定目标值存储在所述数据块时,基于所述学习索引模型确定读命令对应的目标键值对,根据所述目标键值对读取目标值。

说明书 :

一种键值分离的键值存储引擎索引优化方法及装置

技术领域

[0001] 本发明涉及计算机存储技术领域,特别是指一种键值分离的键值存储引擎索引优化方法及装置。

背景技术

[0002] LSM‑tree(Log Structured Merge Tree,日志结构的合并树)是键值存储的存储引擎,由三个数据结构组成:内存表分为Memtable和ImmutableTable,磁盘上为SSTable(Sorted String Table,排序字符串表)文件,SSTable文件是层次结构,每层按key range分区存放在多个SSTable中。LSM‑Tree有很好的顺序写性能,为了满足读性能使数据更加紧凑,引入了分级合并操作,后台合并的重写操作带来额外I/O引起写放大问题,损失了系统的写性能和SSD的耐久性。
[0003] 无论是LevelDB以及WiscKey,其读取文件的路径都是基本一致的。一般来说,一个查询通常会先从内存表及缓存中访问,当两者皆无时才会访问持久化数据进行读取。由于LSM‑tree属于异地更新,树中会有多个版本的值,然而自顶向下的写入结构以及读取方式,保证返回读取到的是最新的值。
[0004] 图1是读一个SSTable文件内包含所有块步骤的细节架构图。需要注意的是,块是LSM‑tree最小粒度的可操作单位,对块的读取总共可以分为以下七个步骤:
[0005] 1、找文件,对于整颗LSM‑tree来说,会在内存中维护一个索引记录除顶层之外的所有SSTable的区间。当一个查询到达持久性介质时,首先会访问顶层的所有SSTable文件,原因是顶层的每个文件之间无序,只在内部有序,文件和文件会有键区间的相交。然后剩下的每层,若是查询处于该层的区间里,每层只需读一个SSTable文件即可。满足条件的SSTable文件成为候选SSTable,并按自顶向下的顺序在内存中进行访问。
[0006] 2、加载索引块和过滤器块,由第一步知道,读取操作会选择多个候选SSTable文件。而这不代表会直接将整个SSTable文件提到内存中并进行二分查找,可以通过更细粒度对块进行访问减少花销。索引块指的是SSTable下内部切分块的目录,用于查找对应的数据块。过滤器块则指的是布隆过滤器块,可以常数级别的排除Key不存在的情况。
[0007] 3、查索引块,对索引块进行二分查找,找到对应的块。
[0008] 4、查过滤器块,用布隆过滤器块进行过滤计算,当布隆过滤器中所有哈希函数计算返回结果都为1时,进行第五步。
[0009] 5、加载数据块,把该数据块加载到内存中。
[0010] 6、查数据块,数据块内部的键值对是以Key大小有序排列,在该有序块中进行二分查找。
[0011] 7、读值,找到所要查询的键,读键紧跟着的值并返回给上层用户查询结果。
[0012] 从以上查询流程中可以看出,经历第3步才能选中要提取的块,再加上第6 步的数据块内部查找共计两次二分查找,此两步功能上类似于索引读取操作。随着持久性介质的性能愈来愈高,对于数据访问的加持也越来越大,然而上述7 个步骤中受介质变化获益程度却大相径庭,结果是第3、第6步索引读取占查找延迟的比例会随着磁盘性能的增大而增大,原因是磁盘性能变强使得其余步骤的数据访问操作占比愈来愈低。在理想情况下纯内存读取两步二分查找操作占总读取延迟比值最大,导致数据查询的效率降低。

发明内容

[0013] 为了解决现有技术中二分查找导致延迟较大、数据查询效率较低的问题,本发明实施例提供了一种键值分离的键值存储引擎索引优化方法及装置。所述技术方案如下:
[0014] 一方面,提供了一种键值分离的键值存储引擎索引优化方法,该方法由键值分离的键值存储引擎索引优化装置实现,该方法包括:
[0015] 当接收到写命令时,获取待写入的键值对,基于预设阈值进行条件键值分离处理,记录键值分离处理的次数;
[0016] 将所述键值分离处理的次数与预设次数阈值进行比较,得到第一参数;
[0017] 获取SSTable的生命周期,将所述生命周期与预设生命周期阈值进行比较,得到第二参数;
[0018] 根据所述第一参数以及所述第二参数,判断是否对所述SSTable构建学习索引模型;
[0019] 当确定对所述SSTable构建学习索引模型时,基于所述SSTable构建学习索引模型;
[0020] 当接收到读命令时,基于所述学习索引模型进行读操作。
[0021] 可选地,所述基于预设阈值进行条件键值分离处理,包括:
[0022] 获取预设阈值,将键值对中的值与预设阈值进行比较,如果所述值大于预设阈值,则将键值对中的键与值分离,将键与指向值日志的指针重新组成键值对;
[0023] 如果所述值小于或等于预设阈值,则判断值的长度是否等于值预设长度,如果不是,则对所述值进行补0,使得所述值的长度等于值预设长度。
[0024] 可选地,所述将所述键值分离处理的次数与预设次数阈值进行比较,得到第一参数,包括:
[0025] 将所述键值分离处理的次数与预设次数阈值进行比较,如果所述键值分离处理的次数大于预设次数阈值,则确定第一参数为0,如果所述键值分离处理的次数小于或等于预设次数阈值,则确定第一参数为1。
[0026] 可选地,所述将所述生命周期与预设生命周期阈值进行比较,得到第二参数,包括:
[0027] 将所述生命周期与预设生命周期阈值进行比较,如果所述生命周期大于预设生命周期阈值,则确定第二参数为1,如果所述生命周期小于或等于预设生命周期阈值,则确定第二参数为0。
[0028] 可选地,所述根据所述第一参数以及所述第二参数,判断是否对所述 SSTable构建学习索引模型,包括:
[0029] 当所述第一参数为0、且所述第二参数为0时,确定对所述SSTable不构建学习索引模型;
[0030] 当所述第一参数为1、且所述第二参数为0时,确定对所述SSTable构建学习索引模型;
[0031] 当所述第一参数为0、且所述第二参数为1时,确定对所述SSTable构建学习索引模型;
[0032] 当所述第一参数为1、且所述第二参数为1时,确定对所述SSTable构建学习索引模型。
[0033] 可选地,所述当接收到读命令时,基于所述学习索引模型进行读操作,包括:
[0034] 基于所述学习索引模型读取索引路径,根据所述索引路径确定读命令对应的目标键存在的字节范围;
[0035] 根据所述字节范围提取对应的数据块,使用布隆过滤器对目标键进行计算,得到读命令对应的目标值是否存储在所述数据块的结果;
[0036] 当确定目标值存储在所述数据块时,基于所述学习索引模型确定读命令对应的目标键值对,根据所述目标键值对读取目标值。
[0037] 可选地,所述基于所述学习索引模型确定读命令对应的目标键值对,包括:
[0038] 获取键预设长度以及值预设长度;
[0039] 获取所述学习索引模型输出的偏移量;
[0040] 确定所述键预设长度与所述值预设长度的和值,确定所述和值与所述偏移量的乘积;
[0041] 根据所述乘积定位读命令对应的目标键值对。
[0042] 另一方面,提供了一种键值分离的键值存储引擎索引优化装置,该系统应用于键值分离的键值存储引擎索引优化方法,该装置包括:
[0043] 分离模块,用于当接收到写命令时,获取待写入的键值对,基于预设阈值进行条件键值分离处理,记录键值分离处理的次数;
[0044] 第一比较模块,用于将所述键值分离处理的次数与预设次数阈值进行比较,得到第一参数;
[0045] 第二比较模块,用于获取SSTable的生命周期,将所述生命周期与预设生命周期阈值进行比较,得到第二参数;
[0046] 判断模块,用于根据所述第一参数以及所述第二参数,判断是否对所述 SSTable构建学习索引模型;
[0047] 构建模块,用于当确定对所述SSTable构建学习索引模型时,基于所述SSTable构建学习索引模型;
[0048] 读操作模块,用于当接收到读命令时,基于所述学习索引模型进行读操作。
[0049] 可选地,所述分离模块,用于:
[0050] 获取预设阈值,将键值对中的值与预设阈值进行比较,如果所述值大于预设阈值,则将键值对中的键与值分离,将键与指向值日志的指针重新组成键值对;
[0051] 如果所述值小于或等于预设阈值,则判断值的长度是否等于值预设长度,如果不是,则对所述值进行补0,使得所述值的长度等于值预设长度。
[0052] 可选地,所述第一比较模块,用于:
[0053] 将所述键值分离处理的次数与预设次数阈值进行比较,如果所述键值分离处理的次数大于预设次数阈值,则确定第一参数为0,如果所述键值分离处理的次数小于或等于预设次数阈值,则确定第一参数为1。
[0054] 可选地,所述第二比较模块,用于:
[0055] 将所述生命周期与预设生命周期阈值进行比较,如果所述生命周期大于预设生命周期阈值,则确定第二参数为1,如果所述生命周期小于或等于预设生命周期阈值,则确定第二参数为0。
[0056] 可选地,所述判断模块,用于:
[0057] 当所述第一参数为0、且所述第二参数为0时,确定对所述SSTable不构建学习索引模型;
[0058] 当所述第一参数为1、且所述第二参数为0时,确定对所述SSTable构建学习索引模型;
[0059] 当所述第一参数为0、且所述第二参数为1时,确定对所述SSTable构建学习索引模型;
[0060] 当所述第一参数为1、且所述第二参数为1时,确定对所述SSTable构建学习索引模型。
[0061] 可选地,所述读操作模块,用于:
[0062] 基于所述学习索引模型读取索引路径,根据所述索引路径确定读命令对应的目标键存在的字节范围;
[0063] 根据所述字节范围提取对应的数据块,使用布隆过滤器对目标键进行计算,得到读命令对应的目标值是否存储在所述数据块的结果;
[0064] 当确定目标值存储在所述数据块时,基于所述学习索引模型确定读命令对应的目标键值对,根据所述目标键值对读取目标值。
[0065] 可选地,所述读操作模块,用于:
[0066] 获取键预设长度以及值预设长度;
[0067] 获取所述学习索引模型输出的偏移量;
[0068] 确定所述键预设长度与所述值预设长度的和值,确定所述和值与所述偏移量的乘积;
[0069] 根据所述乘积定位读命令对应的目标键值对。
[0070] 另一方面,提供了一种电子设备,所述电子设备包括处理器和存储器,所述存储器中存储有至少一条指令,所述至少一条指令由所述处理器加载并执行以实现上述键值分离的键值存储引擎索引优化方法。
[0071] 另一方面,提供了一种计算机可读存储介质,所述存储介质中存储有至少一条指令,所述至少一条指令由处理器加载并执行以实现上述键值分离的键值存储引擎索引优化方法。
[0072] 本发明实施例提供的技术方案带来的有益效果至少包括:
[0073] 本发明实施例中,在键值分离的基础上,实现了一个具有成本控制学习索引方案的键值存储系统。首先,实现了一个基于值大小的值管理模块,通过修改键值对写路径,将满足条件的值写入值日志并记录其位置,减少了后续预写日志以及写内存表的写关键路径压力。并依靠值日志以及预写日志来保证一致性。该模块对负载进行感知并服务于学习索引模块进行收益分析。其次,实现了学习索引模块,通过分段线性回归模型学习SSTable文件。LSM‑tree在外存的查询路径中会打开SSTable文件,加载索引块以及数据块然后再查询,使用学习索引可以减少读取该两个查询块步骤的延迟。并通过值管理模块以及 SSTable文件的生命周期来决定是否学习来减少成本。最后,解决了键值对中键与值以及值指针不等长的问题,满足学习索引得出结果后只经过简单的计算即可定位到键进行读取的需求。该系统降低了整体查询延迟,并有效解决了写放大问题,并对负载类型有了更好的扩展性支持。

附图说明

[0074] 为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0075] 图1是本发明实施例提供的现有技术中LevelDB的查找路径的示意图;
[0076] 图2是本发明实施例提供的一种键值分离的键值存储引擎索引优化方法流程图;
[0077] 图3是本发明实施例提供的一种键值对不等长的结构示意图;
[0078] 图4是本发明实施例提供的一种键值分离的键值存储引擎索引优化的装置框图;
[0079] 图5是本发明实施例提供的一种电子设备框图。

具体实施方式

[0080] 为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合附图及具体实施例进行详细描述。
[0081] 本发明实施例提供了一种键值分离的键值存储引擎索引优化方法,该方法可以由电子设备实现,该电子设备可以是终端或服务器。如图2所示的键值分离的键值存储引擎索引优化方法流程图,该方法的处理流程可以包括如下的步骤:
[0082] S21、当接收到写命令时,获取待写入的键值对,基于预设阈值进行条件键值分离处理,记录键值分离处理的次数。
[0083] 一种可行的实施方式中,学习索引期望的学习对象是有序的,与LSM‑tree 的成块文件或者整个有序层都非常配称。然而,对于LSM‑tree来说,学习索引在进行学习后输出的是键的偏移量,如果键与值的长度不恒长,在得到偏移量后依旧需要复杂的查询过程。为了简化计算以及快速定位到键,需要对键与值进行定长处理,即人为把键值对分别划分一个上限。此时对键较好处理,因为对于常见的负载来说,其内不同键都是有相似长度以及规律的,比如常见的键即用户的数字ID,都是长度相同的一串有序数字,可以直接对其进行设定一个长度上限,如16字节。即使键较短不满设定的上限,可以通过补0填充。对于值来说,则无法简单通过划分上限进行处理,且补0的代价过高,此时引入键值分离技术,将值替换为指向值日志的指针,可以依靠存储指针来实现定长目的。
[0084] 不完全地键值分离以及完全分离的对比,如图3所示。键可以简单的设置定长。当如图3中较下方所示,允许值大小不等长,且和指针混合存储时,则会出现回归如传统LSM‑tree键后任意长度值的情况,不利于学习索引的结果计算。
[0085] 对于键值分离来说,减少合并时读取到内存中的数据体积这一步骤,是其对比原先键值对存在吞吐量提升的主要来源。当负载的键值对较小时,分离后参与合并的指针与未分离前的值体积过于接近,导致无法有效获取过多吞吐量提升,并且由于值存于值日志中,还需要额外考虑指针以及垃圾回收的花销,反而可能导致整体性能降低。键值分离带来的性能提升是显而易见的,然而这需要对负载的大小分布特征进行考虑。故期望将较大的值进行分离,而较小的值依旧存于键值对中继续写入流程。
[0086] 综上,本发明实施例设定了值管理模块,值管理模块是本发明实施例键值存储系统中接纳用户写操作的第一个模块组件。在本模块,除了响应用户写操作,还包括实现了条件键值分离和计数器。条件键值分离值按照阈值选择性的将值写入值日志,并且在之后的写入流程中,输出键值对以及键与对应指向值日志的指针。条件键值分离与预写日志一起保证一致性。相应的处理过程可以包括以下步骤S211‑S212:
[0087] S211、获取预设阈值,将键值对中的值与预设阈值进行比较,如果值大于预设阈值,则将键值对中的键与值分离,将键与指向值日志的指针重新组成键值对,记录键值分离处理的次数。
[0088] 一种可行的实施方式中,如果值大于预设阈值,则将值存入值日志中,并生成指向值日志的指针,相应的算法伪代码可以如下:
[0089]
[0090] S212、如果值小于或等于预设阈值,则判断值的长度是否等于值预设长度,如果不是,则对值进行补0,使得值的长度等于值预设长度。
[0091] 条件键值分离比将所有键值对数据都进行键值分离有着更好的负载感知度以及扩展性,可以较好的将不同值大小的键值对形成区分,使写入带宽花销得到减少的同时,使小于阈值的键值对参与到合并中去,减少后续垃圾回收的额外花销。
[0092] S22、将键值分离处理的次数与预设次数阈值进行比较,得到第一参数。
[0093] 其中,第一参数用于反映负载情况,第一参数可以是0或者1,设定第一参数为0时表示当前为写负载,设定第一参数是1时表示当前为读负载。
[0094] 一种可行的实施方式中,根据LSM‑tree分级合并方式,显而易见的是当负载存在写入操作时,会对SSTable文件进行破坏,从而影响学习索引的收益。通过实验发现,即便负载存在少量的写入操作,位于最顶层的SSTable文件也可以存活至分钟级别,因此可以通过跟踪对比次数进而匹配负载存在写入比例不超过一定限制的结果,并将结果传递给学习索引模块作为是否学习SSTable 文件的参考。S22具体的处理过程可以如下:将键值分离处理的次数与预设次数阈值进行比较,如果键值分离处理的次数大于预设次数阈值,则确定第一参数为0,如果键值分离处理的次数小于或等于预设次数阈值,则确定第一参数为1。
[0095] 一种可行的实施方式中,如果处理键值分离的次数较多,说明接收到的写命令较多,可以依据此判断,当前主要是写为主的负载,即为写负载,因此,将第一参数确定为0;如果处理键值分离的次数较少,说明当前接收到的写命令较少,可以依据此判断,当前可能是以读为主的负载,即为读负载,因此,将第一参数确定为1,相应的算法伪代码可以如下:
[0096]
[0097] S23、将生命周期与预设生命周期阈值进行比较,确定第二参数。
[0098] 其中,第二参数用于反映SSTable的生命周期,设定第二参数为0时表示生命周期不满足条件,设定第二参数为1时表示生命周期满足条件。
[0099] 一种可行的实施方式中,学习索引模块接受值管理模块传递的参数以及 SSTable的生命周期。对于SSTable文件,需要监听其生命周期以及是否超过预设生命周期阈值,如果未超过预设生命周期阈值,说明SSTable的变化很快,有效期很短,如果对此SSTable建立学习索引模型,学习索引模型可能很快失效,收益较少;如果生命周期超过预设生命周期阈值,说明SSTable较稳定,对此SSTable建立学习索引模型,学习索引模型也较稳定,可以受益较多。
[0100] S23的具体处理可以如下:将生命周期与预设生命周期阈值进行比较,如果生命周期大于预设生命周期阈值,则确定第二参数为1,如果生命周期小于或等于预设生命周期阈值,则确定第二参数为0。
[0101] 需要说明的是,确定生命周期大于预设生命周期阈值后,无需再对其进行生命周期跟踪,对于该记录生命周期的元数据,可以依靠文件系统创建SSTable 文件的时间,持久化到本地,也可以在本地已经持久化的manifest进行修改。对从数据库加载阶段建立的SSTable,将加载时间开始的时间戳作为其生命周期开始时间,而对于后续写入合并产生的其他SSTable,则以形成新组件的时间作为生命周期开始时间。
[0102] S24、根据第一参数以及第二参数,判断是否对SSTable构建学习索引模型。
[0103] 一种可行的实施方式中,构建一个学习索引可以把对数级别的查询延迟降低,这是更改一种索引得到的收益,然而,学习索引是与负载以及数据分布产生依赖的,一旦所学习的对象(即SSTable)更改或者消失后,学习索引就无法有效执行其功能,对键所在的位置预测功能则会失效。因此,在选择学习对象上是一个着重考虑的前提。
[0104] 通过面向学习对象选择的分析,可以得出以下结论:对于学习索引,需要综合考虑负载变化以及成本收益,来选择合适的学习对象。1.感知负载变化,尽管位于较底层的级别和文件更符合具有生命周期的特性,但若是不能感知负载的变化,即便较底层拥有更多的数据,响应不到读请求就不会得到优化提升; 2.在文件生命周期超过一定阈值才进行学习,避免模型学习过程还未结束,学习的对象分布已经打破。
[0105] 基于上述分析,设定第一参数反映负载变化,设定第二参数反映生命周期情况,根据上述步骤S24以及S25传递的第一参数和第二参数,可以分为以下四种情况:
[0106] (1)当第一参数为0、且第二参数为0时,确定对SSTable不构建学习索引模型;
[0107] (2)当第一参数为1、且第二参数为0时,确定对SSTable构建学习索引模型;
[0108] (3)当第一参数为0、且第二参数为1时,确定对SSTable构建学习索引模型;
[0109] (4)当第一参数为1、且第二参数为1时,确定对SSTable构建学习索引模型。
[0110] 相应的算法伪代码可以如下:
[0111]
[0112] S25、当确定对SSTable构建学习索引模型时,基于SSTable构建学习索引模型。
[0113] 一种可行的实施方式中,对于学习索引模型,在经过实验与观察后,发现 SSTable内部的键值对或键值指针有序,其学习对象分布非常符合学习索引模型的建立。对于该学习对象,不需要复杂的学习索引模型,比如上述提到的RMI 等神经网络模型来参与模拟过程,且大小以及训练时长与所期待的模型不符,模型选择应该轻量化且训练快速,故在本系统中,使用线性回归表达算法来作为学习索引模型建立的算法,并将误差界限设为8。
[0114] 对SSTable构建学习索引模型后,无需再执行上述步骤S21‑S24,直到 SSTable合并、学习索引模型失效。
[0115] S26、当接收到读命令时,基于学习索引模型进行读操作。
[0116] 一种可行的实施方式中,LSM‑tree在外存的查询路径中会打开SSTable文件,加载索引块以及数据块然后再查询,使用学习索引可以减少读取该两个查询块步骤的延迟。读操作具体可以包括以下步骤S261‑S23:
[0117] S261、基于学习索引模型读取索引路径,根据索引路径确定读命令对应的目标键存在的字节范围;
[0118] S262、根据字节范围提取对应的数据块,使用布隆过滤器对目标键进行计算,得到读命令对应的目标值是否存储在数据块的结果;
[0119] S263、当确定目标值存储在数据块时,基于学习索引模型确定读命令对应的目标键值对,根据目标键值对读取目标值。
[0120] 一种可行的实施方式中,S263可以具体包括以下步骤S2631‑S2634:
[0121] S2631、获取键预设长度以及值预设长度;
[0122] S2632、获取学习索引模型输出的偏移量;
[0123] S2633、确定键预设长度与值预设长度的和值,确定和值与偏移量的乘积;
[0124] S2634、根据乘积定位读命令对应的目标键值对。
[0125] 一种可行的实施方式中,相应的算法伪代码可以如下:
[0126]
[0127]
[0128] 本发明实施例中,在键值分离的基础上,实现了一个具有成本控制学习索引方案的键值存储系统。首先,实现了一个基于值大小的值管理模块,通过修改键值对写路径,将满足条件的值写入值日志并记录其位置,减少了后续预写日志以及写内存表的写关键路径压力。并依靠值日志以及预写日志来保证一致性。该模块对负载进行感知并服务于学习索引模块进行收益分析。其次,实现了学习索引模块,通过分段线性回归模型学习SSTable文件。LSM‑tree在外存的查询路径中会打开SSTable文件,加载索引块以及数据块然后再查询,使用学习索引可以减少读取该两个查询块步骤的延迟。并通过值管理模块以及 SSTable文件的生命周期来决定是否学习来减少成本。最后,解决了键值对中键与值以及值指针不等长的问题,满足学习索引得出结果后只经过简单的计算即可定位到键进行读取的需求。该系统降低了整体查询延迟,并有效解决了写放大问题,并对负载类型有了更好的扩展性支持。
[0129] 图4是根据一示例性实施例示出的一种键值分离的键值存储引擎索引优化方法装置。参照图4,该装置包括:
[0130] 分离模块410,用于当接收到写命令时,获取待写入的键值对,基于预设阈值进行条件键值分离处理,记录键值分离处理的次数;
[0131] 第一比较模块420,用于将所述键值分离处理的次数与预设次数阈值进行比较,得到第一参数;
[0132] 第二比较模块430,用于获取SSTable的生命周期,将所述生命周期与预设生命周期阈值进行比较,得到第二参数;
[0133] 判断模块440,用于根据所述第一参数以及所述第二参数,判断是否对所述SSTable构建学习索引模型;
[0134] 构建模块450,用于当确定对所述SSTable构建学习索引模型时,基于所述 SSTable构建学习索引模型;
[0135] 读操作模块460,用于当接收到读命令时,基于所述学习索引模型进行读操作。
[0136] 可选地,所述分离模块410,用于:
[0137] 获取预设阈值,将键值对中的值与预设阈值进行比较,如果所述值大于预设阈值,则将键值对中的键与值分离,将键与指向值日志的指针重新组成键值对;
[0138] 如果所述值小于或等于预设阈值,则判断值的长度是否等于值预设长度,如果不是,则对所述值进行补0,使得所述值的长度等于值预设长度。
[0139] 可选地,所述第一比较模块420,用于:
[0140] 将所述键值分离处理的次数与预设次数阈值进行比较,如果所述键值分离处理的次数大于预设次数阈值,则确定第一参数为0,如果所述键值分离处理的次数小于或等于预设次数阈值,则确定第一参数为1。
[0141] 可选地,所述第二比较模块430,用于:
[0142] 将所述生命周期与预设生命周期阈值进行比较,如果所述生命周期大于预设生命周期阈值,则确定第二参数为1,如果所述生命周期小于或等于预设生命周期阈值,则确定第二参数为0。
[0143] 可选地,所述判断模块440,用于:
[0144] 当所述第一参数为0、且所述第二参数为0时,确定对所述SSTable不构建学习索引模型;
[0145] 当所述第一参数为1、且所述第二参数为0时,确定对所述SSTable构建学习索引模型;
[0146] 当所述第一参数为0、且所述第二参数为1时,确定对所述SSTable构建学习索引模型;
[0147] 当所述第一参数为1、且所述第二参数为1时,确定对所述SSTable构建学习索引模型。
[0148] 可选地,所述读操作模块460,用于:
[0149] 基于所述学习索引模型读取索引路径,根据所述索引路径确定读命令对应的目标键存在的字节范围;
[0150] 根据所述字节范围提取对应的数据块,使用布隆过滤器对目标键进行计算,得到读命令对应的目标值是否存储在所述数据块的结果;
[0151] 当确定目标值存储在所述数据块时,基于所述学习索引模型确定读命令对应的目标键值对,根据所述目标键值对读取目标值。
[0152] 可选地,所述读操作模块460,用于:
[0153] 获取键预设长度以及值预设长度;
[0154] 获取所述学习索引模型输出的偏移量;
[0155] 确定所述键预设长度与所述值预设长度的和值,确定所述和值与所述偏移量的乘积;
[0156] 根据所述乘积定位读命令对应的目标键值对。
[0157] 本发明实施例中,在键值分离的基础上,实现了一个具有成本控制学习索引方案的键值存储系统。首先,实现了一个基于值大小的值管理模块,通过修改键值对写路径,将满足条件的值写入值日志并记录其位置,减少了后续预写日志以及写内存表的写关键路径压力。并依靠值日志以及预写日志来保证一致性。该模块对负载进行感知并服务于学习索引模块进行收益分析。其次,实现了学习索引模块,通过分段线性回归模型学习SSTable文件。LSM‑tree在外存的查询路径中会打开SSTable文件,加载索引块以及数据块然后再查询,使用学习索引可以减少读取该两个查询块步骤的延迟。并通过值管理模块以及 SSTable文件的生命周期来决定是否学习来减少成本。最后,解决了键值对中键与值以及值指针不等长的问题,满足学习索引得出结果后只经过简单的计算即可定位到键进行读取的需求。该系统降低了整体查询延迟,并有效解决了写放大问题,并对负载类型有了更好的扩展性支持。
[0158] 图5是本发明实施例提供的一种电子设备500的结构示意图,该电子设备 500可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上处理器  (central processing units,CPU)501和一个或一个以上的存储器502,其中,所述存储器502中存储有至少一条指令,所述至少一条指令由所述处理器501加载并执行以实现上述键值分离的键值存储引擎索引优化方法的步骤。
[0159] 在示例性实施例中,还提供了一种计算机可读存储介质,例如包括指令的存储器,上述指令可由终端中的处理器执行以完成上述键值分离的键值存储引擎索引优化方法。例如,所述计算机可读存储介质可以是ROM、随机存取存储器 (RAM)、CD‑ROM、磁带、软盘和光数据存储设备等。
[0160] 本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
[0161] 以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。