SSTable文件存储方法及装置制造方法

文档序号:6537032阅读:175来源:国知局
SSTable文件存储方法及装置制造方法
【专利摘要】本发明涉及一种SSTable文件存储方法及装置,用以解决存储SSTable文件时所需的磁盘空间较大的问题。该方法包括:读取合并前的多个SSTable文件,其中,每个合并前的SSTable文件中包含多条通过键值标识的行数据;确定合并前的多个SSTable文件所对应的键值区间,其中,合并前的多个SSTable文件所对应的键值区间由合并前的多个SSTable文件中包含的最大键值和最小键值界定;将合并前的多个SSTable文件所对应的键值区间划分为多个子区间,且每个子区间分别对应一个预设的子目录;对合并前的多个SSTable文件中所有键值相同的行数据进行合并,将合并后的行数据按照键值与子区间的对应关系存储为多个合并后的SSTable文件,将多个合并后的SSTable文件分别存储到对应子区间的子目录下。
【专利说明】SSTab I e文件存储方法及装置
【技术领域】
[0001]本发明涉及网络通信【技术领域】,具体涉及一种SSTable文件存储方法及装置。
【背景技术】
[0002]SSTable (Sorted String Table,排序字符串表)文件能够将内存中的数据按照KEY-VALUE的形式高效地存储到磁盘上。具体地,每当内存中写入的数据达到一定大小后,就会一次性刷新到磁盘上形成一个或多个SSTable文件。其中,一次生成多个SSTable文件的情况主要是在要存储的数据量超过了一个标准的SSTable文件的预设大小时才会发生,否则,一次只需生成一个SSTable文件即可。其中,每个SSTable文件包含多条行数据。每条行数据通过一个键值来标识,该键值相当于KEY-VALUE结构中的KEY ;每条行数据中存储的数据内容相当于KEY-VALUE结构中的VALUE。并且,每个SSTable文件中的各条行数据是按照键值KEY的大小有序存储的。
[0003]这些刷新到磁盘上的SSTable文件一旦形成就只能读取不能修改。由于内存中不断有新的数据写入,因此,每隔一定的时间就会形成一些新的SSTable文件。因此,如果不对磁盘上的各个SSTable文件进行定期整理并重新存储,则会占用大量的磁盘空间,进而导致磁盘空间不足。
[0004]目前,在对磁盘上的各个SSTable文件进行定期整理时,主要是通过对各个SSTable文件中键值相同的行数据进行合并来实现的。例如,对于KEY=DTOD3454的键值来说,该键值可能在每个SSTable文件中都存在着对应的行数据,由于这些不同的SSTable文件中的行数据都具有相同的键值,因而表明这些行数据都是关于同一信息项的内容,因此,只需要保留一条最新的行数据以供查询,而对于内容重复的行数据或者时间较早的行数据则可以直接删除。为了实现这一点,需要将磁盘中的所有SSTable文件都打开并读取其中的内容才能确定出关于每一键值的最新存储结果。
[0005]但是,上述方式存在着以下明显缺陷:每次合并存储时都需要同时打开磁盘中的所有SSTable文件,因此当磁盘中的SSTable文件占用空间大于整个磁盘空间的二分之一时,则无法进行上述合并存储工作。例如,假设磁盘空间的总大小为15T,且当前磁盘空间中已经存储了 IOT的SSTable文件,此时,如果要将这些SSTable文件同时打开,则需要磁盘能够额外提供IOT的缓存空间,而这只有在磁盘总大小不小于20T的情况下才能完成,由此可见,现有的SSTable文件的合并存储方式存在很大的局限性,对磁盘空间的要求较高。而且,即使磁盘空间充足,但是由于上述操作需要同时占用很多的系统进程,因而操作失败或死机的风险很高。
[0006]另外,在现有的合并存储方式中,合并后的每个SSTable文件中依然包含所有的键值,因此,合并后SSTable文件的键值数量并未得到简化,导致每次合并过程都会存在上述的诸多缺陷。而且,正是由于合并后SSTable文件的键值数量没有得到简化,因此,每次对SSTable文件进行扫描或读取时都必须打开所有的SSTable文件,所以也不能显著降低扫描或读取操作时的工作量。
【发明内容】

