基于日志结构的持久性内存存储引擎装置及控制方法与流程

文档序号:18985656发布日期:2019-10-29 04:22阅读:321来源:国知局
基于日志结构的持久性内存存储引擎装置及控制方法与流程

本发明涉及持久性内存存储技术领域,特别涉及一种基于日志结构的持久性内存存储引擎装置及控制方法。



背景技术:

持久性内存(persistentmemory,pm)是一种新型的具有字节寻址能力的内存级存储器件,如相变存储器(pcm,phasechangememory)、自旋矩存储器(stt-ram,spin-torquetransferram)、阻变存储器(rram,resistiveram)以及最新推出的英特尔傲腾数据中心持久性内存(inteloptanedcpersistentmemory)等。持久性内存具有读写延迟低、带宽高、数据持久化、能耗低等特点,持久性内存不仅具有同dram相近的读写性能,同时又能提供类似传统磁盘等外存类似的持久性。面对高性能的存储器件以及日益兴起的rdma高速网络技术,构建低延迟且高吞吐的高效键值存储引擎具有重要意义。

长久以来,cpu利用率受到两方面因素的限制,首先,维护持久性内存中的索引结构会引入巨大的cpu开销。对于基于哈希的索引结构,当多个键出现冲突时,需要重新哈希多个键值条目,整个哈希索引的大小会变化;对于基于树的索引结构,需要在每个树节点内不断移动各个键值条目,以保证键值条目间的有序性,以及对树节点进行合并、分裂操作,来保证树的平衡性。为了保证灾后一致性,以上操作会产生频繁的缓存行逐出指令,这会引入巨大的时间开销。其次,对于多核平台,很难同时实现低延迟和高吞吐。使用rdma高速网络设备和用户态轮询技术能够降低延迟但是由于大量cpu时间用于轮询而影响总体带宽;使用批量处理方法可以提供高带宽但是不可避免地引入了高延迟。

现有的一些设计提出使用日志结构构建持久性内存键值存储引擎。日志结构的存储方式简化了持久性内存的更新操作,同时使用批量处理的方式处理多个客户端的请求以平摊持久化操作的开销,但是这些设计采用日志结构仅仅是为了实现灾后一致性或者减少持久性内存碎片,而没有能够充分利用批量处理多个请求来减少持久化操作开销的机会。

单纯的使用日志结构的存储方式构建持久性内存键值存储引擎的设计,使得低延迟和高带宽变得对立而难以同时实现。如果不改变传统的对于日志结构的使用方式以及对多个请求批量处理的方式,难以同时实现低延迟和高带宽。



技术实现要素:

本发明的目的旨在通过重新设计日志结构存储格式和批量持久化方式,来充分发掘降低持久化开销的机会,设计高效的基于日志结构的持久性内存键值存储引擎,在降低延迟的同时保证系统的高吞吐率。

为了实现上述目的,本发明的第一方面的实施例公开一种基于日志结构的持久性内存存储引擎装置,包括:

持久性内存分配器:用于管理所述各处理器核心的持久性内存空间,进而为每个处理器分配新空间以存储更新后的键值对;

持久性操作日志:将获取的操作信息组织为紧凑日志项,通过第一预设规则进行追加存储;其中,所述第一预设规则为将来自多个处理器核心的所述紧凑日志项进行批量持久化;所述持久性操作日志和所述持久性内存分配器有多个,每个处理器核心都设置有所述持久性操作日志和所述持久性内存分配器;

易失性索引结构:用于更新索引项,以指向新的键值对。

优选的,本申请还设置有全局锁,以同步多个不同的处理器核心并发追加所述持久性操作日志。

优选的,执行所述将来自多个处理器核心的所述紧凑日志项进行批量持久化过程中,位于同一处理器的所有核心分到一组,以降低全局锁抢占开销,且不影响批量处理机会。

优选的,所述持久性内存分配器将持久性内存空间分割为大小相同的内存区,并将所述内存区格式化为不同等级的内存块,且同一所述内存区内的所述内存块大小相同;所述各内存区首部用于存放描述当前分配状况的位图元数据。

另一方面,本申请还公开一种基于日志结构的持久性内存存储引擎控制方法,基于上述权利任意一项所述的基于日志结构的存储引擎装置,其控制方法包括:

持久性内存分配器为每个处理器分配新空间用于存储更新后的键值对;

将获取的操作信息组织为紧凑的日志项,通过第一预设规则追加到所述持久性操作日志中;其中,所述第一预设规则为将来自多个处理器核心的所述紧凑日志项进行批量持久化;

在所述易失性索引结构中更新索引项,以指向新的键值对。

优选的,所述将获取的操作信息组织为紧凑日志项,通过第一预设规则追加到所述持久性操作日志中的方法包括:

