一种基于多日志结构合并树的键值存储方法

文档序号:37123107发布日期:2024-02-22 21:31阅读:19来源:国知局
一种基于多日志结构合并树的键值存储方法

本发明属于数据库,具体的说是一种基于多日志结构合并树的键值存储方法。


背景技术:

1、lsm-tree(logstructuredmergetrees)数据组织方式被应用于多种数据库,如leveldb,cassandra等,lsm-tree相较b+树或其他索引存储实现方式,提供了更好的写性能,将键值对数据(key-value)的随机读写实现为内存随机读写、顺序刷盘,利用磁盘顺序写高于随机写的特点,提升数据写入的性能。利用磁盘数据的分层有序结构、层与层之间的归并排序(compaction)改善读性能。

2、lsm-tree在磁盘上采用分层有序的结构,确实可以改善文件随机存储在一层的数据读取性能。但是,磁盘数据分层有序的结构也会带来相应的读写放大问题,数据在写入时,会先写入内存的缓冲区中,然后再追加写入到磁盘上低层,旧的数据会被compaction重新写入更高层的文件中;当读取某个键值数据时,会从内存中的缓冲区中查找,没有找到则在磁盘上按照层数由低到高循环查找,如果在某层找到,直接返回数据,否则,说明数据不存在;

3、由上述读写流程可知,写入的数据会经历大量的重复写入,读取数据也会因为数据在磁盘高层导致很多无效的磁盘io,且没有充分利用系统硬件资源,当数据层数很深时,则上述读写放大情况更为严重。


技术实现思路

1、本发明是为了解决上述现有技术存在的不足之处,提出一种基于多日志结构合并树的键值存储方法,以期能克服现有技术的上述缺陷,充分利用现有硬件资源,实现数据的加速写入和归并,减少单个日志结构合并树的层数,降低读写放大,从而能提高系统的读写性能,增强系统的并行性和拓展性。

2、本发明为达到上述发明目的,采用如下技术方案:

3、本发明一种基于多日志结构合并树的键值存储方法的特点应用于设置有mlsmt结构的单个存储节点中,所述mlsmt结构包括:compaction调度器、lsmt信息监控器、n个日志结构合并树{lsmt1,lsmt2,…,lsmti,…,lsmtn},其中,lsmti表示第i个日志结构合并树;1≤i≤n;

4、所述第i个日志结构合并树lsmti包含一个磁盘组件和内存组件;

5、lsmti中的磁盘组件包含p个层结构{li1,li2,…,lij,…,lip},其中,lij表示第i个日志结构合并树的第j层结构,1≤j≤p;第j层结构lij包括qij个sst文件

6、{sstij1,sstij2,…,sstijk,…,sstijqij},其中,sstijk表示第i个日志结构合并树lsmti的第j层结构lij的第k个sst文件,1≤k≤qij;

7、第k个sst文件sstijk包含若干键值数据<key,value>,根据第k个sst文件sstijk中所有键数据key的取值,得到第k个sst文件sstijk的键范围(keyminijk,keymaxijk),其中,keyminijk表示第k个sst文件sstijk的键的最小值,keymaxijk表示第k个sst文件sstijk的键的最大值,除第1层结构li1的各文件之间键范围有重叠外,其他层结构的各文件之间的键范围无重叠且有序排列;

8、令第k个sst文件sstijk中所有键值数据所占磁盘空间大小记为第k个sst文件sstijk的大小sizeijk,第j层结构lij所有sst文件的总大小sizeij的阈值记为limitsizeij,j>1,第1层结构的sst文件个数具有阈值limitnumi;

9、除第1层结构li1外,第j+1层结构li(j+1)中所有sst文件的阈值limitsizei(j+1)是第j层结构lij中所有sst文件的阈值limitsizeij的q倍,即limitsizei(j+1)=q×limitsizeij;

10、所述第i个日志结构合并树lsmti的内存组件包括内存缓冲区mti、内容不可变的缓冲区imti,二维元数据管理数组fmi,且fmi中包含p×qij个元素,每个元素是由sst文件的编号、sst文件的大小、sst文件的引用计数、键的最小值、键的最大值,是否垃圾回收的标志字段gc组成的结构体;

11、所述第i个日志结构合并树lsmti包含的操作为:fhi操作、compactioni操作;其中,compactioni操作分为minci操作、maxci操作;

12、fhi操作是指内存缓冲区mti中的键值数据以sst文件的形式写入磁盘组件的第1层结构li1中;

13、minci是指第1层结构li1和第2层结构li2所选取的sst文件按键排序、合并后划分成新的sst文件后写入li2;

14、maxci是指第j层结构lij和第j+1层结构lij+1所选取的sst文件按键排序、合并后划分成新的sst文件后写入lij+1;j>1;

15、所述lsmt监控器用于获取n个日志结构合并树的监控信息并计算分裂指标,令fi为第i个日志结构合并树lsmti的分裂指标,fit为第i个分裂指标的阈值;第i个日志结构合并树lsmti的监控信息包括:lsmti所有sst文件所占磁盘空间大小总和si、磁盘空间大小阈值sit、读写请求次数rwi,以及所有日志结构合并树的读写请求总数rw;

16、所述键值存储方法是按如下步骤进行:

17、步骤1、当前线程利用所述mlsmt结构接收外部的读写数据的请求req,并判断请求req的种类:

18、若请求req是写请求write,则执行步骤2,其中,所述写请求write中的参数包括若干要写入的键值数据<key,value>;

19、若请求req是读请求get,则执行步骤2;其中,所述读请求get中的参数包括若干键数据key;

20、若请求req是扫描请求scan,则执行步骤5;其中,所述扫描请求scan中的参数包括键数据范围(key1,key2);

21、步骤2、后台线程执行日志结构合并树的分裂指标的计算和分裂;

22、步骤3、当前线程对请求req中的键key进行哈希运算得到相应的哈希值,所述哈希值对阈值mod进行取模运算后得到中间值hv,其中,mod表示日志结构合并树数量的阈值;

23、步骤4、当前线程计算用于表示n所需的二进制位数的最小值n,并根据n计算hv的二进制尾部的n位值,再根据n位值计算日志结构合并树的序号i,从而令请求req中的键key属于lsmti;

24、若请求req为写请求write,则执行步骤a1和步骤b1:

25、a1、将写请求write中参数对应的键值数据写入mti,并按照步骤a1.1-a1.5执行;

26、a1.1、判断第i个日志结构合并树lsmti的内存缓冲区mti的大小msizei是否大于阈值mmax,若大于,则执行步骤a1.2;否则,将参数<key,value>所对应的键值数据写入到lsmti的内存缓存区mti,并执行b1;

27、a1.2、判断当前日志结构合并树lsmti的imti是否为空,若不为空,则等待,直到compaction调度器执行fhi操作的调度请求,从而将缓冲区imti中所有数据写入磁盘中,使得imti变为空,否则,执行a1.3;

28、a1.3、将imti指向当前内存缓冲区mti,并生成新的空的内存缓冲区,使得mti指向新的内存缓冲区;

29、a1.4、当前线程生成fhi操作的调度请求,将请求插入compaction任务队列中,并返回步骤1,以接收下一个请求req;

30、a1.5、后台线程利用compaction调度器执行fhi操作的调度请求,然后生成compactioni操作的调度请求,并将请求插入compaction任务队列中,等待compaction调度器执行compactioni操作的调度请求;

31、b1、更新lsmti的监控信息中的参数si、rwi、rw,即si增加写请求write的键值数据的大小,rwi增加写请求write的键值数据的数量,并重新计算rw后,返回步骤1,以接收下一个请求req;

32、若请求req为读请求get;则执行步骤a2-d2:

33、a2、更新lsmti的监控信息中的参数rwi、rw,即rwi增加读请求get中键key的数量,并重新计算rw的值;