[0007]鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的SSTable文件存储方法及装置。
[0008]依据本发明的一个方面,提供了一种SSTable文件存储方法,包括:读取合并前的多个SSTable文件,其中,每个合并前的SSTable文件中包含多条通过键值标识的行数据;确定所述合并前的多个SSTable文件所对应的键值区间,其中,所述合并前的多个SSTable文件所对应的键值区间由所述合并前的多个SSTable文件中包含的最大键值和最小键值界定;将所述合并前的多个SSTable文件所对应的键值区间划分为多个子区间,且每个子区间分别对应一个预设的子目录;对所述合并前的多个SSTable文件中所有键值相同的行数据进行合并,将合并后的行数据按照键值与子区间的对应关系存储为多个合并后的SSTable文件,将所述多个合并后的SSTable文件分别存储到对应子区间的子目录下。
[0009]可选地,每个合并前的SSTable文件所对应的键值区间相同,且所述每个合并前的SSTable文件所对应的键值区间由该SSTable文件中包含的最大键值和最小键值界定。
[0010]可选地,每个子目录下存储至少一个合并后的SSTable文件,且所述至少一个合并后的SSTable文件所对应的键值区间与该子目录对应的子区间相同,其中,所述至少一个合并后的SSTable文件所对应的键值区间由所述至少一个合并后的SSTable文件中包含的最大键值和最小键值界定。
[0011]可选地,所述将所述多个合并后的SSTable文件分别存储到对应子区间的子目录下的步骤之后,进一步包括:删除所述合并前的多个SSTable文件。
[0012]可选地,按照预设的第一时间间隔循环执行各个步骤。
[0013]可选地,进一步包括:按照预设的第二时间间隔循环执行以下步骤:分别对每个子目录下存储的至少一个合并后的SSTable文件中键值相同的行数据进行合并。
[0014]可选地,进一步包括:依次对每个子目录下存储的至少一个合并后的SSTable文件进行扫描,并且,在对每个子目录下存储的至少一个合并后的SSTable文件进行扫描的过程中,进一步扫描下次合并前的多个SSTable文件。
[0015]依据本发明的另一方面,提供了一种SSTable文件存储装置,包括:读取单元,适于读取合并前的多个SSTable文件,其中,每个合并前的SSTable文件中包含多条通过键值标识的行数据;确定单元,适于确定所述合并前的多个SSTable文件所对应的键值区间,其中,所述合并前的多个SSTable文件所对应的键值区间由所述合并前的多个SSTable文件中包含的最大键值和最小键值界定;划分单元,适于将所述合并前的多个SSTable文件所对应的键值区间划分为多个子区间,且每个子区间分别对应一个预设的子目录;合并存储单元,适于对所述合并前的多个SSTable文件中所有键值相同的行数据进行合并,将合并后的行数据按照键值与子区间的对应关系存储为多个合并后的SSTable文件,将所述多个合并后的SSTable文件分别存储到对应子区间的子目录下。
[0016]可选地,每个合并前的SSTable文件所对应的键值区间相同,且所述每个合并前的SSTable文件所对应的键值区间由该SSTable文件中包含的最大键值和最小键值界定。
[0017]可选地,每个子目录下存储至少一个合并后的SSTable文件,且所述至少一个合并后的SSTable文件所对应的键值区间与该子目录对应的子区间相同,其中,所述至少一个合并后的SSTable文件所对应的键值区间由所述至少一个合并后的SSTable文件中包含的最大键值和最小键值界定。
[0018]可选地,进一步包括:删除单元,适于删除所述合并前的多个SSTable文件。
[0019]可选地,进一步包括:合并子单元,适于分别对每个子目录下存储的至少一个合并后的SSTable文件中键值相同的行数据进行合并。
[0020]可选地,进一步包括:扫描单元,适于依次对每个子目录下存储的至少一个合并后的SSTable文件进行扫描,并且,在对每个子目录下存储的至少一个合并后的SSTable文件进行扫描的过程中,进一步扫描下次合并前的多个SSTable文件。
[0021]通过本发明提供的SSTable文件存储方法及装置,在合并存储之前,首先将各个SSTable文件所对应的键值区间划分为多个子区间,然后,为每个子区间分别设置一个对应的子目录。因此,在合并之后,将合并后的行数据按照键值与子区间的对应关系存储为多个合并后的SSTable文件并分别存储到对应子区间的子目录下。由此可见,合并后的每个SSTable文件中仅包含对应子区间内的键值数据,因而降低了合并后的SSTable文件所包含的键值数量,这样,在后续的合并过程中可以分别对每个子目录下的SSTable文件进行合并,每次合并时仅针对一个子目录中相应子区间的键值数据进行合并,由此,在后续的合并过程中节约了磁盘空间,降低了操作失败或死机的风险。而且,由于合并后的SSTable文件所包含的键值数量得到了简化,所以在扫描或读取某一键值时,只需查找对应子目录下的文件即可,因而还能显著降低扫描或读取操作时的工作量。
[0022]上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的【具体实施方式】。
【专利附图】