各处理器核心初始化所述紧凑日志项,当初始化完毕,所有所述处理器核心抢占全局锁;

若其中一个处理器核心抢占成功,则将其他处理器核心已经初始化的所述紧凑日志项合并成大日志项;

将所述大日志项持久化到本地操作日志,释放全局锁,并通知其他处理器核心持久化完成信息。

优选的,所述将来自多个处理器核心的所述紧凑日志项进行批量持久化的方法包括:

当某处理器核心抢占所述全局锁失败,获取新的客户端请求,并执行新的一轮批量持久化操作。

优选的,所述持久性内存分配器为每个处理器分配新空间用于存储更新后的键值对的方法包括:

所述持久性内存分配器分配新空间后,将新的键值对写入到新空间中,并回收用于存放旧版本键值对的持久性内存空间。

优选的,当所述键值对的尺寸小于一个缓存行时,直接将所述键值对存放到所述紧凑日志项的末尾。

优选的,在所述持久性内存键值存储引擎持续工作时,各处理器核心定期清理所述持久性操作日志中的历史日志项。

优选的,还包括:

在正常关机的情况下,所述基于日志结构的存储引擎将所述易失性索引结构拷贝到持久性内存中,并将每个所述内存区的位图元数据持久化;

在重启后,易失性索引可从持久性内存中导入;

在系统故障情况下,通过扫描日志项来重新构建所述易失性索引。

另一方面,本申请公开一种计算机设备,包括存储器和处理器,所述存储器中存储有计算机可读指令,所述计算机可读指令被所述处理器执行时,使得所述处理器执行上述任一项所述的基于日志结构的持久性内存存储引擎控制方法的步骤。

另一方面,本申请公开一种存储有计算机可读指令的存储介质,所述计算机可读指令被一个或多个处理器执行时,使得一个或多个处理器执行上述任一项所述的基于日志结构的持久性内存存储引擎控制方法的步骤。

本发明附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。

附图说明

本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中,

图1为本发明基于日志结构的持久性内存存储引擎控制方法的结构示意图;

图2为本发明基于日志结构的持久性内存存储引擎控制方法流程图;

图3为本发明中紧凑日志项的示意图;

图4为本发明中不同持久化技术对比示意图;

图5为本发明所述将紧凑日志项追加到持久性操作日志中的方法流程图;

图6为本发明中将紧凑日志项追加到持久性操作日志中的结构示意图;

图7为本发明计算机设备基本结构框图。

具体实施方式

下面详细描述本发明的实施例,实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。

在本发明的描述中,需要理解的是,术语“中心”、“纵向”、“横向”、“上”、“下”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性。

在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。

下面结合附图描述根据本发明实施例的基于日志结构的持久性内存键值存储引擎设计。

持久性内存是一种具有类似于dram的字节寻址能力同时又能提供数据持久性的新型存储设备。持久性内存键值存储引擎用于管理持久性内存上以键值对形式存储的数据,且适用于任何现有的索引结构。图1示出了本发明实施例的结构示意图。本申请公开的一种基于日志结构的持久性内存存储引擎装置包括存储引擎由易失性索引结构、持久性操作日志和持久性内存分配器;持久性内存分配器:用于管理所述各处理器核心的持久性内存空间,进而为每个处理器分配新空间以存储更新后的键值对;持久性操作日志:将获取的操作信息组织为紧凑日志项,通过第一预设规则进行追加存储;其中,所述第一预设规则为将来自多个处理器核心的所述紧凑日志项进行批量持久化;所述持久性操作日志和所述持久性内存分配器有多个,每个处理器核心都设置有所述持久性操作日志和所述持久性内存分配器;易失性索引结构:用于更新索引项,以指向新的键值对。

请参阅图2,基于上述任意一项所述的基于日志结构的存储引擎装置,所述基于日志结构的持久性内存存储引擎控制方法包括:

s1000、所述持久性内存分配器为每个处理器分配新空间用于存储更新后的键值对;

s2000、将获取的操作信息组织为紧凑的日志项,通过第一预设规则追加到所述持久性操作日志中;

s3000、在所述易失性索引结构中更新索引项,以指向新的键值对。

在本发明的第一个实施例中,所述易失性索引结构可直接使用现有的树状或哈希索引结构,且各索引项指向实际的键值对;所述持久性操作日志用于持久性地存储各操作的执行内容,并通过日志内各日志项的位置顺序描述各操作的执行顺序;所述持久性内存分配器用于管理所述各处理器核心独享的持久性内存空间,进而存储实际的键值对。

