CN109213772B - 数据存储方法及NVMe存储系统 - Google Patents
数据存储方法及NVMe存储系统 Download PDFInfo
- Publication number
- CN109213772B CN109213772B CN201811064683.1A CN201811064683A CN109213772B CN 109213772 B CN109213772 B CN 109213772B CN 201811064683 A CN201811064683 A CN 201811064683A CN 109213772 B CN109213772 B CN 109213772B
- Authority
- CN
- China
- Prior art keywords
- data
- information
- written
- processor
- metadata
- 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.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0238—Memory management in non-volatile memory, e.g. resistive RAM or ferroelectric memory
- G06F12/0246—Memory management in non-volatile memory, e.g. resistive RAM or ferroelectric memory in block erasable memory, e.g. flash memory
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请提供了一种基于NVMe存储系统的数据存储方法及NVMe存储系统,能够根据接收的待写入数据和内存中元数据信息,确定待写入数据在关系表存储空间中的位置,再进一步将待写入数据不通过内核、不写入缓存而是直接写入对应的关系表存储空间,从而实现了数据库层、操作系统层和文件系统层的精简与整合,与传统存储系统相比,本申请提供的方案充分利用了NVMe存储设备的硬件并行性,减少了层次之间非必须的数据拷贝、上下文切换,将中断模式改为轮询模式,缩短了数据处理的执行路径,提高了数据写入的效率,同时还实现了在单一的用户态缓存中查找待读取数据,避免了传统存储系统中多层次缓存的查找和状态切换,从而提高了数据读取的效率。
Description
技术领域
本申请涉及计算机存储领域,尤其涉及一种数据存储方法及NVMe存储系统。
背景技术
随着新材料的研究推进以及工业制造技艺的进步,新型高性能的存储硬件如NVMe设备等得到了较快的发展。NVMe设备,是指支持非易失性内存主机控制器接口规范(Non-Volatile Memory express,NVMe)协议的存储设备。目前,NVMe协议已得到了广泛使用,由于NVMe协议采用了简化的指令、较低延迟的软件堆栈、队列并行性和较大的队列深度,能够很大程度上减少硬件层面的I/O开销和延迟,从而使得支持NVMe协议的存储设备具有高带宽、低延迟的硬件特性,对于I/O密集型应用有着较好的支持,常用的NVMe设备例如有PCIe固态硬盘和英特尔傲腾存储器等。
一般来说,衡量存储设备的存储效率通过数据存储的总延迟来判断,数据存储的总延迟可包括硬件延迟和软件延迟,由于NVMe设备上数据存储的硬件延迟大幅度减少,使得部署在NVMe设备上的存储软件所导致的软件延迟相应变大,以至于传统的存储软件无法充分发挥NVMe设备的潜能。
为了提升存储系统的数据存储效率,现有技术对传统的存储软件的软件栈进行了一定的优化,例如,通过使用用户态的轻量级文件系统Aerie、基于日志结构的文件系统NOVA,减少了文件系统层的软件延迟;另外,通过使用硬件设备层面的文件系统DevFS来绕过了操作系统层的数据处理,从而减少操作系统层的软件延迟;还针对OLTP型负载的数据库引擎Hekaton优化了数据库层的数据处理开销,减少了数据库层的软件延迟等。但是,上述优化技术仅仅对传统存储软件栈中的文件系统层、操作系统层以及数据库层进行了局部优化,并没有实现从存储软件栈的整体上进行分析、整合以及精简,从而性能优化不全面、不彻底,无法充分发挥NVMe设备的高性能。
申请内容
本申请的一个目的是提供一种基于NVMe存储系统的数据存储方法及NVMe存储系统。
为实现上述目的,本申请的一些实施例提供了一种基于NVMe存储系统的数据存储方法,其中,所述NVMe存储系统包括处理器、内存和NVMe存储设备,所述NVMe存储设备支持非易失性内存主机控制器接口规范并保存有元数据文件,且包含用于存储用户数据的关系表存储空间,该方法包括:
在NVMe存储系统启动时,处理器将所述元数据文件中的元数据信息加载到内存中;
处理器接收客户端的数据写入请求;
处理器根据所述数据写入请求中待写入数据和内存中元数据信息,确定所述待写入数据在关系表存储空间中的位置信息;
处理器根据所述位置信息,直接将所述待写入数据写入对应的关系表存储空间;
若数据写入成功,处理器根据所述待写入数据的写入结果对元数据信息进行更新。
进一步地,处理器将所述元数据文件中的元数据信息加载到内存中,包括:
处理器根据预设的元数据文件存放目录,查找元数据文件;
处理器读取并解析所述元数据文件,获取元数据信息;
处理器将所述元数据信息加载到内存中。
进一步地,所述元数据信息包括Root信息、预分配块的管理信息、索引信息和关系表的结构信息。
进一步地,处理器根据所述待写入数据的写入结果对元数据信息进行更新,包括:
处理器根据所述待写入数据对应的数据块写入信息,更新元数据信息中的预分配块的管理信息;
处理器根据所述待写入数据的主键信息,更新元数据信息中的索引信息。
进一步地,处理器根据所述数据写入请求中待写入数据和内存中元数据信息,确定所述待写入数据在关系表存储空间中的位置信息,包括:
处理器根据所述数据写入请求中待写入数据的主键信息和内存中元数据信息的预分配块的管理信息,确定所述待写入数据在关系表存储空间中的位置信息。
进一步地,处理器根据所述数据写入请求中待写入数据和内存中元数据信息,确定所述待写入数据在关系表存储空间中的位置信息之后,还包括:
处理器根据所述位置信息,获取对应的关系表存储空间存储的第一数据;
处理器根据所述第一数据,生成与第一数据对应的Undo日志信息。
进一步地,该方法还包括:
若数据写入成功,处理器将对应所述第一数据的Undo日志信息标记为失效;
若数据写入失败,处理器获取与所述第一数据对应的Undo日志信息,并将所述Undo日志信息中的第一数据写入对应的关系表存储空间。
进一步地,所述Undo日志信息保存在非易失性缓存区中,且标记为失效的Undo日志信息定期被清除。
进一步地,该方法还包括:
处理器接收客户端的数据读取请求;处理器根据所述数据读取请求中待读取数据的主键信息,在数据缓存中查询并获取查询结果;若所述查询结果为未命中,则处理器根据所述主键信息获取待读取数据在关系表存储空间中的位置信息,并根据所述位置信息获取待读取数据。
进一步地,处理器根据所述位置信息获取待读取数据之后,还包括:
处理器根据所述待读取数据和预设数据缓存更新策略,更新数据缓存。
此外,本申请的一些实施例还提供了一种NVMe存储系统,其中,所述NVMe存储系统包括处理器、内存和NVMe存储设备,所述NVMe存储设备支持非易失性内存主机控制器接口规范并保存有元数据文件,且包含用于存储用户数据的关系表存储空间;所述内存用于存储从元数据文件中获取的元数据信息,并提供数据缓存;
所述处理器,用于:
在NVMe存储系统启动时,将所述元数据文件中的元数据信息加载到内存中;
接收客户端的数据写入请求;
根据所述数据写入请求中待写入数据和内存中元数据信息,确定所述待写入数据在关系表存储空间中的位置信息;
根据所述位置信息,直接将所述待写入数据写入对应的关系表存储空间;
若写入成功,根据所述待写入数据的写入结果对元数据信息进行更新。
进一步地,所述处理器,用于:
根据预设的元数据文件存放目录,获取元数据文件;
读取并解析所述元数据文件,获取元数据信息;
将所述元数据信息加载到内存中。
进一步地,所述元数据信息包括Root信息、预分配块的管理信息、索引信息和关系表的结构信息。
进一步地,所述处理器,用于:
根据所述待写入数据对应的数据块写入信息,更新元数据信息中的预分配块的管理信息;
根据所述待写入数据的主键信息,更新元数据信息中的索引信息。
进一步地,用于:
根据所述数据写入请求中待写入数据的主键信息和内存中元数据信息的预分配块的管理信息,确定所述待写入数据在关系表存储空间中的位置信息。
进一步地,所述处理器,用于:
根据所述位置信息,获取对应的关系表存储空间存储的第一数据;
根据所述第一数据,生成与第一数据对应的Undo日志信息。
进一步地,所述处理器,还用于:
若数据写入成功,将对应所述第一数据的Undo日志信息标记为失效;
若数据写入失败,获取与所述第一数据对应的Undo日志信息,并将所述Undo日志信息中的第一数据写入对应的关系表存储空间。
进一步地,所述Undo日志信息保存在非易失性缓存区中,且标记为失效的Undo日志信息定期被清除。
进一步地,所述处理器,还用于:
接收客户端的数据读取请求;根据所述数据读取请求中待读取数据的主键信息,在数据缓存中查询并获取查询结果;若所述查询结果为未命中,则根据所述主键信息获取待读取数据在关系表存储空间中的位置信息,并根据所述位置信息获取待读取数据。
进一步地,所述处理器,用于:
根据所述待读取数据和预设数据缓存更新策略,更新数据缓存。
本申请的一些实施例还提供了一种计算机可读介质,其上存储有计算机可读指令,所述计算机可读指令可被处理器执行以实现前述基于NVMe存储系统的数据存储方法。
与现有技术相比,本申请提供的方案提供了一种单层的、基于关系表存储的用户态存储方案,能够在NVMe存储系统启动时,将元数据信息加载到内存中,再根据接收的待写入数据和内存中元数据信息,确定待写入数据在关系表存储空间中的位置,再进一步将待写入数据不通过内核、不写入缓存而是直接写入对应的关系表存储空间并更新元数据信息,从而实现了数据库层、操作系统层和文件系统层的整合,与传统存储系统相比,本申请提供的方案充分利用了NVMe存储设备的硬件并行性,减少了层次之间非必须的数据拷贝、上下文切换,将中断模式改为轮询模式,缩短了数据处理的执行路径,提高了数据写入的效率,同时还实现了在单一的用户态缓存中查找待读取数据,避免了传统存储系统中多层次缓存的查找和状态切换,从而提高了数据读取的效率。
附图说明
通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显:
图1为本申请的一些实施例提供的基于NVMe存储系统的数据写入方法的流程图。
图2为本申请的一些实施例提供的优选的基于NVMe存储系统的数据存储方法的结构示意图。
图3为本申请的一些实施例提供的NVMe存储系统的结构示意图。
图4为本申请的一些实施例提供的基于NVMe存储系统的数据读取方法的流程图。
附图标记说明:1、NVMe存储系统,11、处理器,12、内存,13、NVMe存储设备。
具体实施方式
下面结合附图对本申请作进一步详细描述。
在本申请一个典型的配置中,终端、服务网络的设备和可信方均包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flashRAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
本申请的一些实施例提供了一种基于NVMe存储系统的数据存储方法。该NVMe存储系统可包括处理器、内存和NVMe存储设备,该NVMe存储设备为支持非易失性内存主机控制器接口规范(Non-Volatile Memory express,NVMe)协议的存储设备,例如PCIe固态硬盘和英特尔傲腾存储器等。该NVMe存储设备上保存有元数据文件,且包含用于存储用户数据的关系表存储空间,在此,元数据文件用于存储NVMe存储系统正常运行所需的元数据,关系表存储空间可用于存储用户数据,关系表存储空间可包含多个关系表,每个关系表中存储多条用户数据,关系表存储空间提供了多种关系表操作接口。如图1所示,该方法具体包括如下步骤:
步骤S101,在NVMe存储系统启动时,处理器将所述元数据文件中的元数据信息加载到内存中;
步骤S102,处理器接收客户端的数据写入请求;
步骤S103,处理器根据所述数据写入请求中待写入数据和内存中元数据信息,确定所述待写入数据在关系表存储空间中的位置信息;
步骤S104,处理器根据所述位置信息,直接将所述待写入数据写入对应的关系表存储空间;
步骤S105,若数据写入成功,处理器根据所述待写入数据的写入结果对元数据信息进行更新。
在此,NVMe存储系统可以为存储服务器,该存储服务器在启动或重新启动后,服务器上的处理器首先要在内存中建立元数据信息,供以后的数据写入和数据读取过程使用。元数据信息从保存在NVMe存储设备的元数据文件中获取,处理器将读取的元数据信息加载到内存中,NVMe存储系统首次启动时,会自动生成对应的空白元数据文件,供后续的更新操作使用。
在步骤S101中,处理器将元数据文件中的元数据信息加载到内存中。在此,处理器将元数据文件中的元数据信息加载到内存中,具体可以包括如下步骤:处理器首先可根据预设的元数据文件存放目录,查找元数据文件;再读取并解析该元数据文件,获取元数据信息;再进一步将元数据信息加载到内存中。
存储服务器启动完成后,处理器可先找到要加载的元数据文件,在此,元数据文件的位置为预先指定的存放位置,通常为该元数据文件存放的文件目录或文件路径。本申请的一些实施例中,可通过配置文件来指定元数据文件的位置,配置文件中指定的元数据文件位置可不允许修改,也可根据用户的需要进行修改。
处理器找到元数据文件后,通过文件操作接口打开元数据文件,逐行读取并解析该元数据文件,获取其中保存的元数据信息,再将元数据信息加载到内存中。元数据信息加载完成后,处理器关闭该元数据文件,NVMe存储系统可开始正常提供服务。
本申请的一些实施例中,元数据信息可以包括但不限于Root信息、预分配块的管理信息、索引信息和关系表的结构信息等。在此,Root信息用于维护存储系统中所有关系表的管理信息,可包括但不限于如下内容:关系表的名称、编号、所有者、创建时间以及最近修改时间等,优选地,Root信息可保存在单独的Root信息表中,Root信息表可以是存放以关系型方式组织数据的数据表。
预分配块的管理信息用于记录每张关系表的预先分配的数据段空间的相关信息,可包括但不限于如下内容:数据段中数据块的占用情况、数据块是否加锁、数据是否有效等。在此,NVMe设备上的存储空间以数据块为基本单位进行划分,每个数据块可存储关系表中的一行或多行数据,多个数据块可组成一个数据段,一个数据段属于一张关系表,一张关系表根据数据量的大小,包含一个或多个数据段。NVMe设备使用PCIe接口,和传统的固态硬盘很类似,但是支持的协议不同,它使用的是NVMe协议,能够支持多队列的并发操作,所以效率很高。
索引信息可包括主键索引信息和辅助索引信息,主键索引信息采用哈希表结构组织索引数据,用于记录关系表中每行数据在NVMe设备中的存储位置,辅助索引信息中的索引数据优选使用但不仅限于Trie+树结构进行维护。Trie树,又称字典树、前缀树、单词查找树、键树等,是一种多叉树形结构,是哈希树的变种,其典型应用是用于统计、排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。Trie树的优点在于可利用字符串的公共前缀来减少查询时间,从而最大限度地减少无谓的字符串比较,因此查询效率比哈希树高。Trie+树通过将Trie树的叶子节点进行串联,使得可以快速找到对应叶子节点的左右相邻节点。本申请的一些实施例中的NVMe存储系统可支持在关系表的任意列上构建辅助索引。
关系表的结构信息用于描述每张关系表的关键数据结构,例如可记录关系表包含的列数,每列的属性信息等。
本申请的一个优选实施例中,处理器可根据元数据文件的存放目录,查找并打开元数据文件,如果元数据文件不存在或打开失败,处理器向NVMe存储系统管理员发送故障警告;如果元数据文件打开正常,则逐行读取和解析元数据文件,并根据解析的内容在内存中建立Root信息表、预分配数据块的管理器、索引信息以及表结构信息。元数据文件解析完毕后,关闭该元数据文件,NVMe存储系统进入正常运行状态,否则向NVMe存储系统管理员发送故障警告。
在步骤S102中,处理器接收客户端的数据写入请求。在此,NVMe存储系统通过网络与数据存储客户端连接,客户端通过网络向NVMe存储系统发送数据写入请求,数据写入请求中包括待写入的用户数据,处理器接收数据写入请求并进行后续处理。
在步骤S103中,处理器根据所述数据写入请求中待写入数据和内存中元数据信息,确定所述待写入数据在关系表存储空间中的位置信息。在此,数据写入请求中包含了待写入的数据,待写入数据由处理器决定将该数据存储到NVMe设备的什么位置,这里的待写入数据是客户端产生的用户数据,通过NVMe存储系统保存在一个或多个关系表中。内存中的元数据信息保存了每个关系表对应的存储位置和可用的数据块信息,处理器可根据这些元数据信息来确定待写入数据的可存储位置。
具体来说,处理器可根据数据写入请求中待写入数据的主键信息和内存中元数据信息的预分配块的管理信息,确定待写入数据在关系表存储空间中的位置信息。本申请的一些实施例中,待写入数据即用户数据,其基本存储格式为<主键,(列1,列2,列3…列n)>,主键信息即数据中的主键,通常用于作为一条数据的唯一标识,主键索引信息可根据主键建立。在此,待写入数据的主键可能与存储在NVMe设备上的某条数据的主键相同,为保证数据的一致性,待写入数据需要对已存储数据进行更新,即将待写入数据写入到已存储数据的相应位置。处理器可根据待写入数据的主键信息和元数据信息的预分配块的管理信息查询存储在NVMe设备上的数据,若发现有主键相同的数据,则将已存储数据的位置确定为待写入数据的位置信息。在此,由于待写入数据可能会保存在多个关系表中,因此处理器在进行主键查询时可在多个相应的关系表中查询。
此外,若处理器未发现NVMe设备上存在和待写入数据的主键信息一致的主键数据,处理器可根据预分配块的管理信息获取空闲可用的数据块作为待写入数据块,将这些待写入数据块的信息作为待写入数据的存储位置信息。
本申请的一些实施例中,处理器在确定了待写入数据的存储位置之后,还可以将该存储位置上保存的数据进行备份,以在待写入数据写入失败后,可以进行数据的恢复。具体可包括如下步骤:首先处理器根据位置信息,获取对应的关系表存储空间存储的第一数据;然后处理器根据第一数据,生成与第一数据对应的Undo日志信息。在此,第一数据指的是存储在待写入数据准备写入的存储位置上的原有数据。与第一数据对应的Undo日志信息可用于数据的恢复,可包括但不限于如下内容:第一数据、数据状态等。
在此,Undo日志信息可保存在非易失性缓存区中,且标记为失效的Undo日志信息定期被清除,非易失性缓存区可以使用但不限于NVDIMM-N设备(NVDIMM-N设备是一种非易失性内存,能够在完全断电的时候仍然保存完整的内存数据)。本申请的一些优选实施例中,Undo日志信息可保存在Undo日志链表中,并可通过使用CLWB和MFENCE指令,将Undo日志信息写入非易失缓存区中Undo日志链表的尾部。另外,可通过在后台运行垃圾回收线程来定期扫描非易失性缓存区中的Undo日志链表,释放数据状态为失效的Undo日志所占的内存空间。
在步骤S104中,处理器根据位置信息,直接将待写入数据写入对应的关系表存储空间。在此,“直接将待写入数据写入对应的关系表存储空间”是指处理器采用就地更新的方式,在就地更新的方式中,处理器绕过操作系统内核、不将待写入数据存入缓存而是将待写入数据立即写入NVMe设备。本申请的一些实施例中,NVMe存储系统中实现了一套轻量级、用户态的存储引擎,用于实现对用户数据的写入和读取,该存储引擎是对传统的存储引擎进行了精简和整合后得到的,尤其对传统的存储引擎中数据库存储引擎层和文件系统层进行了完全的整合,精简后的方案将待写入数据直接写入NVMe设备,能够提高数据写入的效率,避免较长的数据写入时间。
而传统的基于多层的存储软件栈,包括数据库层、文件系统层以及操作系统层,并没有采用立即将待写入数据写入硬盘的方式。在传统的基于多层的存储软件栈中,由于分为多层的数据处理层次,每个层级都有各自不同的缓存,例如MySQL数据库的写入缓存、操作系统层的页缓存等,用户数据的写入通常采用先写入缓存,再异步进行更新(即等待一段时间再实际写到硬盘上)的方式,因此必然涉及到待写入数据在多个层级间缓存的多次移动,例如,传统的基于多层的存储软件栈接收到数据写入请求后,先将请求中的待写入数据存放在数据库层的缓存中,经过一段时间的等待(如等待数据库层的缓存充满),再从数据库层的缓存转移到文件系统层的缓存中,在文件系统层的缓存中等待一段时间后,继续转移到操作系统层的内核缓冲区中,到了操作系统的内核缓冲区中再通过异步更新方式实际写入硬盘。
因此,本申请的一些实施例中采用的就地更新方式,是在接收到数据写入请求后立即将待写入数据写入NVMe设备,写入路径更短,没有传统的存储引擎中待写入数据的多次移动、拷贝和等待过程(另外,传统的存储引擎在数据移动、拷贝时还会涉及到计算机设备中核心态和用户态的切换,例如将处于用户态的文件系统层缓存中的数据拷贝到处于核心态的操作系统层缓存中,需要进行从用户态到核心态的切换,这种切换也需要较大的时间开销)从而极大地减少了数据写入时的时间消耗。
本申请的一些实施例中,处理器将待写入数据写入关系表存储空间的相应位置,如果数据写入相应位置成功,则处理器可将对应所述第一数据(即相应位置上的原有数据)的Undo日志信息标记为失效;如果数据写入相应位置失败,处理器可获取与第一数据对应的Undo日志信息,并将Undo日志信息中的第一数据写入相应位置,即重新恢复相应位置上的原有数据,避免数据的写入失败造成原有数据的丢失。
在步骤S105中,如果数据写入成功,处理器根据待写入数据的写入结果对元数据信息进行更新。在此,由于待写入数据已经写入成功,相应地,元数据信息也需要进行更新以准确地反映新的存储数据带来的变化,例如,待写入数据占用了哪些数据块、待写入数据的索引对索引信息的影响等,这些内容都会造成原有元数据信息的变化。
本申请的一些实施例中,处理器对元数据信息进行更新可具体包括如下步骤:处理器可根据待写入数据对应的数据块写入信息,首先更新元数据信息中的预分配块的管理信息;再可根据待写入数据的主键信息,更新元数据信息中的索引信息。在此,处理器对元数据信息的更新并不限于上述步骤,处理器也可根据NVMe存储系统的个性化需求,在待写入数据写入完成后,执行对元数据信息中其它元数据的更新过程。
本申请的一些实施例中,处理器还可以实现对NVMe设备上存储数据的读取操作,如图4所示,具体可包括如下步骤:
步骤S201,处理器接收客户端的数据读取请求;
步骤S202,处理器根据该数据读取请求中待读取数据的主键信息,在数据缓存中查询并获取查询结果;
步骤S203,若查询结果为未命中,则处理器根据待读取数据的主键信息获取待读取数据在关系表存储空间中的位置信息,处理器获取待读取数据的位置信息仍需要通过查询相应的元数据信息,并根据该位置信息获取待读取数据,在获取待读取数据后再将该数据返回给客户端。
在此,处理器根据待读取数据的主键信息来在缓存中或NVMe设备的关系表存储空间中查找该待读取数据,处理器首先在缓存中查找,缓存中如果没有命中,再到NVMe设备中查找。
本申请的一些实施例中,保存用户数据的数据缓存只有一个,且为处于用户态的数据块缓存,该缓存的基本读写单元为数据块,经常被客户端更新或读取的数据块,就会被缓存在该缓存中。数据查询时只在该数据缓存中进行查找,不会在其它的缓存中查找,从而与传统的存储引擎不同,使用单独的数据缓存能提高数据查询的效率,也无需进行用户态与核心态之间的切换。而传统的存储引擎中每个层次都有自己的缓存,数据查找要在多个层次的缓存中查找,缓存中的数据也可能需要进行多个层级间缓存的数据拷贝,因此数据处理的路径较长,数据查询的时间消耗较大。
本申请的一些实施例中,处理器首先在数据缓存中未查询到待读取数据,因此继续在NVMe设备中查找该数据,查找到该数据后,处理器还可以根据待读取数据和预设数据缓存更新策略,更新数据缓存,将最近查询的数据存入数据缓存,供可能的下一次数据查询时快速返回数据。在此,数据缓存更新策略可采用多种缓存更新策略,例如可采用时钟替换策略,将缓存中访问频率较低的数据替换为新数据等。
此外,由于NVMe存储系统采用了基于关系表的存储,因此可以支持类似于数据库中关系表的数据操作,例如CREATE/DROP TABLE(创建/删除关系表)、INSERT(数据插入操作)、SELECT(数据查询操作)、UPDATE(数据更新操作)、DELETE(数据删除操作)、SCAN(数据扫描操作)以及PROJECT(数据投影操作)等。具体的用户接口信息可参见下表:
图2给出了一个优选的实现基于NVMe存储系统实现数据存储的方法,其中,数据写入可包括如下步骤:
1)客户端发送数据写入请求到请求分发器,请求分发器从工作线程池中为其分配一个空闲的工作线程处理数据写入请求;
2)工作线程访问内存中的元数据,根据传入的待写入数据的主键信息,获取待写入数据在NVMe设备上的位置信息,若对应的主键不存在,为其分配新的位置;
3)通过英特尔SPDK(存储性能开发工具包)提供的接口,根据待写入数据的位置信息,直接访问NVMe设备获得第一数据,并在Undo日志链表中保存与第一数据相应的Undo日志;
4)执行写入操作,将客户端发送的待写入数据写入NVMe设备,写入成功后将第一数据对应的Undo日志标记为无效状态,再更新内存中的元数据,并回复客户端写入操作成功。
图2中,数据读取可包括如下步骤:
1)客户端发送数据读取请求到请求分发器,请求分发器从工作线程池中为其分配一个空闲的工作线程处理数据读取请求;
2)工作线程访问缓存,若缓存命中,则立即将数据返回客户端,否则根据传入的待读取数据的主键信息,获取待读取数据在NVMe设备上的位置信息,若对应的主键不存在,通知客户端读取失败;
3)通过SPDK提供的接口,根据待读取数据的位置信息,直接访问NVMe设备读取数据,读取成功后返回给客户端,并更新缓存。
基于同一发明构思,本申请的另外一些实施例还提供了一种NVMe存储系统,由于该系统中处理器实现的方法是前述实施例中的对应方法,并且与所述方法解决问题的原理相似,因此所述系统的实施可以参见对应方法的实施,重复之处不再赘述。
在此,NVMe存储系统1包括处理器11、内存12和NVMe存储设备13,如图3所示,NVMe存储设备13支持非易失性内存主机控制器接口规范并保存有元数据文件,且包含用于存储用户数据的关系表存储空间;内存12用于存储从元数据文件中获取的元数据信息,并提供数据缓存;处理器11,用于:
在NVMe存储系统1启动时,将所述元数据文件中的元数据信息加载到内存中;
接收客户端的数据写入请求;根据所述数据写入请求中待写入数据和内存中元数据信息,确定所述待写入数据在关系表存储空间中的位置信息;根据所述位置信息,直接将所述待写入数据写入对应的关系表存储空间;
若写入成功,根据所述待写入数据的写入结果对元数据信息进行更新。
进一步地,所述处理器,用于:
根据预设的元数据文件存放目录,获取元数据文件;
读取并解析所述元数据文件,获取元数据信息;
将所述元数据信息加载到内存中。
进一步地,所述元数据信息包括Root信息、预分配块的管理信息、索引信息和关系表的结构信息。
进一步地,所述处理器,用于:
根据所述待写入数据对应的数据块写入信息,更新元数据信息中的预分配块的管理信息;
根据所述待写入数据的主键信息,更新元数据信息中的索引信息。
进一步地,用于:
根据所述数据写入请求中待写入数据的主键信息和内存中元数据信息的预分配块的管理信息,确定所述待写入数据在关系表存储空间中的位置信息。
进一步地,所述处理器,用于:
根据所述位置信息,获取对应的关系表存储空间存储的第一数据;
根据所述第一数据,生成与第一数据对应的Undo日志信息。
进一步地,所述处理器,还用于:
若数据写入成功,将对应所述第一数据的Undo日志信息标记为失效;
若数据写入失败,获取与所述第一数据对应的Undo日志信息,并将所述Undo日志信息中的第一数据写入对应的关系表存储空间。
进一步地,所述Undo日志信息保存在非易失性缓存区中,且标记为失效的Undo日志信息定期被清除。
进一步地,所述处理器,还用于:
接收客户端的数据读取请求;根据所述数据读取请求中待读取数据的主键信息,在数据缓存中查询并获取查询结果;若所述查询结果为未命中,则根据所述主键信息获取待读取数据在关系表存储空间中的位置信息,并根据所述位置信息获取待读取数据。
进一步地,所述处理器,用于:
根据所述待读取数据和预设数据缓存更新策略,更新数据缓存。
本申请的一些实施例还提供了一种计算机可读介质,其上存储有计算机可读指令,所述计算机可读指令可被处理器执行以实现前述基于NVMe存储系统的数据存储方法。
综上所述,本申请提供的方案提供了一种单层的、基于关系表存储的用户态存储方案,能够在NVMe存储系统启动时,将元数据信息加载到内存中,再根据接收的待写入数据和内存中元数据信息,确定待写入数据在关系表存储空间中的位置,再进一步将待写入数据不通过内核、不写入缓存而是直接写入对应的关系表存储空间并更新元数据信息,从而实现了数据库层、操作系统层和文件系统层的精简与整合,与传统存储系统相比,本申请提供的方案充分利用了NVMe存储设备的硬件并行性,减少了层次之间非必须的数据拷贝、上下文切换,将中断模式改为轮询模式,缩短了数据处理的执行路径,提高了数据写入的效率,同时还实现了在单一的用户态缓存中查找待读取数据,避免了传统存储系统中多层次缓存的查找和状态切换,从而提高了数据读取的效率。
需要注意的是,本申请可在软件和/或软件与硬件的组合体中被实施,例如,可采用专用集成电路(ASIC)、通用目的计算机或任何其他类似硬件设备来实现。在一个实施例中,本申请的软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,本申请的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,RAM存储器,磁或光驱动器或软磁盘及类似设备。另外,本申请的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。
另外,本申请的一部分可被应用为计算机程序产品,例如计算机程序指令,当其被计算机执行时,通过该计算机的操作,可以调用或提供根据本申请的方法和/或技术方案。而调用本申请的方法的程序指令,可能被存储在固定的或可移动的记录介质中,和/或通过广播或其他信号承载媒体中的数据流而被传输,和/或被存储在根据所述程序指令运行的计算机设备的工作存储器中。在此,根据本申请的一个实施例包括一个设备,该设备包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发该设备运行基于前述根据本申请的多个实施例的方法和/或技术方案。
对于本领域技术人员而言,显然本申请不限于上述示范性实施例的细节,而且在不背离本申请的精神或基本特征的情况下,能够以其他的具体形式实现本申请。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本申请的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本申请内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。装置权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。
Claims (19)
1.一种基于NVMe存储系统的数据存储方法,其中,所述NVMe存储系统包括处理器、内存和NVMe存储设备,所述NVMe存储设备支持非易失性内存主机控制器接口规范并保存有元数据文件,且包含用于存储用户数据的关系表存储空间,该方法包括:
在NVMe存储系统启动时,处理器将所述元数据文件中的元数据信息加载到内存中,其中,所述元数据信息包括Root信息、预分配块的管理信息、索引信息和关系表的结构信息;
处理器接收客户端的数据写入请求;
处理器根据所述数据写入请求中待写入数据和内存中元数据信息,确定所述待写入数据在关系表存储空间中的位置信息;
处理器根据所述位置信息,直接将所述待写入数据写入对应的关系表存储空间,其中,所述直接将所述待写入数据写入对应的关系表存储空间包括处理器采用就地更新的方式将所述待写入数据写入对应的关系表存储空间,所述就地更新的方式包括处理器绕过操作系统内核、不将待写入数据存入缓存而是将待写入数据立即写入NVMe设备;
若数据写入成功,处理器根据所述待写入数据的写入结果对元数据信息进行更新。
2.根据权利要求1所述的方法,其中,处理器将所述元数据文件中的元数据信息加载到内存中,包括:
处理器根据预设的元数据文件存放目录,查找元数据文件;
处理器读取并解析所述元数据文件,获取元数据信息;
处理器将所述元数据信息加载到内存中。
3.根据权利要求1所述的方法,其中,处理器根据所述待写入数据的写入结果对元数据信息进行更新,包括:
处理器根据所述待写入数据对应的数据块写入信息,更新元数据信息中的预分配块的管理信息;
处理器根据所述待写入数据的主键信息,更新元数据信息中的索引信息。
4.根据权利要求1所述的方法,其中,处理器根据所述数据写入请求中待写入数据和内存中元数据信息,确定所述待写入数据在关系表存储空间中的位置信息,包括:
处理器根据所述数据写入请求中待写入数据的主键信息和内存中元数据信息的预分配块的管理信息,确定所述待写入数据在关系表存储空间中的位置信息。
5.根据权利要求1所述的方法,其中,处理器根据所述数据写入请求中待写入数据和内存中元数据信息,确定所述待写入数据在关系表存储空间中的位置信息之后,还包括:
处理器根据所述位置信息,获取对应的关系表存储空间存储的第一数据;
处理器根据所述第一数据,生成与第一数据对应的Undo日志信息。
6.根据权利要求5所述的方法,其中,该方法还包括:
若数据写入成功,处理器将对应所述第一数据的Undo日志信息标记为失效;
若数据写入失败,处理器获取与所述第一数据对应的Undo日志信息,并将所述Undo日志信息中的第一数据写入对应的关系表存储空间。
7.根据权利要求6所述的方法,其中,所述Undo日志信息保存在非易失性缓存区中,且标记为失效的Undo日志信息定期被清除。
8.根据权利要求1所述的方法,其中,该方法还包括:
处理器接收客户端的数据读取请求;处理器根据所述数据读取请求中待读取数据的主键信息,在数据缓存中查询并获取查询结果;若所述查询结果为未命中,则处理器根据所述主键信息获取待读取数据在关系表存储空间中的位置信息,并根据所述位置信息获取待读取数据。
9.根据权利要求8所述的方法,其中,处理器根据所述位置信息获取待读取数据之后,还包括:
处理器根据所述待读取数据和预设数据缓存更新策略,更新数据缓存。
10.一种NVMe存储系统,其中,所述NVMe存储系统包括处理器、内存和NVMe存储设备,
所述NVMe存储设备支持非易失性内存主机控制器接口规范并保存有元数据文件,且包含用于存储用户数据的关系表存储空间;
所述内存用于存储从元数据文件中获取的元数据信息,并提供数据缓存,其中,所述元数据信息包括Root信息、预分配块的管理信息、索引信息和关系表的结构信息;
所述处理器,用于:
在NVMe存储系统启动时,将所述元数据文件中的元数据信息加载到内存中;
接收客户端的数据写入请求;
根据所述数据写入请求中待写入数据和内存中元数据信息,确定所述待写入数据在关系表存储空间中的位置信息;
根据所述位置信息,直接将所述待写入数据写入对应的关系表存储空间,其中,所述直接将所述待写入数据写入对应的关系表存储空间包括采用就地更新的方式将所述待写入数据写入对应的关系表存储空间,所述就地更新的方式包括绕过操作系统内核、不将待写入数据存入缓存而是将待写入数据立即写入NVMe设备;
若写入成功,根据所述待写入数据的写入结果对元数据信息进行更新。
11.根据权利要求10所述的存储系统,其中,所述处理器,用于:
根据预设的元数据文件存放目录,获取元数据文件;
读取并解析所述元数据文件,获取元数据信息;
将所述元数据信息加载到内存中。
12.根据权利要求10所述的存储系统,其中,所述处理器,用于:
根据所述待写入数据对应的数据块写入信息,更新元数据信息中的预分配块的管理信息;
根据所述待写入数据的主键信息,更新元数据信息中的索引信息。
13.根据权利要求10所述的存储系统,其中,所述处理器,用于:
根据所述数据写入请求中待写入数据的主键信息和内存中元数据信息的预分配块的管理信息,确定所述待写入数据在关系表存储空间中的位置信息。
14.根据权利要求10所述的存储系统,其中,所述处理器,用于:
根据所述位置信息,获取对应的关系表存储空间存储的第一数据;
根据所述第一数据,生成与第一数据对应的Undo日志信息。
15.根据权利要求14所述的存储系统,其中,所述处理器,还用于:
若数据写入成功,将对应所述第一数据的Undo日志信息标记为失效;
若数据写入失败,获取与所述第一数据对应的Undo日志信息,并将所述Undo日志信息中的第一数据写入对应的关系表存储空间。
16.根据权利要求15所述的存储系统,其中,所述Undo日志信息保存在非易失性缓存区中,且标记为失效的Undo日志信息定期被清除。
17.根据权利要求10所述的存储系统,其中,所述处理器,还用于:
接收客户端的数据读取请求;根据所述数据读取请求中待读取数据的主键信息,在数据缓存中查询并获取查询结果;若所述查询结果为未命中,则根据所述主键信息获取待读取数据在关系表存储空间中的位置信息,并根据所述位置信息获取待读取数据。
18.根据权利要求17所述的存储系统,其中,所述处理器,用于:
根据所述待读取数据和预设数据缓存更新策略,更新数据缓存。
19.一种计算机可读介质,其上存储有计算机可读指令,所述计算机可读指令可被处理器执行以实现如权利要求1至9中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811064683.1A CN109213772B (zh) | 2018-09-12 | 2018-09-12 | 数据存储方法及NVMe存储系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811064683.1A CN109213772B (zh) | 2018-09-12 | 2018-09-12 | 数据存储方法及NVMe存储系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109213772A CN109213772A (zh) | 2019-01-15 |
CN109213772B true CN109213772B (zh) | 2021-03-26 |
Family
ID=64983545
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811064683.1A Active CN109213772B (zh) | 2018-09-12 | 2018-09-12 | 数据存储方法及NVMe存储系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109213772B (zh) |
Families Citing this family (21)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111506253B (zh) * | 2019-01-31 | 2023-06-20 | 阿里巴巴集团控股有限公司 | 一种分布式存储系统及其存储方法 |
CN110134340B (zh) * | 2019-05-23 | 2020-03-06 | 苏州浪潮智能科技有限公司 | 一种元数据更新的方法、装置、设备以及存储介质 |
CN110298441B (zh) * | 2019-05-24 | 2022-01-11 | 深圳云天励飞技术有限公司 | 一种数据处理方法、电子装置及计算机可读存储介质 |
CN110162534B (zh) * | 2019-05-30 | 2021-10-26 | 阿波罗智能技术(北京)有限公司 | 数据管理方法及数据存储系统 |
CN110262754B (zh) * | 2019-06-14 | 2022-10-04 | 华东师范大学 | 一种面向NVMe和RDMA的分布式存储系统及轻量级同步通信方法 |
CN112114738B (zh) * | 2019-06-20 | 2024-02-20 | 杭州海康威视数字技术股份有限公司 | 一种存储数据的方法及存储设备 |
TWI697780B (zh) * | 2019-07-23 | 2020-07-01 | 慧榮科技股份有限公司 | 瞬間斷電回復處理方法及電腦程式產品以及裝置 |
CN112306742A (zh) | 2019-07-23 | 2021-02-02 | 慧荣科技股份有限公司 | 瞬间断电回复处理方法及计算机可读取存储介质以及装置 |
CN112286721A (zh) | 2019-07-23 | 2021-01-29 | 慧荣科技股份有限公司 | 瞬间断电回复处理方法及计算机可读取存储介质以及装置 |
CN110673952B (zh) * | 2019-09-04 | 2023-01-10 | 苏州浪潮智能科技有限公司 | 一种面向高并发读应用的数据处理方法及装置 |
CN111078143B (zh) * | 2019-11-27 | 2020-12-29 | 华中科技大学 | 基于段映射进行数据布局和调度的混合存储方法及系统 |
CN111221776B (zh) * | 2019-12-30 | 2023-06-23 | 上海交通大学 | 面向非易失性内存的文件系统的实现方法、系统及介质 |
CN113467698A (zh) * | 2020-03-30 | 2021-10-01 | 珠海全志科技股份有限公司 | 基于文件系统的写方法、装置、计算机设备和存储介质 |
CN111723092A (zh) * | 2020-06-08 | 2020-09-29 | 阿里巴巴集团控股有限公司 | 数据处理方法及装置 |
EP4152163A4 (en) * | 2020-06-11 | 2023-11-15 | Huawei Technologies Co., Ltd. | METHOD FOR PROCESSING METADATA IN A STORAGE DEVICE AND ASSOCIATED DEVICE |
CN112035522B (zh) * | 2020-07-16 | 2021-09-07 | 中科驭数(北京)科技有限公司 | 数据库数据获取方法和装置 |
CN112667859A (zh) * | 2020-12-30 | 2021-04-16 | 北京久其软件股份有限公司 | 基于内存的数据处理方法及装置 |
CN113242175B (zh) * | 2021-04-29 | 2022-03-25 | 烽火通信科技股份有限公司 | 一种基于spdk的存储网关及其实现方法 |
CN113590309B (zh) * | 2021-06-30 | 2024-01-23 | 郑州云海信息技术有限公司 | 一种数据处理方法、装置、设备及存储介质 |
CN113688099B (zh) * | 2021-08-09 | 2023-10-13 | 上海沄熹科技有限公司 | 基于spdk的数据库存储引擎加速方法及系统 |
CN114327278A (zh) | 2021-12-30 | 2022-04-12 | 北京百度网讯科技有限公司 | 数据的追加写方法、装置、设备以及存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102929793A (zh) * | 2011-08-08 | 2013-02-13 | 株式会社东芝 | 包括键-值存储的存储器系统 |
CN103688250A (zh) * | 2011-07-11 | 2014-03-26 | 微软公司 | 使用动态方案来优化数据处理 |
Family Cites Families (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10824622B2 (en) * | 2013-11-25 | 2020-11-03 | Sap Se | Data statistics in data management systems |
US9311381B2 (en) * | 2013-12-30 | 2016-04-12 | Bmc Software Inc. | Lifecycle reference partitioning for database objects |
WO2016041128A1 (zh) * | 2014-09-15 | 2016-03-24 | 华为技术有限公司 | 数据写请求处理方法和存储阵列 |
KR20170108739A (ko) * | 2016-03-18 | 2017-09-27 | 삼성전자주식회사 | DIX (Data Integrity Extension )모드의 NVMe(Non-Volatile Memory Express) 인터페이스에서 데이터를 전송하기 위한 방법 및 시스템 |
US10509780B2 (en) * | 2016-06-03 | 2019-12-17 | Dell Products L.P. | Maintaining I/O transaction metadata in log-with-index structure |
CN107992436B (zh) * | 2016-10-26 | 2021-04-09 | 华为技术有限公司 | 一种NVMe数据读写方法及NVMe设备 |
CN107291399B (zh) * | 2017-06-30 | 2020-11-24 | 苏州浪潮智能科技有限公司 | 一种基于spdk的后端存储方法、装置及系统 |
CN108509353A (zh) * | 2018-03-14 | 2018-09-07 | 清华大学 | 基于裸闪存的对象存储构建方法及装置 |
-
2018
- 2018-09-12 CN CN201811064683.1A patent/CN109213772B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103688250A (zh) * | 2011-07-11 | 2014-03-26 | 微软公司 | 使用动态方案来优化数据处理 |
CN102929793A (zh) * | 2011-08-08 | 2013-02-13 | 株式会社东芝 | 包括键-值存储的存储器系统 |
Also Published As
Publication number | Publication date |
---|---|
CN109213772A (zh) | 2019-01-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109213772B (zh) | 数据存储方法及NVMe存储系统 | |
US10496283B2 (en) | Adaptive prefix tree based order partitioned data storage system | |
US9449005B2 (en) | Metadata storage system and management method for cluster file system | |
CN106575297B (zh) | 使用盲更新操作的高吞吐量数据修改 | |
US8868624B2 (en) | Blob manipulation in an integrated structured storage system | |
US8620884B2 (en) | Scalable blob storage integrated with scalable structured storage | |
WO2020186549A1 (zh) | 一种元数据管理方法、系统及介质 | |
US20120158674A1 (en) | Indexing for deduplication | |
WO2013174305A1 (zh) | 基于SSD的Key-Value型本地存储方法及系统 | |
US20130290636A1 (en) | Managing memory | |
US10521117B2 (en) | Unified table delta dictionary memory size and load time optimization | |
US10289709B2 (en) | Interleaved storage of dictionary blocks in a page chain | |
US11537582B2 (en) | Data access method, a data access control device, and a data access system | |
US11886401B2 (en) | Database key compression | |
CN111159176A (zh) | 一种海量流数据的存储和读取的方法和系统 | |
US7844596B2 (en) | System and method for aiding file searching and file serving by indexing historical filenames and locations | |
CN117120998A (zh) | 用于读取树数据结构中保存的数据的方法和装置 | |
US10585802B1 (en) | Method and system for caching directories in a storage system | |
WO2007087754A1 (fr) | Procédé et système de référençage basé sur une bibliothèque d'objets | |
KR20160121819A (ko) | 이종 메모리 기반 데이터 관리 장치 | |
US10073874B1 (en) | Updating inverted indices | |
CN116204130A (zh) | 一种键值存储系统和键值存储系统的管理方法 | |
Jiao et al. | BetrFS: a compleat file system for commodity SSDs | |
US11586353B2 (en) | Optimized access to high-speed storage device | |
Shi et al. | SQLiteKV: An efficient LSM-tree-based SQLite-like database engine for mobile devices |
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 |