【附图说明】
[0023]通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
[0024]图1示出了本发明一个实施例提供的SSTable文件存储方法的流程图;
[0025]图2示出了本发明另一具体实施例提供的SSTable文件存储方法的流程图;以及
[0026]图3示出了本发明实施例提供的SSTable文件存储装置的结构图。
【具体实施方式】
[0027]下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
[0028]本发明实施例提供了一种SSTable文件存储方法及装置,用以解决现有技术中存储SSTable文件时所需的磁盘空间较大,而且也不能显著降低扫描或读取操作时的工作量的问题。
[0029]图1示出了本发明实施例提供的SSTable文件存储方法的流程图。如图1所示,该方法包括如下步骤:
[0030]步骤SllO:读取合并前的多个SSTable文件,其中,每个合并前的SSTable文件中包含多条通过键值标识的行数据。
[0031]步骤S120:确定合并前的多个SSTable文件所对应的键值区间,其中,合并前的多个SSTable文件所对应的键值区间由合并前的多个SSTable文件中包含的最大键值和最小键值界定。
[0032]其中,每个合并前的SSTable文件所对应的键值区间相同,且每个合并前的SSTable文件所对应的键值区间也是通过该SSTable文件中包含的最大键值和最小键值界定的。换句话说,每个合并前的SSTable文件都包含全部的键值数据。
[0033]步骤S130:将合并前的多个SSTable文件所对应的键值区间划分为多个子区间,且每个子区间分别对应一个预设的子目录。
[0034]步骤S140:对合并前的多个SSTable文件中所有键值相同的行数据进行合并,将合并后的行数据按照键值与子区间的对应关系存储为多个合并后的SSTable文件,将多个合并后的SSTable文件分别存储到对应子区间的子目录下。
[0035]其中,每个子目录下存储至少一个合并后的SSTable文件,且至少一个合并后的SSTable文件所对应的键值区间与该子目录对应的子区间相同,其中,至少一个合并后的SSTable文件所对应的键值区间由至少一个合并后的SSTable文件中包含的最大键值和最小键值界定。这里,每个合并后的SSTable文件中仅包含相应的子区间所对应的部分键值数据。
[0036]由此可见,通过上面的合并存储方式,降低了每个合并后的SSTable文件中所包含的键值数量,为下次合并提供了便利。
[0037]可选地,为了降低磁盘空间的占用量,在步骤S140之后,该方法进一步包括步骤:删除合并前的多个SSTable文件。
[0038]另外,由于内存空间中不断有新的数据写入,因此,磁盘空间上的SSTable文件数量也会不断增加,因而,上述的各个步骤可以按照预设的第一时间间隔循环执行。
[0039]进一步地,当上述的各个步骤执行多次之后,每个子目录下的合并后的SSTable文件数量也会不断增多,因此,为了进一步降低磁盘占用量,在该方法中,还可以按照预设的第二时间间隔循环执行以下步骤:分别对每个子目录下存储的至少一个合并后的SSTable文件中键值相同的行数据进行合并。在此过程中,一次只针对一个子目录下的SSTable文件进行合并,且这些SSTable文件中仅存储了与相应子区间对应的键值数据,因而显著降低了这一过程中所需的磁盘空间。
[0040]另外,基于本发明提供的SSTable文件存储方法,当需要对SSTable文件进行扫描时,可以依次对每个子目录下存储的至少一个合并后的SSTable文件进行扫描,并且,在对每个子目录下存储的至少一个合并后的SSTable文件进行扫描的过程中,进一步扫描下次合并前的多个SSTable文件。由于每个子目录下仅存储了部分键值数据,因此,通过这样的方式可以降低扫描时的工作量。
[0041]图2示出了本发明一个具体实施例提供的SSTable文件存储方法的流程图。如图2所示,该方法包括如下步骤:
[0042]步骤S210:读取合并前的多个SSTable文件。[0043]这里,步骤S210可以通过预设的条件触发。其中,该预设的条件例如可以是当磁盘空间中写入的SSTable文件数量(或大小)达到一定阈值(例如达到100个文件)时;或者,该预设的条件也可以是每隔一定的时间间隔(例如每隔两小时);或者,该预设的条件还可以是每天或每星期的固定时间点(例如每天早八点)等。每当满足该预设的条件时,步骤S210及其后续的步骤就会被触发。
[0044]在本实施例中,以每当磁盘中的SSTable文件数量达到100个时触发步骤S210为例进行说明。假设系统运行一段时间后,根据内存空间中的存储数据,已经向磁盘空间中写入了 100个SSTable文件,这时,步骤S210被触发,从而打开并读取这100个合并前的SSTable文件。其中,每个合并前的SSTable文件中包含多条通过键值(KEY)进行标识的行数据。
[0045]步骤S220:确定合并前的多个SSTable文件所对应的键值区间。
[0046]在本实施例中,键值区间是指由SSTable文件中包含的最大键值(KEY-max)和最小键值(KEY-min)所界定的区间范围。假设一个SSTable文件中包含的最大键值KEY-max=1000,最小键值KEYnin=I,则该SSTable文件所对应的键值区间为[1,1000]。相应地,在本步骤中,合并前的多个SSTable文件所对应的键值区间是指:由多个SSTable文件中包含的最大键值和最小键值所界定的区间范围。
[0047]具体地,在实际情况中,每个合并前的SSTable文件所对应的键值区间相同。通俗地说,在合并之前,每个SSTable文件中都包含从最小键值到最大键值之间的所有键值数据。例如,假设在本实施例中,要存储的信息项总共有1000项(实际情况中一定多于1000项,本文为了描述方便而作此假设),因此,在数据库中为每个信息项分别赋予一个唯一的键值(KEY),以便在数据库中标识相应的信息项的内容。所以,通常情况下,从内存空间中写入的每个SSTable文件中都包含着[1,1000]这一区间内的所有键值所对应的行数据。因此,在步骤S220中确定的合并前的多个SSTable文件所对应的键值区间就是[1,1000]。
[0048]步骤S230:将合并前的多个SSTable文件所对应的键值区间[1,1000]划分为多个子区间,且每个子区间分别对应一个预设的子目录。
[0049]其中,子区间的划分数量是根据磁盘空间的大小以及每相邻的两次合并操作之间的时间间隔等信息灵活确定的。在本实施例中,假设子区间的数量为5个,相应地,在本实施例中会预先设置5个与其对应的子目录。第一个子区间为[1,200],其与子目录一相对应;第二个子区间为[201,400],其与子目录二相对应;第三个子区间为[401,600],其与子目录三相对应;第四个子区间为[601,800],其与子目录四相对应;第五个子区间为[801,1000],其与子目录五相对应。
[0050]步骤S240:对合并前的100个SSTable文件中所有键值相同的行数据进行合并,将合并后的行数据按照键值与子区间的对应关系存储为多个合并后的SSTable文件,将多个合并后的SSTable文件分别存储到对应子区间的子目录下。
[0051]在本步骤执行之前,磁盘空间上共存储有100个合并前的SSTable文件,并且,每个SSTable文件中都存储着键值在I到1000之内的所有行数据。因此,在执行合并操作时,需要分别针对每一键值所对应的行数据进行合并。例如,假设先合并键值为I的行数据,为此,首先需要在这100个合并前的SSTable文件中分别查找键值为I的行数据。然后,将查找到的各个文件中键值为I的行数据进行合并,具体合并时,主要根据各个行数据的创建时间的先后来合并。例如,假设在每个SSTable文件中都找到了一条键值为I的行数据,SP总共找到了 100条键值为I的行数据,此时,需要判断哪条行数据的创建时间最新,然后仅保留创建时间最新的行数据即可,在此过程中,如果有多条键值和内容均相同的行数据也将被合并。由此可见,对于键值为I的行数据来说,经过合并之后,所有创建时间靠前的行数据都被删除,仅保留了一条最新的行数据。同理,对于其他键值的行数据来说,经过合并之后,也都仅保留一条最新的行数据。由此可见,通过步骤S240的合并过程,将100个合并前的SSTable文件整理为1000条键值从I到1000顺序排列的行数据,且每条行数据互不重复。
[0052]接下来,将合并后的行数据(即上述1000条键值从I到1000顺序排列的行数据)按照键值与子区间的对应关系存储为多个合并后的SSTable文件,并将多个合并后的SSTable文件分别存储到对应子区间的子目录下。具体地,在本实施例中,针对[1,200]这一子区间来说,需要提取键值为I到200的行数据,将这200条行数据存储为文件名为“1-200 (I)”的SSTable文件,该文件名的含义是:经过第一次合并操作后形成的键值区间为[1,200]的SSTable文件,其中,文件名为“1-200 (I)”的SSTable文件存储到子目录一下。针对[201,400]这一子区间来说,需要提取键值为201到400的行数据,将这200条行数据存储为文件名为“201-400 (I)”的SSTable文件,该文件名的含义是:经过第一次合并操作后形成的键值区间为[201,400]的SSTable文件,其中,文件名为“201-400 (I)”的SSTable文件存储到子目录二下。针对[401,600]这一子区间来说,需要提取键值为401到600的行数据,将这200条行数据存储为文件名为“401-600 (I)”的SSTable文件,该文件名的含义是:经过第一次合并操作后形成的键值区间为[401,600]的SSTable文件,其中,文件名为“401-600 (I)”的SSTable文件存储到子目录三下。同理,针对[601,800]以及[801,1000]这两个子区间,也分别执行类型的操作,得到文件名分别为“601-800 (I)”和“801-1000 (I)”的两个SSTable文件,并分别存储到子目录四和子目录五下。这里,各个SSTable文件的命名方式仅为示意性的,本领域技术人员也可以采用其它的方式为其命名,本发明对此不作限定。
[0053]由此可见,通过步骤S210至步骤S240的执行过程,对合并前的100个SSTable文件中过时的或重复的行数据进行了删除,并将合并后的行数据重新存储为5个键值区间分别为[1,200]、[201,400]、[401,600]、[601,800]和[801,1000]的 SSTable 文件,并将这五个SSTable文件分别存储到子目录一至五内。在本实施例中,每经过一次合并之后,每个子目录内仅增加一个合并后的SSTable文件,然而,在本发明其他的实施例中,如果预先设定的合并后的SSTable文件的大小有限,例如只能存储100条行数据,则需要将上述合并后的每个SSTable文件拆分成两个文件来存储,相应地,每经过一次合并之后,每个子目录内增加两个合并后的SSTable文件。
[0054]步骤S250:删除合并前的100个SSTable文件,以便释放磁盘空间。
[0055]由此可见,通过步骤S210至步骤S250的执行过程,将直接存储在磁盘空间内的100个合并前的SSTable文件精简为5个合并后的SSTable文件,且每个合并后的SSTable文件分别存储在相应的子目录下。
[0056]在上述的步骤S210至步骤S250执行完一次之后,磁盘空间上还将写入新的SSTable文件,因此,经过一定的时间后,步骤S210中提到的预设的条件将再次得到满足,例如,磁盘空间上又存储了 100个SSTable文件,此时,将再次执行步骤S210。
[0057]在第二次执行步骤S210时,与第一次执行步骤S210的方式一样,也要从磁盘空间上打开并读取合并前的100个SSTable文件(即在第一次合并之后又生成的新的SSTable文件)。
[0058]接下来,继续执行步骤S220以及步骤S230。这里,如果在系统的整个运行过程中,每次合并前的SSTable文件所对应的键值区间不会发生变化,一直都是[1,1000],则可以在第二次合并时(以及第三次及后续的合并过程中)跳过步骤S220和步骤S230,即:执行完步骤S210之后直接执行步骤S240。
[0059]但是,如果在系统的整个运行过程中,每次合并前的SSTable文件所对应的键值区间有可能发生变化,例如,在后续合并时,可能会出现键值大于1000的键值,则有必要再次执行步骤S220以及步骤S230。但是,在再次执行步骤S220以及步骤S230的过程中,并不会对第一次已经用到的子目录所对应的子区间的划分方式进行任何变更,只会在此基础上再增加一些新的子目录以及相应的子区间。也就是说,在第一次合并时,每个子目录以及子区间的对应关系已经确定好,在后续的合并过程中不会发生变更。
[0060]例如,假设第二次执行步骤S220时,确定出合并前的SSTable文件所对应的键值区间变化为[1,1200],则在第二次执行步骤S230时,将键值区间[1,1200]依次划分为如下六个子区间:[1,200]、[201,400]、[401,600]、[601,800]、[801,1000]、[1001,1200],这六个子区间分别与预设的子目录一至六对应。也就是说,原来的子目录一至五及其对应的子区间不变,又增加了一个子目录六,该子目录六与新增的子区间[1001,1200]相对应,用于存储键值在区间[1001,1200]内的行数据所组成的SSTable文件。
[0061]然后,在第二次执行步骤S240的过程中,按照与第一次执行步骤S240相同的方式,对合并前的100个SSTable文件中所有键值相同的行数据进行合并,将合并后的行数据按照键值与子区间的对应关系存储为多个合并后的SSTable文件,将多个合并后的SSTable文件分别存储到对应子区间的子目录下。
[0062]具体地,假设在第二次合并时,合并前的SSTable文件所对应的键值区间变化为[1,1200],因此,在第二次执行步骤S240之前,磁盘空间上共存储有100个合并前的SSTabIe文件,并且,每个SSTabIe文件中都存储着键值在I到1200之内的所有行数据。因此,在执行合并操作时,需要分别针对每一键值所对应的行数据进行合并。通过该合并,将100个合并前的SSTable文件整理为1200条键值从I到1200顺序排列的行数据,且每条行数据互不重复。接下来,将合并后的1200条行数据按照键值与子区间的对应关系存储为六个合并后的SSTable文件,并将六个合并后的SSTable文件分别存储到对应子区间的子目录下。具体地,针对[1,200]这一子区间来说,需要提取键值为I到200的行数据,将这200条行数据存储为文件名为“1-200 (2)”的SSTable文件,该文件名的含义是:经过第二次合并操作后形成的键值区间为[1,200]的SSTable文件,其中,文件名为“1-200 (2)”的SSTable文件存储到子目录一下。针对[201,400]这一子区间来说,需要提取键值为201到400的行数据,将这200条行数据存储为文件名为“201-400(2)”的SSTable文件,该文件名的含义是:经过第二次合并操作后形成的键值区间为[201,400]的SSTable文件,其中,文件名为“201-400 (2)”的SSTable文件存储到子目录二下。针对[401,600]这一子区间来说,需要提取键值为401到600的行数据,将这200条行数据存储为文件名为“401-600(2)”的SSTable文件,该文件名的含义是:经过第二次合并操作后形成的键值区间为[401,600]的SSTab I e文件,其中,文件名为“ 401-600 (2 ) ”的SSTab I e文件存储到子目录三下。同理,针对[601,800]以及[801,1000]这两个子区间,也分别执行类型的操作,得到文件名分别为“601-800 (2)”和“801-1000 (2)”的两个SSTable文件,并分别存储到子目录四和子目录五下。另外,对于新增的[1001,1200]这一子区间来说,需要提取键值为1001到1200的行数据,将这200条行数据存储为文件名为“1001-1200 (2)”的SSTable文件,该文件名的含义是:经过第二次合并操作后形成的键值区间为[1001,1200]的SSTable文件,其中,文件名为“1001-1200 (2)”的SSTable文件存储到子目录六下。
[0063]由此可见,通过第二次执行步骤S210至步骤S240,将合并前的100个SSTable文件重新存储为6个键值区间分别为[I, 200]、[201,400]、[401,600]、[601,800]、[801,1000]和[1001,1200]的SSTable文件,并将这6个SSTable文件分别存储到子目录一至六内。由此可见,经过第二次合并之后,子目录一至五内分别具有两个合并后的SSTable文件,子目录六内具有一个合并后的SSTable文件。
[0064]在此之后,再次执行步骤S250,删除合并前的100个SSTable文件,以便释放磁盘空间。
[0065]在上述的步骤S210至步骤S2 5O执行完两次之后,磁盘空间上还将写入新的SSTable文件,因此,经过一定的时间后,步骤S210中提到的预设的条件将再一次得到满足,因此,上述的步骤S210至步骤S250还将继续执行……
[0066]由于上述的步骤S210至步骤S250是循环执行的,因此,每次执行步骤S210时,要合并的SSTable文件数都不会太多(例如本实施例中为100个),因此,每次合并时对磁盘空间的存储容量要求不高,所以一般的磁盘都能应用本发明提供的方法进行整理。而且,由于每次合并时打开的SSTable文件数不多,因而不会占用大量的系统进程,显著降低了操作失败或死机的风险。
[0067]另外,在上述的步骤S210至步骤S250循环执行一定的次数之后,各个子目录中存储的合并后的SSTable文件数量也将持续增加,从而占用一定的磁盘空间。为了进一步释放磁盘空间,本发明实施例中的方法还可以进一步包括步骤S260,在步骤S260中,分别对每个子目录下存储的至少一个合并后的SSTable文件中键值相同的行数据进行合并。
[0068]假设步骤S210至步骤S250循环执行十次之后,每个子目录中存储了十个合并后的SSTable文件。例如,以子目录一为例来说,该子目录中存储了文件名分别为“ 1_200(1),,、“1-200 (2),,、“ 1-200 (3)”......“1-200 (10)”的十个 SSTable 文件,且每个 SSTable
文件所对应的键值区间均为[1,200],即:每个SSTable文件中都存储着键值在I到200之内的行数据。在步骤S260中执行合并操作时,也需要分别针对每一键值所对应的行数据进行合并。例如,假设先合并键值为I的行数据,为此,首先需要在这10个SSTable文件中分别查找键值为I的行数据。然后,将查找到的各个文件中键值为I的行数据进行合并,具体合并时,主要根据各个行数据的创建时间的先后来合并。例如,假设在每个SSTable文件中都找到了一条键值为I的行数据,即总共找到了 10条键值为I的行数据,此时,需要判断哪条行数据的创建时间最新,然后仅保留创建时间最新的行数据即可,在此过程中,如果有多条键值和内容均相同的行数据也将被合并。由此可见,对于键值为I的行数据来说,经过合并之后,所有创建时间靠前的行数据都被删除,仅保留了一条最新的行数据。同理,对于其他键值的行数据来说,经过合并之后,也都仅保留一条最新的行数据。由此可见,通过步骤S260的合并过程,将子目录一中存储的10个SSTable文件整理为200条键值从I到200顺序排列的行数据,且每条行数据互不重复。然后,直接将这200条行数据存储为一个新的SSTable文件并存储到子目录一下即可,同时删除子目录一中原有的十个SSTable文件。由此可见,经过步骤S260之后,每个子目录下仅保留一个合并后的SSTable文件,且该SSTable文件的键值区间不变。由此进一步减少了对磁盘空间的占用。
[0069]由于步骤S210至步骤S250中的合并操作是循环执行的,因此,步骤S260中的合并操作也可以循环执行。一般情况下,可以将步骤S260中的合并操作的周期设置得比步骤S210至步骤S250中的合并操作的周期更长,例如,假设步骤S210至步骤S250每天都执行,且每天每隔两个小时就执行一次。而对于每个子目录来说,每周执行一次步骤S260中的合并操作,例如,每周一对子目录一下的文件执行步骤S260中的合并操作,每周二对子目录二下的文件执行步骤S260中的合并操作,依次类推。
[0070]由此可见,在步骤S260的合并过程中,一次只针对一个子目录进行合并,而该子目录中仅包含相应子区间的键值数据,因而存储的数据量大幅减少,相应地,在合并时所需的缓存空间也大幅减少(只需要等于一个子目录中的文件大小的缓存空间即可),由此降低了对磁盘空间的要求,可适用于常规规格的任意磁盘。
[0071]综上所述,在本发明实施例提供的方法的执行过程中,磁盘空间上的SSTable文件分为两大部分,第一部分为直接存储在磁盘空间上的未经合并的SSTable文件,这些SSTable文件的键值区间包含全部键值;第二部分为存储在各个子目录下的经过合并后的SSTable文件,这些SSTable文件的键值区间仅包含部分键值。基于上述的存储结构,本发明实施例中还可以进一步包括步骤S170。
[0072]在步骤S170中,依次对每个子目录下存储的至少一个合并后的SSTable文件进行扫描(即扫描上述的第二部分的文件),并且,在对每个子目录下存储的至少一个合并后的SSTable文件进行扫描的过程中,进一步扫描下次合并前的多个SSTable文件(即扫描上述的第一部分的文件)。
[0073]例如,对于依次扫描键值I至1000内的行数据这一任务来说,可以将该任务分解为五个子任务来执行。第一个子任务是扫描键值I至200内的行数据,在该子任务的执行过程中,需要打开子目录一下存储的各个SSTable文件进行扫描,并同时打开直接存储在磁盘空间上的未经合并的SSTable文件,从这些文件中查找键值I至200内的行数据即可。第二个子任务是扫描键值201至400内的行数据,在该子任务的执行过程中,需要打开子目录二下存储的各个SSTable文件进行扫描,并同时打开直接存储在磁盘空间上的未经合并的SSTable文件,从这些文件中查找键值201至400内的行数据即可。由此可见,基于本发明中的存储方式,可以将一个大的扫描任务分解为多个小的子任务来依次执行,并且,在每个子任务的执行过程中,只需打开对应子目录中的SSTable文件以及直接存储在磁盘空间上未经合并的SSTable文件即可,因此,在每个子任务的执行过程中需要的缓存空间等于一个子目录中的SSTable文件大小以及未经合并的SSTable文件大小之和。
[0074]由此可见,基于本发明中的存储方法,在执行SSTable文件的扫描时,不必打开所有的SSTable文件(现有技术中的存储方法在扫描时必须打开全部的SSTable文件才能实现对于某一键值的扫描),由此降低了同时打开的文件数,从而减少了内存开销,提升了扫描性能。
[0075]另外,本发明实施例中的方法还可以应用在数据备份存储的情况中,例如,假设上述磁盘空间中的SSTable文件分别存储在三台计算机上,每台计算机上存储的SSTable文件相同,此时,可以在每台计算机上分别执行本发明实施例中的操作过程。并且,在执行扫描时,可以是由一台计算机对另外一台计算机进行扫描,以判断自身存储的数据与另外一台计算机上存储的备份数据是否相同。总之,本发明实施例中的方法可应用于各类场景中。
[0076]另外,在有些数据量非常大的情况中,SSTable文件的数量可能非常多,这些SSTable文件分为四个分区文件(分区零至三),每个分区中的文件各不相同。例如,假设系统中共有四台计算机,每台计算机上存储了三个分区的SSTable文件:计算机一上存储了分区三所对应的主文件以及分区一、二所对应的备份文件;计算机二上存储了分区零所对应的主文件以及分区二、三所对应的备份文件;计算机三上存储了分区一所对应的主文件以及分区零、三所对应的备份文件;计算机四上存储了分区二所对应的主文件以及分区零、一所对应的备份文件。由此可见,每个分区对应的文件都通过各个计算机存储了三份,其中一份为主文件,另外两份为备份文件。在这样的存储结构中,对于每台计算机而言,也可以对每个分区所对应的文件分别执行本发明实施例中的各个步骤的操作。
[0077]图3示出了本发明实施例提供的SSTable文件存储装置的结构图。如图3所示,该装置300至少包括:读取单元31、确定单元32、划分单元33以及合并存储单元34。
[0078]其中,读取单元31读取合并前的多个SSTable文件,其中,每个合并前的SSTable文件中包含多条通过键值标识的行数据。
[0079]确定单元32确定合并前的多个SSTable文件所对应的键值区间,其中,合并前的多个SSTable文件所对应的键值区间由合并前的多个SSTable文件中包含的最大键值和最小键值界定。其中,每个合并前的SSTable文件所对应的键值区间相同,且每个合并前的SSTable文件所对应的键值区间由该SSTable文件中包含的最大键值和最小键值界定。
[0080]划分单元33将合并前的多个SSTable文件所对应的键值区间划分为多个子区间,且每个子区间分别对应一个预设的子目录。
[0081]合并存储单元34对合并前的多个SSTable文件中所有键值相同的行数据进行合并,将合并后的行数据按照键值与子区间的对应关系存储为多个合并后的SSTable文件,将多个合并后的SSTable文件分别存储到对应子区间的子目录下。
[0082]其中,每个子目录下存储至少一个合并后的SSTable文件,且至少一个合并后的SSTable文件所对应的键值区间与该子目录对应的子区间相同,其中,至少一个合并后的SSTable文件所对应的键值区间由至少一个合并后的SSTable文件中包含的最大键值和最小键值界定。
[0083]可选地,为了释放磁盘空间,该装置300进一步包括:删除单元35,用于在合并存储单元34工作完成后删除合并前的多个SSTable文件。
[0084]可选地,为了更加高效地合并文件,该装置300进一步包括:合并子单元,用于分别对每个子目录下存储的至少一个合并后的SSTable文件中键值相同的行数据进行合并。
[0085]可选地,该装置300进一步包括:扫描单元,适于依次对每个子目录下存储的至少一个合并后的SSTable文件进行扫描,并且,在对每个子目录下存储的至少一个合并后的SSTable文件进行扫描的过程中,进一步扫描下次合并前的多个SSTable文件。[0086]上述的各个单元的具体工作过程可参照方法实施例中相应部分的描述,此处不再赘述。
[0087]通过本发明提供的SSTable文件存储方法及装置,在合并存储之前,首先将各个SSTable文件所对应的键值区间划分为多个子区间,然后,为每个子区间分别设置一个对应的子目录。因此,在合并之后,将合并后的行数据按照键值与子区间的对应关系存储为多个合并后的SSTable文件并分别存储到对应子区间的子目录下。由此可见,合并后的每个SSTable文件中仅包含对应子区间内的键值数据,因而降低了合并后的SSTable文件所包含的键值数量,这样,在后续的合并过程中可以分别对每个子目录下的SSTable文件进行合并,每次合并时仅针对一个子目录中相应子区间的键值数据进行合并,由此,在后续的合并过程中节约了磁盘空间,降低了操作失败或死机的风险。而且,由于合并后的SSTable文件所包含的键值数量得到了简化,所以在扫描或读取某一键值时,只需查找对应子目录下的文件即可,因而还能显著降低扫描或读取操作时的工作量。
[0088]根据本发明的另一个实施例,本发明提供了 SSTable文件存储方法及装置,首先将各个SSTable文件所对应的键值区间划分为多个子区间,然后,为每个子区间分别设置一个对应的子目录。然后,依次将键值完全位于某个子区间内的SSTable文件存储至该子区间对应的子目录,将键值不能完全落入某个子区间内的SSTable文件存储至特定目录。此后,根据预定的合并策略(如定时)仅针在某个(些)子区间内进行SSTable文件的合并,由此,在后续的合并过程中节约了磁盘空间,降低了操作失败或死机的风险。
[0089]在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
[0090]在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
[0091]类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循【具体实施方式】的权利要求书由此明确地并入该【具体实施方式】,其中每个权利要求本身都作为本发明的单独实施例。
[0092]本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
[0093]此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
[0094]本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP )来实现根据本发明实施例的装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
[0095]应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
【权利要求】
1.一种SSTable文件存储方法,包括: 读取合并前的多个SSTable文件,其中,每个合并前的SSTable文件中包含多条通过键值标识的行数据; 确定所述合并前的多个SSTable文件所对应的键值区间,其中,所述合并前的多个SSTable文件所对应的键值区间由所述合并前的多个SSTable文件中包含的最大键值和最小键值界定; 将所述合并前的多个SSTable文件所对应的键值区间划分为多个子区间,且每个子区间分别对应一个预设的子目录; 对所述合并前的多个SSTable文件中所有键值相同的行数据进行合并,将合并后的行数据按照键值与子区间的对应关系存储为多个合并后的SSTable文件,将所述多个合并后的SSTable文件分别存储到对应子区间的子目录下。
2.如权利要求1所述的方法,其中,每个合并前的SSTable文件所对应的键值区间相同,且所述每个合并前的SSTable文件所对应的键值区间由该SSTable文件中包含的最大键值和最小键值界定。
3.如权利要求1或2所述的方法,其中,每个子目录下存储至少一个合并后的SSTable文件,且所述至少一个合并后的SSTable文件所对应的键值区间与该子目录对应的子区间相同,其中,所述至少一个合并后的SSTable文件所对应的键值区间由所述至少一个合并后的SSTable文件中包含的最大键值和最小键值界定。
4.如权利要求1所述的方法,其中,所述将所述多个合并后的SSTable文件分别存储到对应子区间的子目录下的步 骤之后,进一步包括:删除所述合并前的多个SSTable文件。
5.如权利要求4所述的方法,其中,按照预设的第一时间间隔循环执行各个步骤。
6.如权利要求5所述的方法,其中,进一步包括:按照预设的第二时间间隔循环执行以下步骤:分别对每个子目录下存储的至少一个合并后的SSTable文件中键值相同的行数据进行合并。
7.如权利要求1所述的方法,其中,进一步包括:依次对每个子目录下存储的至少一个合并后的SSTable文件进行扫描,并且,在对每个子目录下存储的至少一个合并后的SSTable文件进行扫描的过程中,进一步扫描下次合并前的多个SSTable文件。
8.一种SSTable文件存储装置,包括: 读取单元,适于读取合并前的多个SSTable文件,其中,每个合并前的SSTable文件中包含多条通过键值标识的行数据; 确定单元,适于确定所述合并前的多个SSTable文件所对应的键值区间,其中,所述合并前的多个SSTable文件所对应的键值区间由所述合并前的多个SSTable文件中包含的最大键值和最小键值界定; 划分单元,适于将所述合并前的多个SSTable文件所对应的键值区间划分为多个子区间,且每个子区间分别对应一个预设的子目录; 合并存储单元,适于对所述合并前的多个SSTable文件中所有键值相同的行数据进行合并,将合并后的行数据按照键值与子区间的对应关系存储为多个合并后的SSTable文件,将所述多个合并后的SSTable文件分别存储到对应子区间的子目录下。
9.如权利要求8所述的装置,其中,每个合并前的SSTable文件所对应的键值区间相同,且所述每个合并前的SSTable文件所对应的键值区间由该SSTable文件中包含的最大键值和最小键值界定。
10.如权利要求8或9所述的装置,其中,每个子目录下存储至少一个合并后的SSTable文件,且所述至少一个合并后的SSTable文件所对应的键值区间与该子目录对应的子区间相同,其中,所述至少一个合并后的SSTable文件所对应的键值区间由所述至少一个合并后的SSTable文件中包含的最大键值和最小键值界定。
【文档编号】G06F17/30GK103744628SQ201410039183
【公开日】2014年4月23日 申请日期:2014年1月27日 优先权日:2014年1月27日
【发明者】杨威, 唐会军 申请人:北京奇虎科技有限公司, 奇智软件(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1