在本发明的第一个实施例中,在更新已经存在的键值对时,为了不覆盖原有键值对造成一致性问题,采用异地更新的方式,首先通过所述持久性内存分配器分配新空间用于存储新版本键值对,然后将新的键值对写入到新分配的空间中并做持久化操作,初始化日志项并将日志项追加到所述持久性操作日志中去,最后回收用于存放旧版本键值对的持久性内存空间。

在本发明的第一个实施例中,为了避免因维护持久性内存分配器而引入的冗余持久化操作,所述持久性内存分配器将持久性内存空间分割为大小相同的“内存区”,并进一步将所述各内存区格式化为不同等级的内存块,且所述同一内存区内的所述内存块大小相同;所述各内存区首部用于存放描述当前分配状况的位图元数据;所述内存区的头部存储有持久化的位图元数据,该位图元数据能够记录已使用和未使用的数据块;所述内存区的地址为固定字节数对齐,所述内存区的分配粒度记录在所述内存区的头部;由于所述内存区的空闲空间情况能够通过重放所述持久性操作日志恢复出来,相应位图元数据不需要立即持久化,所述持久性内存分配器在执行分配操作时,仅修改相应位图元数据,无需立即将修改过的位图元数据进行持久化。

在本发明的第一个实施例中,由于cpu的缓存行逐出指令仅支持缓存行粒度操作,为了能够将更多的操作打包进一个缓存行中做批量处理以减少持久化操作数量,采用紧凑日志项设计;所述紧凑日志项仅包含索引元数据和长度非常小的键值对;更大长度的键值对被单独存储于所述持久性内存分配器中;图3示出了所述紧凑日志项的结构。如图2,所述紧凑日志项包含操作类型(插入、删除等)、数据值是否处于日志项内标记位、版本号、key、和指向实际键值对的指针;操作类型用于标示该日志项对应的操作类型,数据值是否处于日志项内标记位用于标记数据值是否被直接存储于日志项内并占据键值对指针的位置,版本号用于在清理老旧日志项时保证正确性,key用于存储键值对的键,指向实际键值对的指针是一个指针变量用于指向实际键值对的存储位置。当所述键值对的尺寸小于一个缓存行时,数据值是否处于日志项内标记位被置位,数据值直接被存储于所述紧凑日志项的末尾占据实际键值对指针的位置。当所述键值对尺寸较大时,将所述键值对存储于所述持久新内存分配器中,通过所述指向实际键值对的指针指示其位置。由于持久性内存分配器中空间分配最小以缓存行粒度,并保证缓存行对齐,指针结构仅记录有效的40位信息,通过移位操作可以构建出有效的指针。

在本发明的第一个实施例中,所述第一预设规则为将来自多个处理器核心的所述紧凑日志项进行批量持久化,即称之为流水线批量持久化技术,所述流水线批量持久化技术用于将来自多个处理器核心的所述紧凑日志项进行批量持久化;相较于传统的批量持久化技术,流水线批量持久化技术能够在提升批量处理机会的同时保证低延迟特性,图4示出了不同的批量持久化技术的顺序图,如图4(a)所示,不采用批量持久化技术对每个日志项都需要进行持久化操作,会造成大量的时间开销,占用大量的cpu时间;图4(b)示出了普通批量持久化技术,每个处理器核心对固定数量的日志项进行批量持久化,这种方法在一定程度上能够减少持久化操作,但是为了获得足够的日志项以进行批量持久化,仍有大量的cpu时间浪费在了等待上;图4(c)示出了非流水线批量持久化技术,不同核心之间可以互相“窃取”他人的日志项进行批量持久化,使得处理器核心不必为了积攒足够的日志项而等待,但是,如果本处理器核心的日志项被其他处理器核心“窃取”走,本处理器核心必须等待其他处理器核心完成持久化操作后才能接收后续请求,这仍然造成了不必要的等待开销。

作为具体示例,请参阅图5-图6,在一实施例中,所述将获取的操作信息组织为紧凑日志项,通过第一预设规则追加到所述持久性操作日志中的方法包括:

s2100、各处理器核心初始化所述紧凑日志项,当初始化完毕,所有所述处理器核心抢占全局锁;

s2200、若其中一个处理器核心抢占成功,则将其他处理器核心已经初始化的所述紧凑日志项合并成大日志项;

s2300、将所述大日志项持久化到本地所述操作日志,释放全局锁,并通知其他处理器核心持久化完成信息。