34、b2、在lsmti的内存缓冲区mti中查找读请求get中的键key,若找到,则返回对应的值value;否则,执行c2;

35、c2、在lsmti的内容不可变的内存缓冲区imti中查找读请求get中的键key,若找到,则返回对应的值value;否则,执行d2;

36、d2、从lsmti的磁盘组件的第1层结构开始查找读请求get中的键key,若在任意第j层结构中找到,则返回对应的值value,否则,继续遍历下一层结构,直到查找完第p层结构为止,若始终未找到,则返回空;

37、步骤5、在mlsmt结构中处理scan请求,执行步骤a3-c3:

38、a3、当前线程对mlsmt中的每个日志结构合并树分别建立若干个迭代器,并将所有迭代器划分成g个迭代器组,将每个迭代器组合并为一个mergeiter迭代器;

39、b3、使用多线程并行处理每个mergeiter迭代器的seek操作,即将每个mergeiter迭代器均指向第一个大于等于扫描请求scan中键key1的位置;

40、c3、使用堆排序对所有mergeiter迭代器所指向的位置的键大小进行升序排序,并判断最小键keymin是否大于key2,若大于,返回步骤1,以接收下一个请求req;否则,输出最小键keymin,并将keymin所对应的mergeiter迭代器往键大小的升序方向移动一个位置,更新keymin所对应的mergeiter迭代器的键大小,再重复执行c3。

41、本发明所述的多日志结构合并树的键值存储方法的特点也在于,所述步骤2包括:

42、步骤2.1、根据lsmti的监控信息、计算分裂指标其中,p1、p2分别代表每部分的权重比例;

43、步骤2.2、判断fi<fit是否成立,若成立,则执行步骤2.3;否则,从lsmti中分裂出一个新的日志结构合并树lsmti’,并将lsmti的二维元数据数组fmi拷贝一份作为分裂出的日志结构合并树lsmti’的元数据数组fmi’,并更新n为n+1;

44、步骤2.3、则将i+1赋值给i后,返回步骤2.1,直至i>n,再将1赋值给i,返回步骤2.1执行。

45、所述步骤d2中是按如下步骤查找读请求get中的键key:

46、d2.1、令当前查找的lsmti的层数为lij;

47、若lij为第1层li1,则按照sst文件的编号从大到小的顺序遍历fmi数组中第1层li1中的sst文件,找到满足读请求get中的键key≥keymin,且key≤keymax的所有sst文件编号num,并执行d2.2;

48、若lij为第2层li2到第p层lip中的一层,则根据fmi数组中第lij层元素的键最大值key_max和键最小值key_min,使用二分算法在fmi数组的第lij层中查找key_min≤键key的大小≤key_max的某个sst文件的编号num,执行d2.2;

49、d2.2、判断sst文件编号num对应的sst文件是否在lsmti中,若在,则在当前lsmti中查找出num对应的sst文件,否则,从分裂出lsmti的日志结构合并树lsmts中查找num对应的sst文件;

50、d2.3、在num对应的sst文件中,使用二分算法查找读请求get的参数中的键key。

51、所述步骤a3包括:

52、a3.1、分别对lsmti的mti、imti建立内存缓冲区迭代器mtiteri、imtiteri;

53、a3.2、在所有日志结构合并树中的任意第i个lsmti中,执行a3.2.1-a3.2.2;

54、a3.2.1、从第li1层结构中找出与扫描请求scan参数中(key1,key2)范围重叠的sst文件,并在每一个满足的sst文件中建立一个sst文件的迭代器sstiter;

55、a3.2.2、建立p层结构中的每一层lij的迭代器literij;j>1;

56、a3.3、以迭代器遍历的sst文件数量为作为权重,将所有建立的迭代器按照其权重分成g个迭代器组,使得每个迭代器组的权重之和均匀;从而将每一组的所有迭代器合并成一个mergeiter迭代器;其中,g由后台线程数量决定。

57、所述a1.2中的compaction调度器是按如下步骤执行fhi操作的调度请求;

