一种基于分层分配的多层数据库的布隆过滤器构造方法与流程

文档序号:12720129阅读:224来源:国知局
一种基于分层分配的多层数据库的布隆过滤器构造方法与流程

本发明属于计算机数据存储技术领域,具体涉及对采用日志合并树作为主体的多层键值数据库系统的布隆过滤器的比特位数进行分层分配的布隆过滤器构造方法。



背景技术:

美国计算机协会出版的《1970年ACM CACM国际期刊》(Communications of the ACM 1970年7月第13卷,问题7,第422-426页)所介绍的布隆过滤器(Space/time trade-offs in hash coding with allowable errors)是一个空间效率极其高效,用来检测一个元素是否存在与一个集合中的概率数据结构。由谷歌公司开源的部署在硬盘上的基于日志合并树的多层键值数据库系统(LevelDB)在实现和使用布隆过滤器技术时,为每一层存储键值对的文件(SSTable)中的每一个数据块都建立了一个布隆过滤器。自LevelDB 1.4版本发行以来,对每层存储键值对的文件的每个数据块的布隆过滤器构造方式都采用每个键分配相同比特位数的方式。这种方法没有考虑到LevelDB每层的键的区间大致相同,因此可能会造成高层的文件访问频率相对于低层较高,布隆过滤器的误报次数也随之增多,从而因为布隆过滤器的误报产生额外的硬盘I/O操作的问题,延长了查询操作的平均延迟,降低了系统的整体性能。



技术实现要素:

本发明的目的是提出一种基于分层分配的多层数据库的布隆过滤器构造方法,以弥补现有每层中每个文件内的每个键分配固定比特位数的缺陷,在保证布隆过滤器存储空间开销与之前一致的前提下,减少LevelDB的查询操作因布隆过滤器的误报而带来的硬盘输入/输出(I/O)操作,提高LevelDB的查询操作速度,或者在保证LevelDB布隆过滤器整体的误报率与之前基本不变的情况下,减少存储空间即内存的开销。

本发明基于分层分配的多层数据库的布隆过滤器构造方法,其特征在于包括以下步骤:

第一步:设计建立存储结构,并进行相应的初始化

定义如下标识符表示相应的存储结构:

L--表示多层键值数据库LevelDB的层数,

B--分配给每个键的平均布隆过滤器比特位数,

Si—LevelDB第i,0<=i<L,层的存储空间大小,

SL---LevelDB的总大小,

R—LevelDB层间大小的增长倍数,

Bi—给处于第i层的键分配的布隆过滤器比特位数,

F(Bi)---在分配的比特位数是Bi的情况下,布隆过滤器的误报率,

P—LevelDB的查询操作找到对应的键的可能性,

SN—存储键值对的文件SSTable包含的键值对数目,

T—存储键值对的文件SSTable的所占的存储空间的大小;

根据硬盘上所部署的键值数据库系统对以上参数进行初始化;

第二步:计算组合概率和

对LevelDB的层数L进行L=L+4操作,即把第0层的4个文件作为前四层;设Pa<i,j>表示查询操作访问至第i层(包括第i层),LevelDB的布隆过滤器发生j次误报的组合概率和,其中在第k层,0<=k<L,发生误报的概率为第一步定义的F(Bk),即为0.618BK;计算出Pa<i,j>满足0<=i<L,1<=j<=(i+1)的所有情况;

第三步:求解得分配给每层布隆过滤器的位数

当对LevelDB进行查询操作时,所查询的键值对存在于数据库中的可能性为P,不存在于数据库的可能性为1-P;当键值对存在于数据库中时,至少有一次I/O是为了访问所需要查询的键值对,当布隆过滤器发生误报时,可能产生额外的I/O;而所查询的键值对位于第i层的可能性为若键值对不存在于数据库中时,则只可能因为布隆过滤器的误报产生额外的I/O次数;由此得出当LevelDB进行查询操作时硬盘I/O次数的期望值EX为:

计算使用LevelDB原本的布隆过滤器构造方法时与基于分层分配的布隆过滤器构造方法的内存开销,其中,使用LevelDB原本的布隆过滤器构造方法的内存开销为分配给LevelDB每个键的布隆过滤器比特位数乘以键值对的数目的总和,即为使用基于分层分配的布隆过滤器构造方法的内存开销为分配给LevelDB每层的文件内的键的布隆过滤器比特位数乘以该层所包含的键值对的数目的总和,即为通过枚举分配给LevelDB每层的文件内的键的布隆过滤器比特位数Bi的值----文件内分给每个键的布隆过滤器比特位数相同都为Bi,其中i的区间为[0,L-1],Bi的区间为[1,32],都为整数,在保证LevelDB原本的布隆过滤器构造方法与基于分层分配的布隆过滤器构造方法的内存开销差值小于一个指定值的情况下,使得上述期望值EX最小;

第四步:维护存储结构