在本实施例中,为了同步各个处理器核心,引入一个全局锁,每个处理器核心有自己请求池,当处理一个插入请求时,由所述持久性内存分配器分配相应的空间存放键值对,所述各处理器核心初始化完毕所述日志项后,立即抢占全局锁;如果抢占成功,该处理器核心成为领导者,其他核心变成跟随者,跟随者需要等待领导者完成批量持久化操作,领导者能够收集其他处理器核心的已经初始化并等待持久化的日志项,并将这些已经初始化的日志项和本地的日志项合并成大日志项,然后批量地将整个大日志项持久化本地所述操作日志中去,之后领导者释放全局锁,并通知其他处理器核心持久化完成信息,最后修改内存中的索引信息并将信息返回给客户端;图4(d)示出了流水线批量持久化技术,简单水平的批量持久化技术只是次优的策略,因为仍然有大量的cpu时间用于等待持久化操作完成,相较于简单水平化批量持久化技术,在本处理器核心的日志项被“窃取”走后,该处理器核心不必等待持久化操作完成而可以立即进行后续批量持久化工作,这种方法能够显著减小处理器核心等待时间。

在本发明的第一个实施例中,所述所述将来自多个处理器核心的所述紧凑日志项进行批量持久化的方法还包括:为了进一步降低cpu等待时间,当某处理器核心抢占所述全局锁失败时,无需阻塞等待所述完成信息,而是获取新的客户端请求,并执行新的一轮批量持久化操作,所述跟随者只是异步的等待之前的领导者发送的完成信息;所述抢占成功的处理器核心在拷贝完日志项后迅速释放全局锁,因此,持久化操作的开销被移到锁外;

在本发明的第一个实施例中,为了进一步降低端到端的延迟,在所述日志项被持久化后,服务端处理器核心便可将返回信息发送给客户端,之前请求的完成信息可以通过异步的方式在当前返回信息中捎带。

在本发明的第一个实施例中,为了避免出现之前插入请求的日志项正在被别的处理器核心持久化,而同一处理器核心又要发出查询请求,造成查询请求看不到之前的插入请求的数据的情况,每个处理器核心维护一个冲突队列,有冲突的请求会被延后执行以保证正确性;

在本发明的第一个实施例中,在多核架构下,唯一一个全局锁有可能会造成显著的同步开销,为降低全局锁抢占开销,且不影响批量处理机会,将位于同一处理器的所有核心分到一组,每一组内分别执行所述流水线批量持久化流程;合理地分组大小能够平衡同步开销和批量持久化的大小,小的分组能够减小同步开销,但是批量持久化的大小随之降低,将同一个socket上的核心分为同一组较为合适。进一步地,所述内存中的索引和持久性内存中的数据块的分配都采用就近原则,尽量在本numa节点内分配,以进一步减少远端内存访问。

在本发明的第一个实施例中,在所述持久性内存键值存储引擎持续工作时,各处理器核心定期清理所述持久性操作日志中老旧的历史日志项;所述每个处理器核心都会在内存中维护每个所述内存区的老旧日志项占比,通过考察一个内存区内的老旧日志项占比来决定是否回收该内存区;所述清理工作由后台线程完成,属于同一个处理器核心组的核心共享一个后台线程,各个处理器核心分组之间的清理工作可以并行;在清理日志项时,通过考察每个日志项中的版本信息来确定该日志项是否有效,被清理的内存区中的有效日志项会被拷贝到新分配的内存区中去。

在本发明的第一个实施例中,在正常关机的情况下,所述引擎将所述易失性索引结构拷贝到持久性内存中,并将每个所述内存区的位图元数据持久化,在重启后,易失性索引可从持久性内存中导入;在系统故障情况下,通过扫描日志项来重新构建所述易失性索引。

本发明实施例提供计算机设备基本结构框图请参阅图7。

该计算机设备包括通过系统总线连接的处理器、非易失性存储介质、存储器和网络接口。其中,该计算机设备的非易失性存储介质存储有操作系统、数据库和计算机可读指令,数据库中可存储有控件信息序列,该计算机可读指令被处理器执行时,可使得处理器实现一种基于日志结构的持久性内存存储引擎控制方法。该计算机设备的处理器用于提供计算和控制能力,支撑整个计算机设备的运行。该计算机设备的存储器中可存储有计算机可读指令,该计算机可读指令被处理器执行时,可使得处理器执行一种基于日志结构的持久性内存存储引擎控制方法,该计算机设备的网络接口用于与终端连接通信。本领域技术人员可以理解,图7中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

本发明还提供一种存储有计算机可读指令的存储介质,所述计算机可读指令被一个或多个处理器执行时,使得一个或多个处理器执行上述任一实施例所述基于日志结构的持久性内存存储引擎控制方法。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,该计算机程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,前述的存储介质可为磁碟、光盘、只读存储记忆体(read-onlymemory,rom)等非易失性存储介质,或随机存储记忆体(randomaccessmemory,ram)等。

应该理解的是,虽然附图的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,其可以以其他的顺序执行。而且,附图的流程图中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,其执行顺序也不必然是依次进行,而是可以与其他步骤或者其他步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。

以上所述仅是本发明的部分实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在不脱离本发明的原理和宗旨的情况下在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。

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