58、a1.2.1、生成lsmti中第1层结构的新sst文件ssti1new;

59、a1.2.2、将imti中的键值数据按照sst文件的格式写入ssti1new;

60、a1.2.3、记录ssti1new的元数据信息:ssti1new文件的编号、ssti1new文件的大小、键的最小值、键的最大值,将ssti1new文件的引用计数置为0,垃圾回收标志位置为false;

61、a1.2.4、将ssti1new文件的元数据信息插入到lsmti的fmi数组中。

62、10、根据权利要求5所述的多日志结构合并树的键值存储方法,其特征是,所述a1.5中的compaction调度器是按如下步骤执行compactioni操作的调度请求;

63、a1.5.1、令lij为compactioni操作需要处理的lsmti的层;

64、若compactioni操作是minci操作,则处理lsmti中的第1层li1,即lij=li1;

65、若compactioni操作是maxci操作,则选取lsmti中每一层所有sst的大小sizeij与对应层的大小阈值limitsizeij的比值最大的一层赋值给lij;

66、a1.5.2、根据lsmti中的fmi数组、第lij层结构的compaction位置指针,找到第lij层结构需要合并的sst文件的编号,然后在第li(j+1)层结构查找与第lij层结构的sst文件具有重叠键的范围的所有sst文件的编号;

67、a1.5.3、根据查找的编号,判断第lij层、第li(j+1)层的每一个sst文件是否在lsmti中,若在,则在当前lsmti中查找出相应sst文件,否则,从分裂出lsmti的日志结构合并树lsmts中查找num对应的sst文件;

68、a1.5.4、在lsmti的第li(j+1)层中创建新的sst文件,将第lij层、第li(j+1)层中所查找到的所有sst文件中的键值数据<key,value>读出,并按照键key的大小进行排序,循环取出排序好的键key,按照键key的哈希值,判断其是否属于日志结构合并树lsmti,若属于,将该键key对应的键值数据写入lsmti中第li(j+1)层中新的sst文件中,否则,跳过相应键key;

69、a1.5.5、记录第li(j+1)层中新的sst文件的元数据信息到fmi数组中,并减少fmi数组中在lsmti中查找到相应编号的文件元数据元素的引用计数,同时将在lsmts中查找到相应编号的sst文件的元数据元素的垃圾回收标志位置为true。

70、本发明一种电子设备,包括存储器以及处理器的特点在于,所述存储器用于存储支持处理器执行所述键值存储方法的程序,所述处理器被配置为用于执行所述存储器中存储的程序。

71、本发明一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序的特点在于,所述计算机程序被处理器运行时执行述键值存储方法的步骤。

72、与现有技术相比,本发明的有益效果在于:

73、1、本发明通过计算键key的哈希值,并对哈希值按照设定的最大日志结构合并树数目取模,按照取模后的哈希值的二进制值选择相应的日志结构合并树,实现了数据分树存储,降低单个日志结构合并树的层数,从而降低数据的读写放大,提高系统的读写性能;

74、2、本发明中设计了compaction调度器,按照优先级并行化调度处理多个日志结构合并树的flush操作和compaction操作,可以充分利用系统的硬件资源,从而加速数据写入和读取,增强了系统的并行性;

75、3、本发明保留了日志结构合并树的分层有序结构,按照迭代器的权重将迭代器均匀分组,并行处理迭代器的定位seek操作,使用堆排序算法处理数据的遍历操作,从而有效地避免了哈希结构系统不支持扫描操作或者扫描性能低下的问题,保证了系统功能的完整性;

76、4、本发明通过lsmt信息监控器监控日志结构合并树的状态,在sst文件中保存键key计算过后的哈希二进制值,拷贝元数据信息、compaction操作平滑过渡数据的方法,实现了日志结构合并树的分裂,克服了哈希结构迁移数据的性能波动较大的问题,从而保证了系统的整体读写性能不受较大影响,增强了系统的可拓展性;

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