把LevelDB部署到主机硬盘上,当LevelDB进行合并(compaction)操作时,若新生成的SSTable文件将被压往第i层,则给新生成的文件分配比特位数为SN*Bi的布隆过滤器----即根据本次合并操作新生成的存储键值对的文件被压往的层,用第三步求得的Bi来构造相应的布隆过滤器。

上述本发明基于分层分配的多层数据库的布隆过滤器构造方法包括了设计建立存储结构,计算组合概率和,求解得分配给每层布隆过滤器的位数和维护存储结构。现实生活中的键值存储的工作负载(workload)通常呈现出很强的随机性,导致LevelDB每层的键的区间大致相同,因此在查询过程中使得LevelDB的高层文件相对于低层文件访问频率较高。本发明采用分层分配布隆过滤器的比特位数的方法,在进行合并(compaction)操作时,使处于LevelDB的高层的每个键分配到更多的布隆过滤器比特位数,低层的键分配到较少的布隆过滤器比特位数,其中布隆过滤器的误报率随着比特位数的增多而降低。与LevelDB传统的布隆过滤器构造方法采取的每层的每个键比特位数相同的分配方法相比,在保证内存开销与之前一致的情况下,本方法克服了传统方法因查询过程中LevelDB高层文件的访问频率比低层文件高导致因高层文件的布隆过滤器误报产生的硬盘I/O次数也较多的缺点,带来了LevelDB布隆过滤器整体误报率降低的优点,从而减少了因为布隆过滤器的误报带来的硬盘输入/输出(I/O)操作,降低硬盘的I/O次数,减少LevelDB查询操作的平均延迟。本发明也可以在保证查询时的期望硬盘I/O次数与传统的方法基本相等的情况下,使LevelDB的低层布隆过滤器分配到较少的比特位数,与传统的每层中每个键比特位数相同的分配方法相比,减少布隆过滤器带来的内存开销,提高系统的整体性能。

附图说明

图1是LevelDB的每层的键的范围示意图。

图2是LevelDB进行查询操作的示意图。

图3是LevelDB合并(compaction)操作示意图。

具体实施方式

实施例1:

下面结合附图通过具体实施例对本发明基于分层分配的布隆过滤器比特位数分配方法作进一步的详细说明。

实施例1:

本实施例基于分层分配的多层数据库的布隆过滤器构造方法,具体包括以下步骤。

第一步:存储结构设计,并进行相应的初始化,采用:

L--表示多层键值数据库LevelDB的层数,

B--分配给每个键的平均布隆过滤器比特位数,

Si—LevelDB第i,0<=i<L,层的存储空间大小,

SL---LevelDB的总大小,

R—LevelDB层间大小的增长倍数,

Bi—给处于第i层的键分配的布隆过滤器比特位数,

F(Bi)---在分配的比特位数是Bi的情况下,布隆过滤器的误报率,

P—LevelDB的查询操作找到对应的键的可能性,

SN—存储键值对的文件SSTable包含的键值对数目,

T—存储键值对的文件SSTable的所占的存储空间的大小;

在本实施例中具体采用L=7,B=8,S0=8MB,R=10,S1=10MB,S2=100MB…S6=1TB,F(Bi)≈0.618Bi,P=0.5,T=2MB。SN的值由键值对大小决定,若假设键值对的大小为116字节,在本实施例中SN可以取为18000。

第二步:计算本实施例的组合概率和

图1为LevelDB的每层的所有的键构成的区间示意图。图中用方块表示LevelDB的一个存储键值对的文件(SSTable),由第0层到第L-1层的文件构成L层的LevelDB,在LevelDB中,每个文件内的键值对按照指定的顺序进行排列,除第0层外,每层的每个文件也按照指定的顺序排列,第0层的文件内部键值对有序排列,文件间则是无序排列的,图中横坐标表示键的范围,而方块的长度来表示文件所覆盖的区间,长度越长,则该文件的键的区间就越大。因为现实中工作负载的随机性,即键值对请求中,键的分布的随机性很强,在LevelDB中,除第0层外,本层文件是由上一层文件和本层的若干文件合并而成的,所以每层的所有键构成的键的区间大致相同。图1中虽然第0层的文件只有四个,但是每个方块的长度很长,表示该文件内所有的键组成的区间很大,并且在LevelDB中,第0层的每个文件间的键的区间可能会相互重叠,相应在图中第0层的四个方块存在一定的重叠,由LevelDB的性质得,随着层数的增长,每层所包含的文件的数量会增多,而每层的键的总区间大致不变,相应的每个文件所包含的区间就会缩小,在图中方块的长度随着层数的增长而缩短。

图2为LevelDB进行查询操作的示意图。图中此次查询的键位于第L-2层(在图中打着勾号的方块表示在该存储键值对的文件中获取到查询的键值对),因为所查询的键落在L-2层之前的几层文件的键的区间内,在此次查询操作中会访问前几层的布隆过滤器来避免访问存储键值对的文件,但是在第0层和第1层有3个文件的布隆过滤器发生了误报(在图中打着叉号的方块表示该文件的布隆过滤器发生了误报),导致此次查询操作访问了第0层和第1层的3个文件,产生了3次额外的硬盘I/O。

由图1和图2可知,当进行查询操作,所查询的键位于第i层时,由于每层的键的区间大致相同,所以查询时会访问第i层的前几层文件的布隆过滤器,并且可能因为在第i层的前几层布隆过滤器发生误报访问前几层的文件从而引发硬盘I/O操作。

现在对L进行加4操作,即当前L=10。

由图1和图2得出的结论可以计算Pa<i,j>,即由当前查询到的层数i,得出第i层前几层文件的布隆过滤器发生指定误报次数j的组合情况,例如,设i=2,j=2,计算Pa<2,2>;即发生了2次布隆过滤器的误报,则这两次误报可能发生在第0层和第1层、第0层和第2层或第1层和第2层。所以可以得出Pa<2,2>=F(B0)*F(B1)+F(B0)*F(B2)+F(B1)*F(B2)。由此计算出满足0<=i<10,1<=j<=(i+1)的Pa<i,j>所有情况。

第三步:求解得分配给每层布隆过滤器的位数

当查询的键值对位于LevelDB中时,至少有一次I/O是为了访问所需要查询的键值对,当布隆过滤器发生误报时,可能产生额外的I/O。例如,所查询的键值对位于第2层,布隆过滤器可能会产生0至2次的误报,即此次查询发生的硬盘I/O次数的期望值为:1+Pa<2,1>+Pa<2,2>,而所查询的键值对可能位于LevelDB的任意一层,由此计算出键值对位于LevelDB中时,引发的硬盘I/O次数的期望值为如要查询的键值对不存在于LevelDB中,则此次访问需要访问到最后一层,才能判断出查询的键值对不存在于LevelDB中,即此次查询发生的硬盘I/O次数的期望值为:而所查询的键值对位于LevelDB中的可能性为0.5,不存在于LevelDB中的可能性也为0.5,可以计算出当进行查询操作时,发生的硬盘I/O次数期望值为:

本实施例的内存开销为分配给LevelDB每层的文件内的键的布隆过滤器比特位数乘以该层所包含的键值对的数目的总和,即为而使用LevelDB原方法的布隆过滤器的内存开销为分配给每个键的布隆过滤器比特位数乘以LevelDB所包含的键值对的数目,即为本实例的布隆过滤器的内存开销应与LevelDB原方法消耗基本一致,即在满足的情况下,通过枚举法求得Bi(0<=i<=9)在每层的值,使得查询操作时发生的硬盘I/O次数期望值最小,可以求得,Bi在每层的值依次为:{32,32,32,32,30,32,25,6,8,8},发生的硬盘的I/O次数的期望的最小值为0.7009471766,另外,也可求得LevelDB原方法的发生的硬盘的I/O次数的期望值为0.5862897610。

第四步:维护存储结构

图3给出了LevelDB合并(compaction)操作示意图。图中采用虚线分为上、下两部分,虚线上面的部分表示LevelDB第i层进行合并操作前的情况,虚线下面的部分表示LevelDB第i层合并操作后的情况。在图的上部分中,位于第i层的黑色方块为此次合并操作选中的文件,同时在第i+1层的与该选中文件的键的范围重叠的3个文件也作为此次合并操作的输入文件,用黑色方块表示;其他不参与此次合并操作的文件用白色方块表示。在发生合并时,这四个文件中的键在按照指定顺序排序后,按顺序存储在4个大小几乎相等的新生成的文件中,并被放置在第i+1层,即虚线上方的第i层与第i+1层的4个黑色方块在进行合并操作后,形成了虚线下方第i+1层的4个黑色方块,其他未参与此次合并操作的文件保持不变。当LevelDB进行合并(compaction)操作时,而在这个过程中会为每个文件生成新的布隆过滤器,此时,根据此次合并操作压往的层级j,给每个新生成的文件分配长度为Bj(0<=j<=9)*SN的布隆过滤器。

在本实施例中,通过基于分层分配的多层数据库的布隆过滤器比特位数的分配方法来进行LevelDB每个存储键值对的文件SSTable的布隆过滤器的构造,得出了相比于原来每个键分配的布隆过滤器比特位数相同的方式,令高层文件的键分配得较多的布隆过滤器比特位数,低层文件的键分配得较少的布隆过滤器比特位数,其中在本实施例中,高层为层级小于等于6的层,低层则为层级大于6的层。相比与传统的每层文件中每个键分配相同的布隆过滤器比特位数的方式,采用本方法可以减少16%的因为布隆过滤器的误报带来的硬盘I/O操作,从而降低了硬盘的I/O次数,减少了LevelDB查询操作的平均延迟。

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