CN117573634A - 一种基于多日志结构合并树的键值存储方法 - Google Patents
一种基于多日志结构合并树的键值存储方法 Download PDFInfo
- Publication number
- CN117573634A CN117573634A CN202311545478.8A CN202311545478A CN117573634A CN 117573634 A CN117573634 A CN 117573634A CN 202311545478 A CN202311545478 A CN 202311545478A CN 117573634 A CN117573634 A CN 117573634A
- Authority
- CN
- China
- Prior art keywords
- key
- sst
- lsmt
- layer
- file
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 50
- 230000008569 process Effects 0.000 claims abstract description 9
- 230000009471 action Effects 0.000 claims abstract description 7
- 238000012545 processing Methods 0.000 claims description 14
- 238000012544 monitoring process Methods 0.000 claims description 11
- 238000005056 compaction Methods 0.000 claims description 8
- 238000004422 calculation algorithm Methods 0.000 claims description 7
- 230000001174 ascending effect Effects 0.000 claims description 6
- 238000004364 calculation method Methods 0.000 claims description 5
- 238000004590 computer program Methods 0.000 claims description 5
- 238000003780 insertion Methods 0.000 claims description 3
- 230000037431 insertion Effects 0.000 claims description 3
- 230000003068 static effect Effects 0.000 claims description 3
- 230000001133 acceleration Effects 0.000 abstract 1
- 238000010586 diagram Methods 0.000 description 6
- 230000003321 amplification Effects 0.000 description 4
- 238000003199 nucleic acid amplification method Methods 0.000 description 4
- 238000013479 data entry Methods 0.000 description 2
- 230000007423 decrease Effects 0.000 description 2
- 230000007547 defect Effects 0.000 description 2
- 230000007704 transition Effects 0.000 description 2
- 238000013459 approach Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000001680 brushing effect Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 230000006870 function Effects 0.000 description 1
- 230000007774 longterm Effects 0.000 description 1
- 230000005012 migration Effects 0.000 description 1
- 238000013508 migration Methods 0.000 description 1
- 230000008520 organization Effects 0.000 description 1
- 238000005192 partition Methods 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/18—File system types
- G06F16/1805—Append-only file systems, e.g. using logs or journals to store data
- G06F16/1815—Journaling file systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/061—Improving I/O performance
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Human Computer Interaction (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种基于多日志结构合并树的键值存储方法,包括:1、多日志结构合并树MLSMT接收到读写请求时,根据请求中键的哈希值,判断键所属的日志结构合并树LSMTi,并在LSMTi执行读写操作;2、MLSMT结构接收到扫描请求时,对日志结构合并树中的文件建立分组迭代器,使用并行线程执行键的定位操作Seek,使用堆排序查找下一个key,从而读出数据;3、后台使用并行线程处理Compaction操作,并根据元数据信息将属于当前LSMTi的数据从分裂出LSMTi的LSMTs中读出,写入到LSMTi的SST文件中。本发明能实现数据的加速写入和归并,减少单个日志结构合并树层数,从而提高系统的读写性能。
Description
技术领域
本发明属于数据库技术领域,具体的说是一种基于多日志结构合并树的键值存储方法。
背景技术
LSM-Tree(LogStructuredMergeTrees)数据组织方式被应用于多种数据库,如LevelDB,Cassandra等,LSM-Tree相较B+树或其他索引存储实现方式,提供了更好的写性能,将键值对数据(Key-Value)的随机读写实现为内存随机读写、顺序刷盘,利用磁盘顺序写高于随机写的特点,提升数据写入的性能。利用磁盘数据的分层有序结构、层与层之间的归并排序(Compaction)改善读性能。
LSM-Tree在磁盘上采用分层有序的结构,确实可以改善文件随机存储在一层的数据读取性能。但是,磁盘数据分层有序的结构也会带来相应的读写放大问题,数据在写入时,会先写入内存的缓冲区中,然后再追加写入到磁盘上低层,旧的数据会被Compaction重新写入更高层的文件中;当读取某个键值数据时,会从内存中的缓冲区中查找,没有找到则在磁盘上按照层数由低到高循环查找,如果在某层找到,直接返回数据,否则,说明数据不存在;
由上述读写流程可知,写入的数据会经历大量的重复写入,读取数据也会因为数据在磁盘高层导致很多无效的磁盘io,且没有充分利用系统硬件资源,当数据层数很深时,则上述读写放大情况更为严重。
发明内容
本发明是为了解决上述现有技术存在的不足之处,提出一种基于多日志结构合并树的键值存储方法,以期能克服现有技术的上述缺陷,充分利用现有硬件资源,实现数据的加速写入和归并,减少单个日志结构合并树的层数,降低读写放大,从而能提高系统的读写性能,增强系统的并行性和拓展性。
本发明为达到上述发明目的,采用如下技术方案:
本发明一种基于多日志结构合并树的键值存储方法的特点应用于设置有MLSMT结构的单个存储节点中,所述MLSMT结构包括:Compaction调度器、LSMT信息监控器、N个日志结构合并树{LSMT1,LSMT2,…,LSMTi,…,LSMTN},其中,LSMTi表示第i个日志结构合并树;1≤i≤N;
所述第i个日志结构合并树LSMTi包含一个磁盘组件和内存组件;
LSMTi中的磁盘组件包含P个层结构{Li1,Li2,…,Lij,…,Lip},其中,Lij表示第i个日志结构合并树的第j层结构,1≤j≤P;第j层结构Lij包括Qij个SST文件
{SSTij1,SSTij2,…,SSTijk,…,SSTijQij},其中,SSTijk表示第i个日志结构合并树LSMTi的第j层结构Lij的第k个SST文件,1≤k≤Qij;
第k个SST文件SSTijk包含若干键值数据<key,value>,根据第k个SST文件SSTijk中所有键数据key的取值,得到第k个SST文件SSTijk的键范围(keyminijk,keymaxijk),其中,keyminijk表示第k个SST文件SSTijk的键的最小值,keymaxijk表示第k个SST文件SSTijk的键的最大值,除第1层结构Li1的各文件之间键范围有重叠外,其他层结构的各文件之间的键范围无重叠且有序排列;
令第k个SST文件SSTijk中所有键值数据所占磁盘空间大小记为第k个SST文件SSTijk的大小Sizeijk,第j层结构Lij所有SST文件的总大小Sizeij的阈值记为LimitSizeij,j>1,第1层结构的SST文件个数具有阈值LimitNumi;
除第1层结构Li1外,第j+1层结构Li(j+1)中所有SST文件的阈值LimitSizei(j+1)是第j层结构Lij中所有SST文件的阈值LimitSizeij的q倍,即LimitSizei(j+1)=q×LimitSizeij;
所述第i个日志结构合并树LSMTi的内存组件包括内存缓冲区MTi、内容不可变的缓冲区IMTi,二维元数据管理数组FMi,且FMi中包含P×Qij个元素,每个元素是由SST文件的编号、SST文件的大小、SST文件的引用计数、键的最小值、键的最大值,是否垃圾回收的标志字段GC组成的结构体;
所述第i个日志结构合并树LSMTi包含的操作为:FHi操作、Compactioni操作;其中,Compactioni操作分为MinCi操作、MaxCi操作;
FHi操作是指内存缓冲区MTi中的键值数据以SST文件的形式写入磁盘组件的第1层结构Li1中;
MinCi是指第1层结构Li1和第2层结构Li2所选取的SST文件按键排序、合并后划分成新的SST文件后写入Li2;
MaxCi是指第j层结构Lij和第j+1层结构Lij+1所选取的SST文件按键排序、合并后划分成新的SST文件后写入Lij+1;j>1;
所述LSMT监控器用于获取N个日志结构合并树的监控信息并计算分裂指标,令Fi为第i个日志结构合并树LSMTi的分裂指标,Fit为第i个分裂指标的阈值;第i个日志结构合并树LSMTi的监控信息包括:LSMTi所有SST文件所占磁盘空间大小总和Si、磁盘空间大小阈值Sit、读写请求次数RWi,以及所有日志结构合并树的读写请求总数RW;
所述键值存储方法是按如下步骤进行:
步骤1、当前线程利用所述MLSMT结构接收外部的读写数据的请求req,并判断请求req的种类:
若请求req是写请求Write,则执行步骤2,其中,所述写请求Write中的参数包括若干要写入的键值数据<key,value>;
若请求req是读请求Get,则执行步骤2;其中,所述读请求Get中的参数包括若干键数据key;
若请求req是扫描请求Scan,则执行步骤5;其中,所述扫描请求Scan中的参数包括键数据范围(key1,key2);
步骤2、后台线程执行日志结构合并树的分裂指标的计算和分裂;
步骤3、当前线程对请求req中的键key进行哈希运算得到相应的哈希值,所述哈希值对阈值mod进行取模运算后得到中间值hv,其中,mod表示日志结构合并树数量的阈值;
步骤4、当前线程计算用于表示N所需的二进制位数的最小值n,并根据n计算hv的二进制尾部的n位值,再根据n位值计算日志结构合并树的序号i,从而令请求req中的键key属于LSMTi;
若请求req为写请求Write,则执行步骤A1和步骤B1:
A1、将写请求Write中参数对应的键值数据写入MTi,并按照步骤A1.1-A1.5执行;
A1.1、判断第i个日志结构合并树LSMTi的内存缓冲区MTi的大小Msizei是否大于阈值Mmax,若大于,则执行步骤A1.2;否则,将参数<key,value>所对应的键值数据写入到LSMTi的内存缓存区MTi,并执行B1;
A1.2、判断当前日志结构合并树LSMTi的IMTi是否为空,若不为空,则等待,直到Compaction调度器执行FHi操作的调度请求,从而将缓冲区IMTi中所有数据写入磁盘中,使得IMTi变为空,否则,执行A1.3;
A1.3、将IMTi指向当前内存缓冲区MTi,并生成新的空的内存缓冲区,使得MTi指向新的内存缓冲区;
A1.4、当前线程生成FHi操作的调度请求,将请求插入Compaction任务队列中,并返回步骤1,以接收下一个请求req;
A1.5、后台线程利用Compaction调度器执行FHi操作的调度请求,然后生成Compactioni操作的调度请求,并将请求插入Compaction任务队列中,等待Compaction调度器执行Compactioni操作的调度请求;
B1、更新LSMTi的监控信息中的参数Si、RWi、RW,即Si增加写请求Write的键值数据的大小,RWi增加写请求Write的键值数据的数量,并重新计算RW后,返回步骤1,以接收下一个请求req;
若请求req为读请求Get;则执行步骤A2-D2:
A2、更新LSMTi的监控信息中的参数RWi、RW,即RWi增加读请求Get中键key的数量,并重新计算RW的值;
B2、在LSMTi的内存缓冲区MTi中查找读请求Get中的键key,若找到,则返回对应的值value;否则,执行C2;
C2、在LSMTi的内容不可变的内存缓冲区IMTi中查找读请求Get中的键key,若找到,则返回对应的值value;否则,执行D2;
D2、从LSMTi的磁盘组件的第1层结构开始查找读请求Get中的键key,若在任意第j层结构中找到,则返回对应的值value,否则,继续遍历下一层结构,直到查找完第P层结构为止,若始终未找到,则返回空;
步骤5、在MLSMT结构中处理Scan请求,执行步骤A3-C3:
A3、当前线程对MLSMT中的每个日志结构合并树分别建立若干个迭代器,并将所有迭代器划分成G个迭代器组,将每个迭代器组合并为一个MergeIter迭代器;
B3、使用多线程并行处理每个MergeIter迭代器的seek操作,即将每个MergeIter迭代器均指向第一个大于等于扫描请求Scan中键key1的位置;
C3、使用堆排序对所有MergeIter迭代器所指向的位置的键大小进行升序排序,并判断最小键keymin是否大于key2,若大于,返回步骤1,以接收下一个请求req;否则,输出最小键keymin,并将keymin所对应的MergeIter迭代器往键大小的升序方向移动一个位置,更新keymin所对应的Mergeiter迭代器的键大小,再重复执行C3。
本发明所述的多日志结构合并树的键值存储方法的特点也在于,所述步骤2包括:
步骤2.1、根据LSMTi的监控信息、计算分裂指标其中,P1、P2分别代表每部分的权重比例;
步骤2.2、判断Fi<Fit是否成立,若成立,则执行步骤2.3;否则,从LSMTi中分裂出一个新的日志结构合并树LSMTi’,并将LSMTi的二维元数据数组FMi拷贝一份作为分裂出的日志结构合并树LSMTi’的元数据数组FMi’,并更新N为N+1;
步骤2.3、则将i+1赋值给i后,返回步骤2.1,直至i>N,再将1赋值给i,返回步骤2.1执行。
所述步骤D2中是按如下步骤查找读请求Get中的键key:
D2.1、令当前查找的LSMTi的层数为Lij;
若Lij为第1层Li1,则按照SST文件的编号从大到小的顺序遍历FMi数组中第1层Li1中的SST文件,找到满足读请求Get中的键key≥keymin,且key≤keymax的所有SST文件编号num,并执行D2.2;
若Lij为第2层Li2到第P层LiP中的一层,则根据FMi数组中第Lij层元素的键最大值key_max和键最小值key_min,使用二分算法在FMi数组的第Lij层中查找key_min≤键key的大小≤key_max的某个SST文件的编号num,执行D2.2;
D2.2、判断SST文件编号num对应的SST文件是否在LSMTi中,若在,则在当前LSMTi中查找出num对应的SST文件,否则,从分裂出LSMTi的日志结构合并树LSMTs中查找num对应的SST文件;
D2.3、在num对应的SST文件中,使用二分算法查找读请求Get的参数中的键key。
所述步骤A3包括:
A3.1、分别对LSMTi的MTi、IMTi建立内存缓冲区迭代器MTIteri、IMTIteri;
A3.2、在所有日志结构合并树中的任意第i个LSMTi中,执行A3.2.1-A3.2.2;
A3.2.1、从第Li1层结构中找出与扫描请求Scan参数中(key1,key2)范围重叠的SST文件,并在每一个满足的SST文件中建立一个SST文件的迭代器SSTIter;
A3.2.2、建立P层结构中的每一层Lij的迭代器LIterij;j>1;
A3.3、以迭代器遍历的SST文件数量为作为权重,将所有建立的迭代器按照其权重分成G个迭代器组,使得每个迭代器组的权重之和均匀;从而将每一组的所有迭代器合并成一个MergeIter迭代器;其中,G由后台线程数量决定。
所述A1.2中的Compaction调度器是按如下步骤执行FHi操作的调度请求;
A1.2.1、生成LSMTi中第1层结构的新SST文件SSTi1new;
A1.2.2、将IMTi中的键值数据按照SST文件的格式写入SSTi1new;
A1.2.3、记录SSTi1new的元数据信息:SSTi1new文件的编号、SSTi1new文件的大小、键的最小值、键的最大值,将SSTi1new文件的引用计数置为0,垃圾回收标志位置为false;
A1.2.4、将SSTi1new文件的元数据信息插入到LSMTi的FMi数组中。
10、根据权利要求5所述的多日志结构合并树的键值存储方法,其特征是,所述A1.5中的Compaction调度器是按如下步骤执行Compactioni操作的调度请求;
A1.5.1、令Lij为Compactioni操作需要处理的LSMTi的层;
若Compactioni操作是MinCi操作,则处理LSMTi中的第1层Li1,即Lij=Li1;
若Compactioni操作是MaxCi操作,则选取LSMTi中每一层所有SST的大小Sizeij与对应层的大小阈值LimitSizeij的比值最大的一层赋值给Lij;
A1.5.2、根据LSMTi中的FMi数组、第Lij层结构的Compaction位置指针,找到第Lij层结构需要合并的SST文件的编号,然后在第Li(j+1)层结构查找与第Lij层结构的SST文件具有重叠键的范围的所有SST文件的编号;
A1.5.3、根据查找的编号,判断第Lij层、第Li(j+1)层的每一个SST文件是否在LSMTi中,若在,则在当前LSMTi中查找出相应SST文件,否则,从分裂出LSMTi的日志结构合并树LSMTs中查找num对应的SST文件;
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;
A1.5.5、记录第Li(j+1)层中新的SST文件的元数据信息到FMi数组中,并减少FMi数组中在LSMTi中查找到相应编号的文件元数据元素的引用计数,同时将在LSMTs中查找到相应编号的SST文件的元数据元素的垃圾回收标志位置为true。
本发明一种电子设备,包括存储器以及处理器的特点在于,所述存储器用于存储支持处理器执行所述键值存储方法的程序,所述处理器被配置为用于执行所述存储器中存储的程序。
本发明一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序的特点在于,所述计算机程序被处理器运行时执行述键值存储方法的步骤。
与现有技术相比,本发明的有益效果在于:
1、本发明通过计算键key的哈希值,并对哈希值按照设定的最大日志结构合并树数目取模,按照取模后的哈希值的二进制值选择相应的日志结构合并树,实现了数据分树存储,降低单个日志结构合并树的层数,从而降低数据的读写放大,提高系统的读写性能;
2、本发明中设计了Compaction调度器,按照优先级并行化调度处理多个日志结构合并树的Flush操作和Compaction操作,可以充分利用系统的硬件资源,从而加速数据写入和读取,增强了系统的并行性;
3、本发明保留了日志结构合并树的分层有序结构,按照迭代器的权重将迭代器均匀分组,并行处理迭代器的定位Seek操作,使用堆排序算法处理数据的遍历操作,从而有效地避免了哈希结构系统不支持扫描操作或者扫描性能低下的问题,保证了系统功能的完整性;
4、本发明通过LSMT信息监控器监控日志结构合并树的状态,在SST文件中保存键key计算过后的哈希二进制值,拷贝元数据信息、Compaction操作平滑过渡数据的方法,实现了日志结构合并树的分裂,克服了哈希结构迁移数据的性能波动较大的问题,从而保证了系统的整体读写性能不受较大影响,增强了系统的可拓展性;
附图说明
图1为本发明基于多日志结构合并树的键值存储方法整体结构图;
图2为本发明单个日志结构合并树的结构图;
图3为本发明多日志结构合并树读取文件数据过程图;
图4为本发明Comapction操作过程图;
图5为本发明SST文件键值数据条目格式图。
具体实施方式
为将本发明的技术方案描述的更清楚,下面结合附图对本发明的具体实施方式作进一步的详细阐述,在本具体实施方案中,日志结构合并树的数量可以随着日志结构合并树的状态动态改变。
本实施例中,一种基于多日志结构合并树的键值存储方法是应用于设置有MLSMT结构的单个存储节点中,MLSMT结构包括:Compaction调度器、LSMT信息监控器、N个日志结构合并树{LSMT1,LSMT2,…,LSMTi,…,LSMTN},其中,LSMTi表示第i个日志结构合并树;1≤i≤N;如图1所示,图1中给出了有3个LSMT的结构图,各部分的具体描述如下,当存储引擎收到读写请求时,会先哈希计算键key归属的日志结构合并树LSMT,然后将请求中的键值数据插入相应的LSMT中或者从相应的LSMT中读取键值数据,更新相应的LSMT的状态信息;再由LSMT信息监控器监控所有LSMT的状态信息,判断是否需要执行树的分裂;Compaction调度器则完成每一个LSMT的Flush和Compaction调度请求,以及将数据从一个LSMT写入到其分裂出的LSMT;
第i个日志结构合并树LSMTi包含一个磁盘组件和内存组件;以下内容均为日志结构合并树的常用存储引擎如LevelDB、RocksDB实现或者修改而来,本实例是基于存储引擎LevelDB实现的,如图2所示,可以看到单个LSMT中包含的组件和信息。
LSMTi中的磁盘组件包含P个层结构{Li1,Li2,…,Lij,…,Lip},其中,Lij表示第i个日志结构合并树的第j层结构,1≤j≤P;第j层结构Lij包括Qij个SST文件
{SSTij1,SSTij2,…,SSTijk,…,SSTijQij},其中,SSTijk表示第i个日志结构合并树LSMTi的第j层结构Lij的第k个SST文件,1≤k≤Qij;
第k个SST文件SSTijk包含若干键值数据<key,value>,根据第k个SST文件SSTijk中所有键数据key的取值,得到第k个SST文件SSTijk的键范围(keyminijk,keymaxijk),其中,keyminijk表示第k个SST文件SSTijk的键的最小值,keymaxijk表示第k个SST文件SSTijk的键的最大值,除第1层结构Li1的各文件之间键范围有重叠外,其他层结构的各文件之间的键范围无重叠且有序排列;
令第k个SST文件SSTijk中所有键值数据所占磁盘空间大小记为第k个SST文件SSTijk的大小Sizeijk,第j层结构Lij所有SST文件的总大小Sizeij的阈值记为LimitSizeij,j>1,第1层结构的SST文件个数具有阈值LimitNumi;此处阈值LimitNumi即为LevelDB采用的默认大小4;
除第1层结构Li1外,第j+1层结构Li(j+1)中所有SST文件的阈值LimitSizei(j+1)是第j层结构Lij中所有SST文件的阈值LimitSizeij的q倍,即LimitSizei(j+1)=q×LimitSizeij;此处q即为LevelDB中默认的大小10。
第i个日志结构合并树LSMTi的内存组件包括内存缓冲区MTi、内容不可变的缓冲区IMTi,MTi、IMTi即对应LevelDB中的MemTable、ImmutableMemTable,二维元数据管理数组FMi,且FMi中包含P×Qij个元素,每个元素是由SST文件的编号、SST文件的大小、SST文件的引用计数、键的最小值、键的最大值,是否垃圾回收的标志字段GC组成的结构体;此处修改了LevelDB中内存中保存的FileMetaData数组,增加了是否可以垃圾回收的的标志字段GC,用来表示需要分裂到另一个LSMT的数据已经读出,可以在下一次当前LSMT垃圾回收的时候将该SST文件删除。
第i个日志结构合并树LSMTi包含的操作为:FHi操作、FHi操作即为LevelDB中实现的MemTable写入当磁盘的操作Flush,Compactioni操作;其中,Compactioni操作分为MinCi操作、MaxCi操作;Compactioni操作即为LevelDB中实现的合并操作Compaction,即指从第j层结构Lij中选择若干个SST文件,从第j+1层结构Li(j+1)中选取与Lij有键范围重叠的若干SST文件后,将所有SST文件的键值数据按照键key排序,再合并、划分成新的SST文件后写入Li(j+1)中,并按照层数不同分成MinCi操作、MaxCi操作;
FHi操作是指内存缓冲区MTi中的键值数据以SST文件的形式写入磁盘组件的第1层结构Li1中;
MinCi是指第1层结构Li1和第2层结构Li2所选取的SST文件按键排序、合并后划分成新的SST文件后写入Li2;
MaxCi是指第j层结构Lij和第j+1层结构Lij+1所选取的SST文件按键排序、合并后划分成新的SST文件后写入Lij+1;j>1;
LSMT监控器用于获取N个日志结构合并树的监控信息并计算分裂指标,令Fi为第i个日志结构合并树LSMTi的分裂指标,Fit为第i个分裂指标的阈值;Fit阈值默认设置为70%,且技术人员可根据实际情况设置不同的阈值来调优,第i个日志结构合并树LSMTi的监控信息包括:LSMTi所有SST文件所占磁盘空间大小总和Si、磁盘空间大小阈值Sit、读写请求次数RWi,以及所有日志结构合并树的读写请求总数RW;
Si即为LSMTi中所有SST文件大小总和,磁盘空间大小阈值Sit默认设置为50G,技术人员可以根据实际情况设置不同的大小,建议根据系统总数据量与LSMT的数量来决定单个LSMT的阈值,每个LSMT的大小阈值也可以设置为不同值;
键值存储方法是按如下步骤进行:
步骤1、当前线程利用MLSMT结构接收外部的读写数据的请求req,并判断请求req的种类:
若请求req是写请求Write,则执行步骤2,其中,写请求Write中的参数包括若干要写入的键值数据<key,value>;
若请求req是读请求Get,则执行步骤2;其中,读请求Get中的参数包括若干键数据key;
以上Write请求和Get请求中参数包含的数据数量在不同存储引擎中实现可能不同,比如LevelDB只支持单读。
若请求req是扫描请求Scan,则执行步骤5;其中,扫描请求Scan中的参数包括键数据范围(key1,key2);
步骤2、后台线程执行日志结构合并树的分裂指标的计算和分裂;
步骤2.1、根据LSMTi的监控信息、计算分裂指标其中,P1、P2分别代表每部分的权重比例;上述公式前半部分刻画当前LSMT的空间大小是否超过设定的阈值,后半部分则刻画当前LSMT处理的读写请求是否较多,当RWi达到RW/N的两倍时,一个LSMT处理的读写请求较多。其中P1、P2默认设置为0.5、0.25,而分裂指标阈值Fit默认设置为80%,当超过阈值则认为要执行分裂操作,技术人员可以根据实际情况调节上述权重比例和分裂指标阈值的大小。
步骤2.2、判断Fi<Fit是否成立,若成立,则执行步骤2.3;否则,从LSMTi中分裂出一个新的日志结构合并树LSMTi’,并将LSMTi的二维元数据数组FMi拷贝一份作为分裂出的日志结构合并树LSMTi’的元数据数组FMi’,并更新N为N+1;在分裂时,应该暂停当前LSMTi、LSMTi’的写请求,防止属于分裂出的LSMTi’的数据插入到LSMTi中,先在内存中将元数据信息FMi拷贝作为FMi’,然后将MTi、IMTi中属于LSMTi’的数据写入MTi’中,然后恢复写请求。
步骤2.3、则将i+1赋值给i后,返回步骤2.1,直至i>N,再将1赋值给i,返回步骤2.1执行。
步骤3、当前线程对请求req中的键key进行哈希运算得到相应的哈希值,哈希值对阈值mod进行取模运算后得到中间值hv,其中,mod表示日志结构合并树数量的阈值;mod初始设置为128,即可以使用一个字节表示中间值hv,技术人员可以根据实际需要调整。
步骤4、当前线程计算用于表示N所需的二进制位数的最小值n,并根据n计算hv的二进制尾部的n位值,再根据n位值计算日志结构合并树的序号i,从而令请求req中的键key属于LSMTi;假设当前系统如图1所示,具有3个LSMT,则表示N所需二进制位数最小值为2,即00、01、10表示当前三个LSMT,若hv尾部n位二进制值为00、01、10中的一个,则键key归属于对应序号的LSMT;若hv尾部n位二进制值为11,发现11大于当前LSMT的最大序号10,则寻找除了最高位相同的LSMT,即键key归属于序号为01的LSMT。
若请求req为写请求Write,则执行步骤A1和步骤B1:
A1、将写请求Write中参数对应的键值数据写入MTi,并按照步骤A1.1-A1.5执行;
A1.1、判断第i个日志结构合并树LSMTi的内存缓冲区MTi的大小Msizei是否大于阈值Mmax,若大于,则执行步骤A1.2;否则,将参数<key,value>所对应的键值数据写入到LSMTi的内存缓存区MTi,并执行B1;
A1.2、判断当前日志结构合并树LSMTi的IMTi是否为空,若不为空,则等待,直到Compaction调度器执行FHi操作的调度请求,从而将缓冲区IMTi中所有数据写入磁盘中,使得IMTi变为空,否则,执行A1.3;
本实施例中,A1.2中的Compaction调度器是按如下步骤执行FHi操作的调度请求;
A1.2.1、生成LSMTi中第1层结构的新SST文件SSTi1new;
A1.2.2、将IMTi中的键值数据按照SST文件的格式写入SSTi1new;
A1.2.3、记录SSTi1new的元数据信息:SSTi1new文件的编号、SSTi1new文件的大小、键的最小值、键的最大值,将SSTi1new文件的引用计数置为0,垃圾回收标志位置为false;
A1.2.4、将SSTi1new文件的元数据信息插入到LSMTi的FMi数组中。
A1.3、将IMTi指向当前内存缓冲区MTi,并生成新的空的内存缓冲区,使得MTi指向新的内存缓冲区;
上述执行Write请求,将数据写入内存缓冲区中的过程与LevelDB中相同,当MTi满,则转为IMTi,然后触发Flush操作调度请求,由Compaction调度器调度执行。
A1.4、当前线程生成FHi操作的调度请求,将请求插入Compaction任务队列中,并返回步骤1,以接收下一个请求req;
A1.5、后台线程利用Compaction调度器执行FHi操作的调度请求,然后生成Compactioni操作的调度请求,并将请求插入Compaction任务队列中,等待Compaction调度器执行Compactioni操作的调度请求;
后台线程不断在Compaction任务队列中寻找任务,并按照以下优先级顺序由高到低进行调度,即FHi>MinCi>MaxCi、正在执行读写请求的LSMTi中的Compactioni>已经执行过请求LSMTi’的Compactioni;不同LSMT的Comapction任务之间是可以并行执行的,而且不需要考虑数据重叠的问题,可以充分利用磁盘带宽等硬件资源,使写性能得到成倍的提升。
A1.5中的Compaction调度器是按如下步骤执行Compactioni操作的调度请求;
计算LSMTi的第一层的SST文件个数是否大于LimitNumi,若大于,则令Compactioni操作为MinCi操作,执行A1.5.1,否则,计算第2层到第P层每一层的所有SST文件大小Sizeij与对应层的大小阈值LimitSizeij的比值,若存在某层比值大于1,则执行A1.5.1,否则,返回执行下一个调度请求;
A1.5.1、令Lij为Compactioni操作需要处理的LSMTi的层;
若Compactioni操作是MinCi操作,则处理LSMTi中的第1层Li1,即Lij=Li1;
若Compactioni操作是MaxCi操作,则选取LSMTi中每一层所有SST的大小Sizeij与对应层的大小阈值LimitSizeij的比值最大的一层赋值给Lij;
MinCi操作与MaxCi操作只是处理的层数不同,由于第1层SST文件键范围存在重叠,所以一般会读取较多文件,且需要比低层次的Compaction操作优先级更高。
A1.5.2、根据LSMTi中的FMi数组、第Lij层结构的Compaction位置指针,找到第Lij层结构需要合并的SST文件的编号,然后在第Li(j+1)层结构查找与第Lij层结构的SST文件具有重叠键的范围的所有SST文件的编号;Compaction选取合并的SST文件过程与LevelDB中操作相同。
A1.5.3、根据查找的编号,判断第Lij层、第Li(j+1)层的每一个SST文件是否在LSMTi中,若在,则在当前LSMTi中查找出相应SST文件,否则,从分裂出LSMTi的日志结构合并树LSMTs中查找num对应的SST文件;
与Get请求中查找文件相同,文件可能存在于分裂而来的树LSMTs或者分裂出LSMTs的树中,所以需要按照SST位置查找。
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;
与LevelDB中Compaction操作过程相同,需要将Lij层、Li(j+1)层文件读出、按照键大小排序,合并再划分为新的SST文件写入Li(j+1)层。
使用MLSMT结构后,需要Comapction的SST文件可能从不同的树LSMTi、LSMTs中读取,但只需要将属于当前LSMTi的键值数据写入LSMTi中即可,其余LSMTs中的数据在原来的文件中保持不变。上述做法效率低一些,但每次读取的SST文件数更少,对读写请求的影响更小。如图4所示,在Compaction时,需要将位于LSMTi的SST文件SSTi13、位于LSMTs的SST文件SSTi12、SSTi22读出,经过排序等操作划分为新SST文件SSTi23、SSTi24、SSTi25写入Li(j+1)层。
除了上述做法,还有另一种做法,即将所有键值数据读出后,属于LSMTi的数据写入LSMTi的Li(j+1)层,属于LSMTs的数据写回LSMTs中的Ls(j+1)层,但是,在读取需要Comapction的文件时,需要将LSMTs中新的具有范围重叠的文件也读取出来。此种做法效率较高,但每次读取的SST文件更多,与读写请求的影响更大。
此外,判断键值数据归属的日志结构合并树LSMT需要根据键key的哈希值取模之后的n为二进制值,每次计算浪费大量时间。如图5所示,通过修改SST文件中存储的键值数据条目entry的格式,增加部分空间记录n位二进制值,可以解决上述计算开销。
A1.5.5、记录第Li(j+1)层中新的SST文件的元数据信息到FMi数组中,减少FMi数组中在LSMTi中查找到相应编号的文件元数据元素的引用计数,并将在LSMTs中查找到相应编号的SST文件的元数据元素的垃圾回收标志位置为true。
如图4所示,在写回新的SST文件之后并记录元数据信息之后,需要将旧文件SSTi13、SSTi12、SSTi22的引用计数减1,当LSMTi垃圾回收时,可以根据引用计数决定是否将旧文件SSTi13删除。将旧文件SSTi12、SSTi22在FMs中的垃圾回收标志位GC置为true,在LSMTs垃圾回收时,很久引用计数与标志位GC判断是否将旧文件SSTi12、SSTi22删除。
由上述过程,可以将LSMTs中的数据平滑的过渡到LSMTi中,不会像复制迁移数据那样对系统整体读写性能产生剧烈的影响。
B1、更新LSMTi的监控信息中的参数Si、RWi、RW,即Si增加写请求Write的键值数据的大小,RWi增加写请求Write的键值数据的数量,并重新计算RW后,返回步骤1,以接收下一个请求req;
若请求req为读请求Get;则执行步骤A2-D2:
A2、更新LSMTi的监控信息中的参数RWi、RW,即RWi增加读请求Get中键key的数量,并重新计算RW的值;
B2、在LSMTi的内存缓冲区MTi中查找读请求Get中的键key,若找到,则返回对应的值value;否则,执行C2;
C2、在LSMTi的内容不可变的内存缓冲区IMTi中查找读请求Get中的键key,若找到,则返回对应的值value;否则,执行D2;
D2、从LSMTi的磁盘组件的第1层结构开始查找读请求Get中的键key,若在任意第j层结构中找到,则返回对应的值value,否则,继续遍历下一层结构,直到查找完第P层结构为止,若始终未找到,则返回空;
其中,步骤D2中是按如下步骤查找读请求Get中的键key:
D2.1、令当前查找的LSMTi的层数为Lij;
若Lij为第1层Li1,则按照SST文件的编号从大到小的顺序遍历FMi数组中第1层Li1中的SST文件,找到满足读请求Get中的键key≥keymin,且key≤keymax的所有SST文件编号num,并执行D2.2;与LevelDB相同,第1层文件键范围重叠,需要按照SST文件由新到旧的顺序查找所有满足的SST文件。
若Lij为第2层Li2到第P层LiP中的一层,则根据FMi数组中第Lij层元素的键最大值key_max和键最小值key_min,使用二分算法在FMi数组的第Lij层中查找key_min≤键key的大小≤key_max的某个SST文件的编号num,执行D2.2;
D2.2、判断SST文件编号num对应的SST文件是否在LSMTi中,若在,则在当前LSMTi中查找出num对应的SST文件,否则,从分裂出LSMTi的日志结构合并树LSMTs中查找num对应的SST文件;
在当前LSMTi的FMi数组可以找到num对应的SST元数据信息,但LSMTi可能由其他树LSMTs分裂而来,故SST文件可能存在于LSMTs或分裂出LSMTs的日志结构合并树中,需要根据SST位置到不同的LSMT中查找。如图3所示,LSMTi由LSMTs分裂得来,然后新增了文件SSTi13,查找时直接从LSMTi中读出即可,而查找文件SSTi22时,则需要去LSMTs中读出文件。
D2.3、在num对应的SST文件中,使用二分算法查找读请求Get的参数中的键key。
步骤5、在MLSMT结构中处理Scan请求,执行步骤A3-C3:
A3、当前线程对MLSMT中的每个日志结构合并树分别建立若干个迭代器,并将所有迭代器划分成G个迭代器组,将每个迭代器组合并为一个MergeIter迭代器;
LevelDB中的Scan请求是通过对系统中的SST文件等组件建立各种迭代器,然后合并迭代器,再通过迭代器遍历数据实现的。但是,当使用MLSMT结构时,每个LSMT的迭代器数量降低,但总体数量增加,导致Scan请求的性能下降,此时可以选择将系统中的迭代器分组,并行处理来加快Scan请求的处理;
A3.1、分别对LSMTi的MTi、IMTi建立内存缓冲区迭代器MTIteri、IMTIteri;
A3.2、在所有日志结构合并树中的任意第i个LSMTi中,执行A3.2.1-A3.2.2;
A3.2.1、从第Li1层结构中找出与扫描请求Scan参数中(key1,key2)范围重叠的SST文件,并在每一个满足的SST文件中建立一个SST文件的迭代器SSTIter;
A3.2.2、建立P层结构中的每一层Lij的迭代器LIterij;j>1;
上述所建立的各种迭代器与LevelDB中的迭代器相同,内存缓冲区的迭代器,第1层中相关SST文件的迭代器,第2层及以后各层建立层迭代器。
A3.3、以迭代器遍历的SST文件数量为作为权重,将所有建立的迭代器按照其权重分成G个迭代器组,使得每个迭代器组的权重之和均匀;从而将每一组的所有迭代器合并成一个MergeIter迭代器;其中,G由后台线程数量决定。
迭代器的权重是由处理其Seek操作时耗费的时间决定的,所以需要查询的文件数越多,花费时间越多,故一般层数越深的迭代器权重越高,即Literi(j+1)>Literij>SSTIter,IMTIteri,MTIteri;但由于二分查找可以大大缩减查询的时间,故可以直接按照个数均分迭代器。
B3、使用多线程并行处理每个MergeIter迭代器的seek操作,即将每个MergeIter迭代器均指向第一个大于等于扫描请求Scan中键key1的位置;
C3、使用堆排序对所有MergeIter迭代器所指向的位置的键大小进行升序排序,并判断最小键keymin是否大于key2,若大于,返回步骤1,以接收下一个请求req;否则,输出最小键keymin,并将keymin所对应的MergeIter迭代器往键大小的升序方向移动一个位置,更新keymin所对应的Mergeiter迭代器的键大小,再重复执行C3。
本实施例中,一种电子设备,包括存储器以及处理器,该存储器用于存储支持处理器执行上述方法的程序,该处理器被配置为用于执行该存储器中存储的程序。
本实施例中,一种计算机可读存储介质,是在计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法的步骤。
Claims (8)
1.一种基于多日志结构合并树的键值存储方法,其特征是应用于设置有MLSMT结构的单个存储节点中,所述MLSMT结构包括:Compaction调度器、LSMT信息监控器、N个日志结构合并树{LSMT1,LSMT2,…,LSMTi,…,LSMTN},其中,LSMTi表示第i个日志结构合并树;1≤i≤N;
所述第i个日志结构合并树LSMTi包含一个磁盘组件和内存组件;
LSMTi中的磁盘组件包含P个层结构{Li1,Li2,…,Lij,…,Lip},其中,Lij表示第i个日志结构合并树的第j层结构,1≤j≤P;第j层结构Lij包括Qij个SST文件
{SSTij1,SSTij2,…,SSTijk,…,SSTijQij},其中,SSTijk表示第i个日志结构合并树LSMTi的第j层结构Lij的第k个SST文件,1≤k≤Qij;
第k个SST文件SSTijk包含若干键值数据<key,value>,根据第k个SST文件SSTijk中所有键数据key的取值,得到第k个SST文件SSTijk的键范围(keyminijk,keymaxijk),其中,keyminijk表示第k个SST文件SSTijk的键的最小值,keymaxijk表示第k个SST文件SSTijk的键的最大值,除第1层结构Li1的各文件之间键范围有重叠外,其他层结构的各文件之间的键范围无重叠且有序排列;
令第k个SST文件SSTijk中所有键值数据所占磁盘空间大小记为第k个SST文件SSTijk的大小Sizeijk,第j层结构Lij所有SST文件的总大小Sizeij的阈值记为LimitSizeij,j>1,第1层结构的SST文件个数具有阈值LimitNumi;
除第1层结构Li1外,第j+1层结构Li(j+1)中所有SST文件的阈值LimitSizei(j+1)是第j层结构Lij中所有SST文件的阈值LimitSizeij的q倍,即LimitSizei(j+1)=q×LimitSizeij;
所述第i个日志结构合并树LSMTi的内存组件包括内存缓冲区MTi、内容不可变的缓冲区IMTi,二维元数据管理数组FMi,且FMi中包含P×Qij个元素,每个元素是由SST文件的编号、SST文件的大小、SST文件的引用计数、键的最小值、键的最大值,是否垃圾回收的标志字段GC组成的结构体;
所述第i个日志结构合并树LSMTi包含的操作为:FHi操作、Compactioni操作;其中,Compactioni操作分为MinCi操作、MaxCi操作;
FHi操作是指内存缓冲区MTi中的键值数据以SST文件的形式写入磁盘组件的第1层结构Li1中;
MinCi是指第1层结构Li1和第2层结构Li2所选取的SST文件按键排序、合并后划分成新的SST文件后写入Li2;
MaxCi是指第j层结构Lij和第j+1层结构Lij+1所选取的SST文件按键排序、合并后划分成新的SST文件后写入Lij+1;j>1;
所述LSMT监控器用于获取N个日志结构合并树的监控信息并计算分裂指标,令Fi为第i个日志结构合并树LSMTi的分裂指标,Fit为第i个分裂指标的阈值;第i个日志结构合并树LSMTi的监控信息包括:LSMTi所有SST文件所占磁盘空间大小总和Si、磁盘空间大小阈值Sit、读写请求次数RWi,以及所有日志结构合并树的读写请求总数RW;
所述键值存储方法是按如下步骤进行:
步骤1、当前线程利用所述MLSMT结构接收外部的读写数据的请求req,并判断请求req的种类:
若请求req是写请求Write,则执行步骤2,其中,所述写请求Write中的参数包括若干要写入的键值数据<key,value>;
若请求req是读请求Get,则执行步骤2;其中,所述读请求Get中的参数包括若干键数据key;
若请求req是扫描请求Scan,则执行步骤5;其中,所述扫描请求Scan中的参数包括键数据范围(key1,key2);
步骤2、后台线程执行日志结构合并树的分裂指标的计算和分裂;
步骤3、当前线程对请求req中的键key进行哈希运算得到相应的哈希值,所述哈希值对阈值mod进行取模运算后得到中间值hv,其中,mod表示日志结构合并树数量的阈值;
步骤4、当前线程计算用于表示N所需的二进制位数的最小值n,并根据n计算hv的二进制尾部的n位值,再根据n位值计算日志结构合并树的序号i,从而令请求req中的键key属于LSMTi;
若请求req为写请求Write,则执行步骤A1和步骤B1:
A1、将写请求Write中参数对应的键值数据写入MTi,并按照步骤A1.1-A1.5执行;
A1.1、判断第i个日志结构合并树LSMTi的内存缓冲区MTi的大小Msizei是否大于阈值Mmax,若大于,则执行步骤A1.2;否则,将参数<key,value>所对应的键值数据写入到LSMTi的内存缓存区MTi,并执行B1;
A1.2、判断当前日志结构合并树LSMTi的IMTi是否为空,若不为空,则等待,直到Compaction调度器执行FHi操作的调度请求,从而将缓冲区IMTi中所有数据写入磁盘中,使得IMTi变为空,否则,执行A1.3;
A1.3、将IMTi指向当前内存缓冲区MTi,并生成新的空的内存缓冲区,使得MTi指向新的内存缓冲区;
A1.4、当前线程生成FHi操作的调度请求,将请求插入Compaction任务队列中,并返回步骤1,以接收下一个请求req;
A1.5、后台线程利用Compaction调度器执行FHi操作的调度请求,然后生成Compactioni操作的调度请求,并将请求插入Compaction任务队列中,等待Compaction调度器执行Compactioni操作的调度请求;
B1、更新LSMTi的监控信息中的参数Si、RWi、RW,即Si增加写请求Write的键值数据的大小,RWi增加写请求Write的键值数据的数量,并重新计算RW后,返回步骤1,以接收下一个请求req;
若请求req为读请求Get;则执行步骤A2-D2:
A2、更新LSMTi的监控信息中的参数RWi、RW,即RWi增加读请求Get中键key的数量,并重新计算RW的值;
B2、在LSMTi的内存缓冲区MTi中查找读请求Get中的键key,若找到,则返回对应的值value;否则,执行C2;
C2、在LSMTi的内容不可变的内存缓冲区IMTi中查找读请求Get中的键key,若找到,则返回对应的值value;否则,执行D2;
D2、从LSMTi的磁盘组件的第1层结构开始查找读请求Get中的键key,若在任意第j层结构中找到,则返回对应的值value,否则,继续遍历下一层结构,直到查找完第P层结构为止,若始终未找到,则返回空;
步骤5、在MLSMT结构中处理Scan请求,执行步骤A3-C3:
A3、当前线程对MLSMT中的每个日志结构合并树分别建立若干个迭代器,并将所有迭代器划分成G个迭代器组,将每个迭代器组合并为一个MergeIter迭代器;
B3、使用多线程并行处理每个MergeIter迭代器的seek操作,即将每个MergeIter迭代器均指向第一个大于等于扫描请求Scan中键key1的位置;
C3、使用堆排序对所有MergeIter迭代器所指向的位置的键大小进行升序排序,并判断最小键keymin是否大于key2,若大于,返回步骤1,以接收下一个请求req;否则,输出最小键keymin,并将keymin所对应的MergeIter迭代器往键大小的升序方向移动一个位置,更新keymin所对应的Mergeiter迭代器的键大小,再重复执行C3。
2.根据权利要求1所述的多日志结构合并树的键值存储方法,其特征是,所述步骤2包括:
步骤2.1、根据LSMTi的监控信息、计算分裂指标其中,P1、P2分别代表每部分的权重比例;
步骤2.2、判断Fi<Fit是否成立,若成立,则执行步骤2.3;否则,从LSMTi中分裂出一个新的日志结构合并树LSMTi’,并将LSMTi的二维元数据数组FMi拷贝一份作为分裂出的日志结构合并树LSMTi’的元数据数组FMi’,并更新N为N+1;
步骤2.3、则将i+1赋值给i后,返回步骤2.1,直至i>N,再将1赋值给i,返回步骤2.1执行。
3.根据权利要求2所述的多日志结构合并树的键值存储方法,其特征是,所述步骤D2中是按如下步骤查找读请求Get中的键key:
D2.1、令当前查找的LSMTi的层数为Lij;
若Lij为第1层Li1,则按照SST文件的编号从大到小的顺序遍历FMi数组中第1层Li1中的SST文件,找到满足读请求Get中的键key≥keymin,且key≤keymax的所有SST文件编号num,并执行D2.2;
若Lij为第2层Li2到第P层LiP中的一层,则根据FMi数组中第Lij层元素的键最大值key_max和键最小值key_min,使用二分算法在FMi数组的第Lij层中查找key_min≤键key的大小≤key_max的某个SST文件的编号num,执行D2.2;
D2.2、判断SST文件编号num对应的SST文件是否在LSMTi中,若在,则在当前LSMTi中查找出num对应的SST文件,否则,从分裂出LSMTi的日志结构合并树LSMTs中查找num对应的SST文件;
D2.3、在num对应的SST文件中,使用二分算法查找读请求Get的参数中的键key。
4.根据权利要求3所述的多日志结构合并树的键值存储方法,其特征是,所述步骤A3包括:
A3.1、分别对LSMTi的MTi、IMTi建立内存缓冲区迭代器MTIteri、IMTIteri;
A3.2、在所有日志结构合并树中的任意第i个LSMTi中,执行A3.2.1-A3.2.2;
A3.2.1、从第Li1层结构中找出与扫描请求Scan参数中(key1,key2)范围重叠的SST文件,并在每一个满足的SST文件中建立一个SST文件的迭代器SSTIter;
A3.2.2、建立P层结构中的每一层Lij的迭代器LIterij;j>1;
A3.3、以迭代器遍历的SST文件数量为作为权重,将所有建立的迭代器按照其权重分成G个迭代器组,使得每个迭代器组的权重之和均匀;从而将每一组的所有迭代器合并成一个MergeIter迭代器;其中,G由后台线程数量决定。
5.根据权利要求4所述的多日志结构合并树的键值存储方法,其特征是,所述A1.2中的Compaction调度器是按如下步骤执行FHi操作的调度请求;
A1.2.1、生成LSMTi中第1层结构的新SST文件SSTi1new;
A1.2.2、将IMTi中的键值数据按照SST文件的格式写入SSTi1new;
A1.2.3、记录SSTi1new的元数据信息:SSTi1new文件的编号、SSTi1new文件的大小、键的最小值、键的最大值,将SSTi1new文件的引用计数置为0,垃圾回收标志位置为false;
A1.2.4、将SSTi1new文件的元数据信息插入到LSMTi的FMi数组中。
6.根据权利要求5所述的多日志结构合并树的键值存储方法,其特征是,所述A1.5中的Compaction调度器是按如下步骤执行Compactioni操作的调度请求;
A1.5.1、令Lij为Compactioni操作需要处理的LSMTi的层;
若Compactioni操作是MinCi操作,则处理LSMTi中的第1层Li1,即Lij=Li1;
若Compactioni操作是MaxCi操作,则选取LSMTi中每一层所有SST的大小Sizeij与对应层的大小阈值LimitSizeij的比值最大的一层赋值给Lij;
A1.5.2、根据LSMTi中的FMi数组、第Lij层结构的Compaction位置指针,找到第Lij层结构需要合并的SST文件的编号,然后在第Li(j+1)层结构查找与第Lij层结构的SST文件具有重叠键的范围的所有SST文件的编号;
A1.5.3、根据查找的编号,判断第Lij层、第Li(j+1)层的每一个SST文件是否在LSMTi中,若在,则在当前LSMTi中查找出相应SST文件,否则,从分裂出LSMTi的日志结构合并树LSMTs中查找num对应的SST文件;
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;
A1.5.5、记录第Li(j+1)层中新的SST文件的元数据信息到FMi数组中,并减少FMi数组中在LSMTi中查找到相应编号的文件元数据元素的引用计数,同时将在LSMTs中查找到相应编号的SST文件的元数据元素的垃圾回收标志位置为true。
7.一种电子设备,包括存储器以及处理器,其特征在于,所述存储器用于存储支持处理器执行权利要求1-6中任一所述键值存储方法的程序,所述处理器被配置为用于执行所述存储器中存储的程序。
8.一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,其特征在于,所述计算机程序被处理器运行时执行权利要求1-6中任一所述键值存储方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311545478.8A CN117573634A (zh) | 2023-11-20 | 2023-11-20 | 一种基于多日志结构合并树的键值存储方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202311545478.8A CN117573634A (zh) | 2023-11-20 | 2023-11-20 | 一种基于多日志结构合并树的键值存储方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN117573634A true CN117573634A (zh) | 2024-02-20 |
Family
ID=89883848
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311545478.8A Pending CN117573634A (zh) | 2023-11-20 | 2023-11-20 | 一种基于多日志结构合并树的键值存储方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117573634A (zh) |
-
2023
- 2023-11-20 CN CN202311545478.8A patent/CN117573634A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8108355B2 (en) | Providing a partially sorted index | |
KR100886189B1 (ko) | 데이터 베이스 | |
US5852826A (en) | Parallel merge sort method and apparatus | |
EP0375188B1 (en) | File system | |
KR940005775B1 (ko) | 디스크 파일 개방 방법 | |
CN110083601A (zh) | 面向键值存储系统的索引树构建方法及系统 | |
AU2002222096A1 (en) | Method of organising, interrogating and navigating a database | |
JP4071816B1 (ja) | 合成関係演算を利用したマルチオペレーション・プロセッシングを用いたデータベースのクエリー処理システム | |
Lomet | A simple bounded disorder file organization with good performance | |
JP2023543004A (ja) | ヒルベルト曲線に基づくr木インデックスのマージ更新方法、装置及び媒体 | |
CN113253932B (zh) | 一种分布式存储系统的读写控制方法和系统 | |
CN114416646A (zh) | 一种层级存储系统的数据处理方法及装置 | |
CN117573634A (zh) | 一种基于多日志结构合并树的键值存储方法 | |
WO2015129109A1 (ja) | インデックス管理装置 | |
US20210209087A1 (en) | Reorganization of Databases by Sectioning | |
US10169250B2 (en) | Method and apparatus method and apparatus for controlling access to a hash-based disk | |
CN113779024B (zh) | 一种面向近数据处理架构下键值存储系统的异步并行优化方法 | |
IL157385A (en) | Organising data in a database | |
US11853577B2 (en) | Tree structure node compaction prioritization | |
JPS62287350A (ja) | インデツクス一括更新方式 | |
Fritchey | Dealing with Index Fragmentation | |
JPH0267648A (ja) | ツリー構造データベースのレコード追加方式 | |
KR20230092443A (ko) | 다중 버전 동시성제어 데이터베이스 시스템에서 신속한 데이터 버전 탐색 방법 및 장치 | |
CN117891796A (zh) | 一种适用于多读少写场景的hdfs海量小文件存储方法 | |
Orsborn | DATABASE TECHNOLOGY-1DL124 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |