利用日志结构合并树将数据写入的存储设备及其方法与流程

文档序号:16626934发布日期:2019-01-16 06:11阅读:190来源:国知局
本发明涉及数据处理技术,尤其涉及利用日志结构合并树将数据写入的存储设备及其方法。
背景技术
::近年来,随着nosql数据库(如bigtable系统)的流行,lsm树(logstructuredmergetrees,日志结构合并树)被人们熟知。lsm树是数据库的底层索引结构,lsm树的思想是将对数据的修改保存在控制器的内存中,为保证数据可靠性,还会同时向硬盘写日志(无序),当内存数据达到一定容量限制以后,再批量、有序地将修改的数据写入硬盘,从而提升写性能。其中,数据要先写入硬盘的日志和控制器的内存,当内存中数据达到一定容量以后,将需要将内存中的数据写入表进行合并形成合并数据表(sst,sortedstringtable),即,排序的字符串表,并存储到硬盘的第一逻辑层(l0层)中,因此增加了对硬盘的io(input/output,输入输出)次数。技术实现要素:一方面,本发明实施例提供一种利用日志结构合并树将数据写入存储设备的方法,该存储设备包含控制器和硬盘。该方法包括:控制器接收第一写请求,其中,第一写请求携带第一键值对;将第一写请求的数据写入硬盘的第一逻辑层中的第一日志表以及控制器的内存中的第一数据写入表;其中,第一逻辑层用于存储最新的日志表,并且第一数据写入表和第一日志表属于第一日志结构合并树。本发明实施例提供的第一日志表持久化存储在第一逻辑层,并且与第一数据写入表内容相同。因此不再需要将内存中的数据写入表写到第一逻辑层,减少了对硬盘的io次数。进一步的,由于第一数据写入表和第一日志表属于第一日志结构合并树,因此不会影响与其他日志结构合并树的并发性能。进一步的,当第一数据写入表的容量达到预定值时,控制器将第一数据写入表转为第一只读数据表,将第一日志表转为第二日志表,其中,第二日志表属于第一日志结构合并树。进一步的,控制器读取所述第一逻辑层中的多个需合并的日志表;其中,多个需合并的日志表包含第二日志表。接着将多个需合并的志表合并得到合并数据表,并将合并数据表存储到硬盘的第二逻辑层。进一步的,其中,当内存中的存储容量达到内存预定值时,控制器删除内存中的第二只读数据表。其中,第二只读数据表是内存中最早被转换得到的第一只读数据表。其中,第二只读数据表属于第一日志结构合并树。如此,可以释放内存空间,确保后续写入的数据可以存储在内存中。进一步的,控制器为第一写请求在第一索引表中创建索引项,其中,当第一数据写入表的容量达到预定值时,将第一索引表转为第二索引表。进一步的,控制器读取第一逻辑层中的多个需合并的日志表具体包括:从内存读取第一只读数据表,并根据第二索引表从第一逻辑层中读取与第二只读数据表对应的日志表。进一步的,所述控制器接收第二写请求;其中,第二写请求携带第二键值对;控制器将第二写请求写入硬盘的第一逻辑层中的第三日志表以及内存中的第二数据写入表;其中,第二写请求携带第二键值对;第二数据写入表和第三日志表属于第二日志结构合并树。由于第一数据写入表和第一日志表属于第一日志结构合并树,第二数据写入表和第三日志表属于第二日志结构合并树,因此,可以利用多个日志结构合并树将数据并行写入。第二方面,本发明实施例还提供一种利用日志结构合并树将数据写入的存储设备,该存储设备包含控制器和硬盘,控制器包括接收单元,写入单元和内存;其中,接收单元,用于接收第一写请求,其中,第一写请求携带第一键值对;写入单元用于将第一写请求写入硬盘的第一逻辑层中的第一日志表以及内存中的第一数据写入表;第一数据写入表和第一日志表属于第一日志结构合并树。进一步的,控制器还包括实现第一方面方案中各实现方式的其他单元。本发明实施例还提供一种计算机存储介质和计算机程序产品,在计算机存储介质和计算机程序产品上存储有利用日志结构合并树将数据写入存储设备的计算机程序指令,存储设备包含控制器和硬盘,存储设备的控制器执行计算机程序指令用于执行本发明实施例第一方面的各种方案。附图说明图1是根据本发明的实施例的利用日志结构合并树将数据写入的存储设备的结构图;图2是图1中所示的控制器的结构图;图3是图1中所示的内存和硬盘的示意图;图4是根据本发明的实施例的利用日志结构合并树将数据写入存储设备的方法的流程图。具体实施方式下面结合说明书附图,对本发明的实施例进行详细说明。图1是根据本发明的实施例的利用日志结构合并树将数据写入的存储设备1的结构图。如图1所示,存储设备1包括控制器12和硬盘11。控制器用于执行本发明各实施例,其中,控制器包括接收单元120、写入单元121和内存10。图2是图1中所示的控制器12的结构图,如图2所示,控制器12还包括转换单元122、读取单元123、合并单元124、存储单元125和删除单元126。图3是图1中所示的内存和硬盘的示意图,图4是根据本发明的实施例的利用日志结构合并树将数据写入存储设备的方法的流程图。下面结合图1-图4具体说明本发明的实施例。在步骤s40,控制器12中的接收单元120接收第一写请求,其中,第一写请求携带第一键值(key-value)对。在步骤s41,控制器12中的写入单元121将第一写请求写入硬盘11的第一逻辑层中的第一日志表111以及内存10中的第一写入数据表101,其中,第一逻辑层记为l0。其中,第一逻辑层l0用于存储最新的日志表。每个键值对中存储有对应的数据值(value),通过键名(key)可以查找到相应的数据值,进而可以对数据值进行相应的操作。本发明实施例提供的第一日志表持久化存储在l0,并且与第一数据写入表内容相同。因此不再需要将内存中的数据写入表写到l0,减少了对硬盘的的io次数。这里,如图3所示,每次写入第一键值对时,写入单元121先以追加写的方式将第一键值对写入第一日志表111,然后将第一键值对写入第一写入数据表101。其中,第一数据写入表101和第一日志表111属于第一日志结构合并树。例如,图3显示的是第一日志合并树的结构图。在步骤s42,每当第一写入数据表101的容量达到预定容量时,转换单元122将第一写入数据表101转换为只读数据表,将第一日志表103转换为第二日志表。具体的,例如当按照步骤s41的方式在第一写入数据表101中写入了10条第一键值对,此时第一写入数据表101的容量达到了预定容量(例如64m)时,转换单元122将第一写入数据表101转换为第一只读数据表102-1,将第一日志表103转换为第二日志表112-1。如此,随着后续的写入和转换,在内存10中会存储有多个第一只读数据表102-1、102-2……,并在第一逻辑层l0中存储有与多个第一只读数据表102-1、102-2……分别一一对应的多个第二日志表112-1,112-2……。另外,在转换后会重新创建新的第一日志表111、第一写入数据表101,用于后续数据的写入和转换。另外,随着后续的写入和转换,内存10中会存储越来越多的第一只读数据表。当内存10的存储容量超过内存预定值时,控制器12中的删除单元126会删除内存10中的转换时间最早的第一只读数据表,以释放内存10的存储空间。其中,被删除的第一只读数据表被称为第二只读数据表。另外,在步骤s41,写入单元121可以为第一写请求在第一索引表103中创建索引项,并且,当第一数据写入表101的容量达到上述预定值时,将第一索引表转103为第二索引表。随着后续的写入和转换,在内存10中会存储有多个第二索引表104-1,104-2……,并且这些第二索引表104-1,104-2……分别对应于硬盘11的第一逻辑层l0中的第二日志表112-1、112-2……。此外,当第一索引表转被转为第二索引表之后,会重新生成新的第一索引表,用于存储后续的索引项。在步骤s43,当第一逻辑层l0的存储容量已满时,需要对第一逻辑层l0中的多个第二日志表进行合并。此时,读取单元123读取第一逻辑层l0中的多个需合并的日志表,这里,多个需合并的日志表包含第二日志表。本例中,多个需合并的日志表例如是第二日志表112-1和112-3。具体的,当内存10中存在与第二日志表对应的第一只读数据表时,读取单元123从内存10读取第一只读数据表,当内存10中不存在与第二日志表对应的第一只读数据表时,读取单元123根据对应的第二索引表从第一逻辑层l0中读取与第二只读数据表对应的日志表。本例中,对于第二日志表112-1,例如,如图1所示,在内存10中存在对应的第一只读数据表102-1,读取单元214直接读取内存10中的对应的第一只读数据表102-1,从而读取到第二日志表112-1。这里,读取单元214无需从硬盘11的l0层读取第二日志表112-1,因此可以减少硬盘io次数。另外,本例中,对于第二日志表112-3,例如,如图1所示,在内存10中并不存在对应的第一只读数据表,即,与第二日志表112-3对应的第一只读数据表已被删除单元126删除。这个被删除的第一只读数据表就是第二只读数据表。另,如上所述,该第二只读数据表、第二索引表104-1、第二日志表112-3互相对应。读取单元123根据与该第二只读数据表对应的第二索引表112-3,从第一逻辑层l0中读取与该第二只读数据表对应的日志表,即,读取第二日志表112-3。其中,第二索引表104-3中包含索引项,该索引项包含数据值(value)的操作类型,操作类型例如是更新、插入或者删除。如果第二索引表104-3中的索引项包含的操作类型是删除,那么不会从第二日志表112-3中读取对应的数据值;如果第二索引表104-3中的索引项包含的操作类型是更新或插入,那么就从相关第二日志表112-3中读取对应的数据值。如此,可以根据索引项读取第二日志表112-3中的部分数据值,而不是全部数据值因此,在从硬盘11的第一逻辑层l0读取第二日志表112-3时,读取的数据值会减少,从而减少硬盘io次数。进一步,在步骤s42,转换单元212将内存10中的多个第二索引表追加到第一逻辑层l0中作为多个备份第二索引表。这里,转换单元212例如将内存10中的这些第二索引表104-1、104-2、104-3……追加到l0层中作为多个备份第二索引表104-1’、104-2’、104-3’……。这些备份第二索引表104-1’、104-2’、104-3’……中的索引项分别与第二索引表104-1、104-2、104-3……中的索引项相同。当控制器12出现故障时,例如,控制器12的内存10中存储的第二索引表104-1、104-2、104-3……因故障而丢失时,在硬盘11中的l0层仍然保存有这些备份第二索引表104-1’、104-2’、104-3’……。在这种情况下,读取单元214可以根据备份第二索引表104-3’按照上述同样的方式从第二日志表112-3读取部分数据值。因此,即使在控制器12出现故障时,也可以确保从硬盘11中读取第二日志表中的部分数据值,从而可以进一步确保减少硬盘io次数。接下去,在步骤s44,合并单元124将多个需合并的日志表合并得到合并数据表。本例中,合并单元124将第二日志表112-1和112-3合并得到合并数据表,也就是说,将步骤s43中读取的第一只读数据表102-1以及第二日志表112-3中的部分数据值进行合并,得到合并数据表,例如sst2-1。然后,在步骤s45,存储单元125将合并数据表sst2-1存储到硬盘11的第二逻辑层,记为l1。这里,在需要对硬盘11中的其他逻辑层中的合并数据表sst与第一逻辑层l0中的第二日志表进行合并时,都按照步骤s43中的方式读取第二日志表。进一步,例如在得到合并数据表sst2-1之后,删除单元126从第一逻辑层l0删除需合并的日志表,即,删除第二日志表112-1、112-3,并从内存10删除与第二日志表112-1对应的第一只读数据表102-1以及与第二日志表112-1、112-3分别对应的第二索引表104-1、104-3。如此,可以释放内存10以及硬盘11的l0层的存储空间,用于后续的写入。进一步,例如在得到合并数据表sst2-1之后,删除单元126进一步从第一逻辑层l0删除与需合并的日志表112-1、112-3分别对应的备份第二索引表104-1’、104-3’,从而进一步释放硬盘11的l0层的存储空间。另外,控制器12可以对第二日志结构合并树进行上述写入过程。例如,接收单元120接接收第二写请求,其中,第二写请求携带第二键值(key-value)对;写入单元121将第二写请求写入硬盘11的第一逻辑层l0中的第三日志表以及内存10中的第二数据写入表;其中,第二写请求携带第二键值对;第二数据写入表和第三日志表属于第二日志结构合并树。这里,第一日志结构合并树和第二日志结构合并树的结构完全相同,同时,在存在多个日志结构合并树的情况下,每个日志结构合并树的结构都相同,并可以由图3所表示。本发明实施例中,每个日志结构合并树中的写入数据表对应于一个日志表,当利用多个日志结构合并树树写入不同的数据时(多个线程并发时),不会像现有技术一样写入同一个日志表,从而可以提高写并发性。进一步,本发明实施例可以直接从内存10读取一些第一只读数据表,而无需从硬盘11读取一些第二日志表,同时利用第二索引表,从第二日志表中读取部分数据值,过滤对失效数据值的读取操作,因此可以减少硬盘io次数。如图1所示,本发明实施例提供一种利用日志结构合并树将数据写入的存储设备1,存储设备1包含控制器12和硬盘11,控制器12包括处理器和内存10;该处理器包括图2所示的接收单元120、写入单元121、转换单元122、读取单元123、合并单元124、存储单元125和删除单元126,该处理器用于执行图4所示的方法。本发明实施例还提供一种计算机存储介质和计算机程序产品,在计算机存储介质和计算机程序产品上存储有利用日志结构合并树将数据写入存储设备1的计算机程序指令,存储设备1包含控制器12和硬盘11,存储设备1的控制器12执行计算机程序指令用于执行图4所示的方法。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1