本发明属于计算机科学存储系统领域,尤其涉及一种基于日志结构合并树的键值存储的数据快速读取方法。
背景技术:
::数据密集型的企业级应用程序经常使用持久键值存储系统来进行数据读写,例如web网站爬虫,社交网络,图像存储等。持久键值存储系统一般会提供常用的操作接口,如对键值对的写入/更新,对数据的读取/点查询和扫描(范围查询)来服务各种应用程序。在众多键值存储系统中,基于日志结构的合并树(lsm-tree)的键值存储系统尤其受欢迎,主要原因是它们将密集的随机写转换为顺序写以充分利用磁盘的i/o带宽。基于lsm-tree的键值存储系统通常由内存模块和磁盘模块组成:内存模块由跳表数据结构组成,磁盘模块由多级数据层组成,每一级数据层在键值上是有序的。基于lsm-tree的键值存储系统首先在内存模块中缓冲足够的随机写入的数据,将其转化为有序的数据表,然后将有序的数据表写入磁盘模块中。数据写入磁盘模块后,先将数据表写入第一级数据层,如果第一级数据层写满后,会从第一级数据层中选取一个数据表写入第二级数据层;如果第二级数据层写满后,会再从第二级数据层选取一个数据表写入第三级数据层,以此类推。多级数据层大小会呈指数级增加,邻近的下一级数据层会扩大为上一级的10倍,如第三级数据层的大小是第二级数据层的10倍。以常用的键值存储系统leveldb为例,其level0存在多个键值范围覆盖的sstable,其level1到最后一层leveln的每一层sstable按键值大小顺序排列。如果目标数据位于磁盘模块的靠后的数据层,则在查询目标数据时需要先查找内存模块里的数据,然后从上到下查询多级数据层。在查询每一级数据层时,leveldb需要访问每一层的元数据,选取可能存在目标数据的sstable,然后通过读取sstable的indexblock来确定数据可能在哪个datablock中;在读取datablock之前,还需读取对应的bloomfilter来确定目标key是否在该datablock中;如果bloomfilter计算确定目标key存在于datablock中,就从datablock中读取数据。所以,对于leveldb的读请求来说,如果查询目标数据时需要涉及查询多级数据层,将会产生高昂的读开销。因此现有的基于lsm-tree的键值存储系统有严重的读放大问题,会引发大量的读取的i/o请求。技术实现要素:本发明针对现有的基于lsm-tree的键值存储系统存在的读放大问题,提出一种利用额外内存索引来加速数据读取的方法。一种基于日志结构合并树的键值存储的数据快速读取方法,其特征在于,包括以下步骤:步骤1:通过多层数据层构建日志结构合并树,日志结构合并树的每层数据层中存取多组键值数据对,统计分析日志结构合并树的每层数据层中数据读取频率,根据日志结构合并树的每层数据层中数据读取频率将日志结构合并树划分为高读取频率的数据层以及低读取频率的数据层,通过日志结构合并树高读取频率的数据层构建多层布谷鸟哈希表应用数据读取层;步骤2:针对每层布谷鸟哈希表应用数据读取层中,若键值数据对中索引的字节数量大于字节阈值则将键值数据对中索引进行md5编码后存入布谷鸟哈希表,否则键值数据对中索引仍存取至布谷鸟哈希表应用数据读取层即日志结构合并树;步骤3:在进行数据索引读取时,若数据属于日志结构合并树多层数据层中高读取频率的数据层,则通过布谷鸟哈希表应用数据读取层中索引读取键值数据对中数据;若数据属于日志结构合并树多层数据层中低读取频率的数据层,则通过日志结构合并树中键值数据对中索引读取键值数据对中数据。作为优选,步骤1所述日志结构合并树包括:第一层日志结构合并树数据层、第二层日志结构合并树数据层、...、第m层日志结构合并树数据层;步骤1所述日志结构合并树的每层数据层中存取多组键值数据对为:其中,m表示日志结构合并树的数据层的层数,<keyi,j,valuei,j>表示日志结构合并树中第i层数据层中第j组键值数据对,keyi,j表示日志结构合并树中第i层数据层中第j组键值数据对中索引,valuei,j表示日志结构合并树中第i层数据层中第j组键值数据对中数据,j∈[1,ni],ni表示日志结构合并树中第i层数据层中键值数据对的数量;步骤1所述日志结构合并树的每层数据层的数据读取频率为:f1、f2...、fm其中,fi为日志结构合并树第i层数据层的数据读取频率;统计分析日志结构合并树中每层数据层的数据读取频率的方法为:当数据在日志结构合并树中每层数据层进行查找时,若查询到目标数据则返回目标结果;若未查询到目标数据则到日志结构合并树中下一层数据层去查询;若查询到目标数据定义为正查询,若未查询到目标数据定义为负查询;统计日志结构合并树中每层数据层的数据的读取频率为正查询次数和负查询次数之和,即fi=fp-i ff-i。步骤1所述根据日志结构合并树的每层数据层中数据读取频率在日志结构合并树划分为高读取频率的数据层以及低读取频率的数据层为:若查询的目标数据在日志结构合并树中第i层数据层时,则需要进行(i-1)次的负查询和1次正查询;设定读取频率比例阈值为t,0.3≤t≤0.5,用于计算所述的日志结构合并树高读取频率的数据层;设置内存最大值为smax;所述计算所述的日志结构合并树高读取频率的数据层为:(f1 f2 … fk)/(f1 f2 … fm)<=t(s1 s2 … sk)<=smax其中,fi为日志结构合并树第i层数据层的数据读取频率,i∈[1,m],fk为日志结构合并树中第k层高读取频率的数据层,k∈[1,k],t为读取频率比例阈值;日志结构合并树的每层数据层的存到布谷哈希表中所占有的空间大小依次为:s1、s2...、sm其中,si为日志结构合并树第i层数据层的数据存到布谷哈希表中所占有的空间大小;sk=nk*b其中,nk为日志结构合并树中第k层高读取频率的数据层中键值数据对的数量,b为布谷哈希表的哈希桶的大小;日志结构合并树中第一层数据层、日志结构合并树中第二层数据层、...、日志结构合并树中第k层数据层为步骤1所述的日志结构合并树中高读取频率的数据层;日志结构合并树中第k 1层数据层、日志结构合并树中第k 2层数据层、...、日志结构合并树中第m层数据层为步骤1所述的日志结构合并树中低读取频率的数据层;步骤1所述多层布谷鸟哈希表应用数据读取层为:日志结构合并树中第一层数据层、日志结构合并树中第二层数据层、...、日志结构合并树中第k层数据层,k<m。现有的技术在为日志结构合并树构建额外索引加速读操作时,会不加限制地使用内存空间,导致内存空间消耗过大。本发明通过一种启发式策略选取高访问频率的数据层,为其构造额外地哈希索引,使用有限的内存空间来明显地提高读性能。附图说明图1:是本发明的总体结构图。图2:是本发明中布谷鸟哈希表结构说明图。图3:是本发明中添加布谷鸟哈希表后,键值存储系统的读取流程图。图4:是本发明方法流程图。具体实施方式为了便于本领域普通技术人员理解和实施本发明,下面结合附图及实施例对本发明作进一步的详细描述,应当理解,此处所描述的实施示例仅用于说明和解释本发明,并不用于限定本发明。因为布谷鸟哈希表会占用额外的内存空间,为了限制额外的内存开销,所以我们只对前三级的数据层构造快速哈希索引。在键值存储系统中为存放lsm-tree中前三级数据层的键值对构造额外的布谷鸟哈希索引结构,如图1所示。布谷鸟哈希表存放于内存模块,缓存前三级数据层中key的存放地址信息。哈希表的bucket桶中存放的键值对<k,v>,其键值k存放的是前三级数据层的key,其v值存放的是key所在的文件编号(filenumber)。布谷鸟哈希表配有两个不同的hash函数,表示会有两个候选bucket桶存放对应的键值对,如图2所示。因为lsm-tree的数据写入原理,所以最新的数据都在靠上的数据层。如果想在lsm-tree中查找目标数据,就必须从上到下依次查询每一层数据层,直至找到目标数据。无论目标数据是在lsm-tree中靠上的数据层,还是在靠后的数据层,读请求都需要查找lsm-tree的前几层数据。因此如果我们为前几级数据层中的key构建更快速的索引,跳过原来的在每一层的慢速查询,可以加速整个读取过程。基于lsm-tree的键值存储系统装载布谷鸟哈希表后,读请求的流程将发生变化。因为哈希表会占用额外的内存空间,但由于内存空间有限,如何在保证带来性能提升的同时,不会占用过多的内存空间。我们通过统计分析每一个数据层的访问频率,如靠上的层级,如l0、l1等会被频繁地访问,如果目标数据是在l0、l1,会查询并找到目标数据;如果目标数据是在靠后数据层,也会先查询l0、l1后得到查询失败地结果后才能继续查询靠后的层级。因此我们的索引构建时做如下考虑,如果lsm-tree的数据层数未超过3,对全部数据构建额外的哈希索引。如果lsm-tree的数据层数超过3,只对前三层的数据构建哈希索引。因为lsm-tree的结构特点,前三层的数据占总数据的比例较低,所以内存空间开销不大,同时能省去大量的读取i/o请求。对于大小较大的key来说,也会使得哈希表占有空间很大。如果key的size有128bytes,则哈希表将会消耗大量的内存空间。因此,我们对哈希表的bucket桶中的<k,v>的k限制大小为16bytes。如果key的size小于16bytes,则key正常存储。如果key的size大于16bytes,则对其进行md5编码,生成一个128-bit的数值存入k中。下面结合图1至图4介绍本发明的具体实施方式为一种基于日志结构合并树的键值数据快速读取方法,图4是本发明的方法流程图,包括布谷鸟哈希索引的构建和数据的读取流程等,其特征在于,包括以下步骤:步骤1:通过多层数据层构建日志结构合并树,日志结构合并树的每层数据层中存取多组键值数据对,统计分析日志结构合并树的每层数据层中数据读取频率,根据日志结构合并树的每层数据层中数据读取频率将日志结构合并树划分为高读取频率的数据层以及低读取频率的数据层,通过日志结构合并树高读取频率的数据层构建多层布谷鸟哈希表应用数据读取层。如图1所示,该图展示了本发明的整体架构;步骤1所述日志结构合并树包括:第一层日志结构合并树数据层、第二层日志结构合并树数据层、...、第m层日志结构合并树数据层;步骤1所述日志结构合并树的每层数据层中存取多组键值数据对为:其中,m表示日志结构合并树的数据层的层数,<keyi,j,valuei,j>表示日志结构合并树中第i层数据层中第j组键值数据对,keyi,j表示日志结构合并树中第i层数据层中第j组键值数据对中索引,valuei,j表示日志结构合并树中第i层数据层中第j组键值数据对中数据,j∈[1,ni],ni表示日志结构合并树中第i层数据层中键值数据对的数量;步骤1所述日志结构合并树的每层数据层的数据读取频率为:f1、f2...、fm其中,fi为日志结构合并树第i层数据层的数据读取频率;统计分析日志结构合并树中每层数据层的数据读取频率的方法为:当数据在日志结构合并树中每层数据层进行查找时,若查询到目标数据则返回目标结果;若未查询到目标数据则到日志结构合并树中下一层数据层去查询;若查询到目标数据定义为正查询,若未查询到目标数据定义为负查询;统计日志结构合并树中每层数据层的数据的读取频率为正查询次数和负查询次数之和,即fi=fp-i ff-i。步骤1所述根据日志结构合并树的每层数据层中数据读取频率在日志结构合并树划分为高读取频率的数据层以及低读取频率的数据层为:若查询的目标数据在日志结构合并树中第i层数据层时,则需要进行(i-1)次的负查询和1次正查询;设定读取频率比例阈值为t,0.3≤t≤0.5,用于计算所述的日志结构合并树高读取频率的数据层;设置内存最大值为smax;所述计算所述的日志结构合并树高读取频率的数据层为:(f1 f2 … fk)/(f1 f2 … fm)<=t(s1 s2 … sk)<=smax其中,fi为日志结构合并树第i层数据层的数据读取频率,i∈[1,m],fk为日志结构合并树中第k层高读取频率的数据层,k∈[1,k],t为读取频率比例阈值;日志结构合并树的每层数据层的存到布谷哈希表中所占有的空间大小依次为:s1、s2...、sm其中,si为日志结构合并树第i层数据层的数据存到布谷哈希表中所占有的空间大小;sk=nk*b其中,nk为日志结构合并树中第k层高读取频率的数据层中键值数据对的数量,b为布谷哈希表的哈希桶(hashbucket)的大小;日志结构合并树中第一层数据层、日志结构合并树中第二层数据层、...、日志结构合并树中第k层数据层为步骤1所述的日志结构合并树中高读取频率的数据层;日志结构合并树中第k 1层数据层、日志结构合并树中第k 2层数据层、...、日志结构合并树中第m层数据层为步骤1所述的日志结构合并树中低读取频率的数据层;步骤1所述多层布谷鸟哈希表应用数据读取层为:日志结构合并树中第一层数据层、日志结构合并树中第二层数据层、...、日志结构合并树中第k层数据层,k<m。步骤2:针对每层布谷鸟哈希表应用数据读取层中,若键值数据对中索引的字节数量大于字节阈值则将键值数据对中索引进行md5编码后存入布谷鸟哈希表,否则键值数据对中索引仍存取至布谷鸟哈希表应用数据读取层即日志结构合并树。如图2所示,该图展示了布谷鸟哈希表的结构;步骤3:在进行数据索引读取时,若数据属于第一层日志结构合并树、第二层日志结构合并树、...、第k层日志结构合并树,则通过布谷鸟哈希表应用数据读取层中索引读取键值数据对中数据;若数据属于第k 1层日志结构合并树、第二层日志结构合并树、...、第n层日志结构合并树,则通过日志结构合并树中键值数据对中索引读取键值数据对中数据。如图3所示,该图展示了键值存储系统的读取流程。本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属
技术领域:
:的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。当前第1页1 2 3 当前第1页1 2 3 
技术特征:1.一种基于日志结构合并树的键值存储的数据快速读取方法,其特征在于,包括以下步骤:
步骤1:通过多层数据层构建日志结构合并树,日志结构合并树的每层数据层中存取多组键值数据对,统计分析日志结构合并树的每层数据层中数据读取频率,根据日志结构合并树的每层数据层中数据读取频率将日志结构合并树划分为高读取频率的数据层以及低读取频率的数据层,通过日志结构合并树高读取频率的数据层构建多层布谷鸟哈希表应用数据读取层;
步骤2:针对每层布谷鸟哈希表应用数据读取层中,若键值数据对中索引的字节数量大于字节阈值则将键值数据对中索引进行md5编码后存入布谷鸟哈希表,否则键值数据对中索引仍存取至布谷鸟哈希表应用数据读取层即日志结构合并树;
步骤3:在进行数据索引读取时,若数据属于日志结构合并树多层数据层中高读取频率的数据层,则通过布谷鸟哈希表应用数据读取层中索引读取键值数据对中数据;若数据属于日志结构合并树多层数据层中低读取频率的数据层,则通过日志结构合并树中键值数据对中索引读取键值数据对中数据。
2.根据权利要求1所述的基于日志结构合并树的键值存储的数据快速读取方法,其特征在于:
步骤1所述日志结构合并树包括:
第一层日志结构合并树数据层、第二层日志结构合并树数据层、...、第m层日志结构合并树数据层;
步骤1所述日志结构合并树的每层数据层中存取多组键值数据对为:
其中,m表示日志结构合并树的数据层的层数,<keyi,j,valuei,j>表示日志结构合并树中第i层数据层中第j组键值数据对,keyi,j表示日志结构合并树中第i层数据层中第j组键值数据对中索引,valuei,j表示日志结构合并树中第i层数据层中第j组键值数据对中数据,j∈[1,ni],ni表示日志结构合并树中第i层数据层中键值数据对的数量;
步骤1所述日志结构合并树的每层数据层的数据读取频率为:
f1、f2...、fm
其中,fi为日志结构合并树第i层数据层的数据读取频率;
统计分析日志结构合并树中每层数据层的数据读取频率的方法为:
当数据在日志结构合并树中每层数据层进行查找时,若查询到目标数据则返回目标结果;
若未查询到目标数据则到日志结构合并树中下一层数据层去查询;
若查询到目标数据定义为正查询,若未查询到目标数据定义为负查询;
统计日志结构合并树中每层数据层的数据的读取频率为正查询次数和负查询次数之和,即fi=fp-i ff-i;
步骤1所述根据日志结构合并树的每层数据层中数据读取频率在日志结构合并树划分为高读取频率的数据层以及低读取频率的数据层为:
若查询的目标数据在日志结构合并树中第i层数据层时,则需要进行(i-1)次的负查询和1次正查询;
设定读取频率比例阈值为t,0.3≤t≤0.5,用于计算所述的日志结构合并树高读取频率的数据层;
设置内存最大值为smax;
所述计算所述的日志结构合并树高读取频率的数据层为:
(f1 f2 … fk)/(f1 f2 … fm)<=t
(s1 s2 … sk)<=smax
其中,fi为日志结构合并树第i层数据层的数据读取频率,i∈[1,m],fk为日志结构合并树中第k层高读取频率的数据层,k∈[1,k],t为读取频率比例阈值;
日志结构合并树的每层数据层的存到布谷哈希表中所占有的空间大小依次为:
s1、s2...、sm
其中,si为日志结构合并树第i层数据层的数据存到布谷哈希表中所占有的空间大小;
sk=nk*b
其中,nk为日志结构合并树中第k层高读取频率的数据层中键值数据对的数量,b为布谷哈希表的哈希桶的大小;
日志结构合并树中第一层数据层、日志结构合并树中第二层数据层、...、日志结构合并树中第k层数据层为步骤1所述的日志结构合并树中高读取频率的数据层;
日志结构合并树中第k 1层数据层、日志结构合并树中第k 2层数据层、...、日志结构合并树中第m层数据层为步骤1所述的日志结构合并树中低读取频率的数据层;
步骤1所述多层布谷鸟哈希表应用数据读取层为:
日志结构合并树中第一层数据层、日志结构合并树中第二层数据层、...、日志结构合并树中第k层数据层,k<m。
技术总结本发明涉及一种基于日志结构合并树的键值存储的数据快速读取方法。本发明通过多层数据层构建日志结构合并树,日志结构合并树的每层数据层中存取多组键值数据对,统计分析日志结构合并树的每层数据层中数据读取频率,将日志结构合并树划分为高读取频率的数据层以及低读取频率的数据层,为高读取频率的数据层构建多层布谷鸟哈希表应用数据读取层;若数据层中键值数据对中键的字节数量大于字节阈值则对其进行MD5编码后存入布谷鸟哈希表;在进行数据索引读取时,先查询布谷哈希索引,若未命中继续查询低读取频率数据层。本发明优点在于,通过一种启发式策略选取高访问频率的数据层,为其构造额外地哈希索引,使用有限的内存空间来明显地提高读性能。
技术研发人员:段雪豪
受保护的技术使用者:武汉大学
技术研发日:2020.11.30
技术公布日:2021.03.12